From 3a6be8eaf948126c24cc3c6b365f77b5c3b15eb3 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 18:12:44 +0000 Subject: [PATCH 01/33] Import Local and global class field theory with source attribution and complete production scope --- LeanPool.lean | 1817 ++++++++++ LeanPool/ClassFieldTheory.lean | 1672 +++++++++ .../ClassFieldTheory/ClassFieldTheory.lean | 22 + .../AbstractClassFieldTheory.lean | 11 + .../AbstractClassFieldTheory/All.lean | 21 + .../AbstractClassFieldTheory/Degree.lean | 22 + .../AbstractClassFieldTheory/Degree/All.lean | 25 + .../Degree/Fields.lean | 1312 +++++++ .../Degree/Frobenius.lean | 336 ++ .../Degree/FrobeniusFixedField.lean | 1137 +++++++ .../Degree/FrobeniusLift.lean | 227 ++ .../Degree/Indices.lean | 313 ++ .../AbstractClassFieldTheory/Degree/Norm.lean | 176 + .../Degree/NormConjugation.lean | 297 ++ .../Degree/NormLaws.lean | 460 +++ .../Degree/PadicCyclicClosure.lean | 406 +++ .../Degree/PrimeElements.lean | 218 ++ .../ProfiniteIntegerFiniteQuotient.lean | 368 ++ .../Degree/Valuation.lean | 327 ++ .../Degree/ValuationLaws.lean | 205 ++ .../AbstractClassFieldTheory/Reciprocity.lean | 32 + .../Reciprocity/All.lean | 35 + .../Reciprocity/ClassField.lean | 212 ++ .../Reciprocity/ClassFieldAxiom.lean | 100 + .../Reciprocity/ClassFieldCandidate.lean | 363 ++ .../Reciprocity/Construction.lean | 46 + .../Reciprocity/Construction/All.lean | 49 + .../CanonicalUnramifiedNormQuotient.lean | 281 ++ .../ChosenDegreeOneFrobenius.lean | 79 + .../Construction/CoreFrobeniusNorm.lean | 1287 +++++++ .../DoubleCosetOrbitGeometry.lean | 410 +++ .../Construction/FiniteFieldUnitMaps.lean | 248 ++ .../FiniteIntermediateCompositum.lean | 68 + .../FiniteIntermediateFieldCompositum.lean | 82 + .../Construction/FiniteNormQuotient.lean | 308 ++ .../FixedTowerUnitCorrection.lean | 307 ++ .../Construction/FixedTowerUnitDescent.lean | 653 ++++ .../FrobeniusClosureCommutation.lean | 174 + .../Construction/FrobeniusDescent.lean | 251 ++ .../Construction/FrobeniusField.lean | 725 ++++ .../FrobeniusFixedFieldAction.lean | 319 ++ .../FrobeniusFixedFieldTower.lean | 443 +++ .../FrobeniusPowerFixedField.lean | 700 ++++ .../FrobeniusQuotientDescent.lean | 510 +++ .../Construction/FrobeniusSemigroup.lean | 98 + .../Construction/InfiniteUnitDescent.lean | 508 +++ .../InfiniteUnitNormSubgroup.lean | 159 + .../Construction/MainFiniteReciprocity.lean | 1197 +++++++ .../Construction/MainMultiplicativity.lean | 17 + .../MainMultiplicativity/All.lean | 20 + .../ConjugatePrimeNorm.lean | 222 ++ .../MainMultiplicativity/CorrectionSum.lean | 103 + .../FiniteStageCorrections.lean | 287 ++ .../FrobeniusActionRemainder.lean | 421 +++ .../FrobeniusPowerSumRelation.lean | 167 + .../NormClassRelation.lean | 278 ++ .../PrimeUnitDifferences.lean | 258 ++ .../ReciprocityMapMul.lean | 250 ++ .../Construction/MainNaturality.lean | 1580 +++++++++ .../Construction/MainTransfer.lean | 1297 +++++++ .../Construction/MainTransferFrobenius.lean | 1662 +++++++++ .../MainTransferFrobeniusGeometry.lean | 492 +++ .../Construction/NormSubgroup.lean | 419 +++ .../Reciprocity/Construction/PrimeChoice.lean | 72 + .../Construction/ReciprocityDefinition.lean | 192 ++ .../Construction/ReciprocityIndependence.lean | 555 +++ .../Construction/RelativeNormDoubleCoset.lean | 303 ++ .../Construction/TransferNaturality.lean | 279 ++ .../Construction/TransferOrbitClosure.lean | 135 + .../Construction/UnitCohomologyAxiom.lean | 510 +++ .../Reciprocity/Construction/Universal.lean | 683 ++++ .../Construction/UniversalNormDescent.lean | 286 ++ .../Construction/UnramifiedNormQuotient.lean | 489 +++ .../Reciprocity/Core.lean | 1270 +++++++ .../Reciprocity/CyclicNormQuotient.lean | 605 ++++ .../Reciprocity/FieldRepresentation.lean | 141 + .../FiniteAbelianClassification.lean | 954 ++++++ .../FiniteAbelianSubextension.lean | 474 +++ .../Reciprocity/FiniteGaloisSubextension.lean | 479 +++ .../Reciprocity/IntermediateExtension.lean | 609 ++++ .../Reciprocity/Main.lean | 1576 +++++++++ .../MaximalUnramifiedReciprocity.lean | 120 + .../Reciprocity/MaximalUnramifiedSymbol.lean | 594 ++++ .../Reciprocity/NormContinuity.lean | 95 + .../Reciprocity/NormTopology.lean | 325 ++ .../NormTopologyCharacterization.lean | 61 + .../Reciprocity/ProfiniteAPI.lean | 60 + .../Reciprocity/Reduction.lean | 846 +++++ .../Reciprocity/Sylow.lean | 179 + .../Reciprocity/TotallyRamified.lean | 442 +++ .../Reciprocity/TotallyRamifiedCase.lean | 15 + .../Reciprocity/TotallyRamifiedCase/All.lean | 18 + .../TotallyRamifiedCase/Conclusion.lean | 304 ++ .../TotallyRamifiedCase/FixedSource.lean | 546 +++ .../TotallyRamifiedCase/FrobeniusLift.lean | 342 ++ .../TotallyRamifiedCase/FrobeniusNorms.lean | 464 +++ .../RestrictionCosets.lean | 443 +++ .../TotallyRamifiedCase/RestrictionEquiv.lean | 170 + .../Reciprocity/ValuationContinuity.lean | 422 +++ .../ClassFieldTheory/Algebra.lean | 11 + .../Algebra/AbelianGaloisEquiv.lean | 114 + ...initeAbelianIntermediateFieldAlgEquiv.lean | 53 + .../IntermediateFieldAlgEquivOrderIso.lean | 49 + .../AlgebraicNumberTheory.lean | 25 + .../AlgebraicNumberTheory/Adele.lean | 18 + .../AlgebraicNumberTheory/Adele/All.lean | 16 + .../Adele/Coordinates.lean | 178 + .../Adele/FinitePlaceTensorBlock.lean | 263 ++ .../FiniteRestrictedProductBaseChange.lean | 596 ++++ .../Adele/InfinitePlaceTensorBlock.lean | 296 ++ .../Adele/IntegralLocalFactor.lean | 637 ++++ .../Adele/IntegralTensorSupport.lean | 15 + .../IntegralTensorSupport/AbsoluteValue.lean | 256 ++ .../Adele/IntegralTensorSupport/All.lean | 18 + .../FinitePlaceCompletion.lean | 359 ++ .../IntegralTensorSupport/IdeleSupport.lean | 79 + .../Adele/IntegralTensorSupport/Lattice.lean | 559 +++ .../LocalTensorDecomposition.lean | 722 ++++ .../IntegralTensorSupport/Localization.lean | 213 ++ .../Adele/LocalComponents.lean | 204 ++ .../Adele/RestrictedAction.lean | 368 ++ .../Adele/RestrictedProduct.lean | 627 ++++ .../AdeleBaseChange.lean | 1110 ++++++ .../AlgebraicNumberTheory/All.lean | 32 + .../AlgebraicNumberTheory/Completion.lean | 18 + .../Completion/AdicCompletionComparison.lean | 403 +++ .../Completion/AdicCompletionMap.lean | 207 ++ .../AlgebraicNumberTheory/Completion/All.lean | 16 + .../Completion/ChosenLocalization.lean | 358 ++ .../Completion/Comparison.lean | 448 +++ .../Completion/ExtensionIndex.lean | 730 ++++ .../FinitePlaceAdicCompletionCongrEquiv.lean | 74 + .../Completion/IntegerRingComparison.lean | 588 ++++ .../Completion/LocalizedValuation.lean | 513 +++ .../Completion/UnramifiedComparison.lean | 13 + .../Completion/UnramifiedComparison/All.lean | 11 + .../CompletionToIdeal.lean | 400 +++ .../IdealToCompletion.lean | 515 +++ .../UnramifiedComparison/LocalNorm.lean | 129 + .../RamificationIndex.lean | 290 ++ .../CompositumEmbedding.lean | 206 ++ .../FiniteAbelianCompositum.lean | 271 ++ .../AlgebraicNumberTheory/Galois.lean | 20 + .../Galois/AbsoluteAbelianization.lean | 174 + .../AlgebraicNumberTheory/Galois/All.lean | 18 + .../Galois/CyclicPrimeDegreeSubextension.lean | 240 ++ .../Galois/CyclicPrimeSubextension.lean | 815 +++++ .../Galois/FixedFieldLattice.lean | 45 + .../Galois/InfiniteBaseChange.lean | 130 + .../Galois/MathlibAbsoluteAbelianization.lean | 41 + .../MathlibAbsoluteGaloisBaseEquiv.lean | 94 + .../Galois/MaximalAbelianSubextension.lean | 135 + .../Galois/NormalFieldRange.lean | 41 + .../Galois/RelativeAbelianization.lean | 92 + .../Galois/UnboundedDegree.lean | 76 + .../AlgebraicNumberTheory/Idele.lean | 35 + .../AlgebraicNumberTheory/Idele/All.lean | 38 + .../Idele/BaseChange.lean | 592 ++++ .../AlgebraicNumberTheory/Idele/Basic.lean | 164 + .../Idele/ClassGroup.lean | 25 + .../Idele/ClassGroup/AlgEquiv.lean | 1554 +++++++++ .../ClassGroup/AlgEquivAdeleTopology.lean | 81 + .../ClassGroup/AlgEquivFiniteIntegral.lean | 57 + .../AlgEquivIdeleClassTopology.lean | 94 + .../Idele/ClassGroup/AlgEquivTopology.lean | 33 + .../Idele/ClassGroup/All.lean | 28 + .../Idele/ClassGroup/BaseChange.lean | 422 +++ .../ConnectedComponentQuotientCongr.lean | 92 + .../Idele/ClassGroup/Core.lean | 167 + .../Idele/ClassGroup/InfiniteAlgEquiv.lean | 231 ++ .../Idele/ClassGroup/MathlibComparison.lean | 113 + .../ClassGroup/MathlibTopologyComparison.lean | 54 + .../Idele/ClassGroup/NormComparison.lean | 210 ++ .../Idele/ClassGroup/NormalClosureNorm.lean | 78 + .../Idele/ClassGroup/Tower.lean | 721 ++++ .../ClassGroup/TowerAlgEquivNaturality.lean | 459 +++ .../Idele/ClassGroup/TowerBaseChange.lean | 1063 ++++++ .../Idele/Cohomology.lean | 14 + .../Idele/Cohomology/All.lean | 12 + .../Idele/Cohomology/Decomposition.lean | 535 +++ .../Idele/Cohomology/Herbrand.lean | 640 ++++ .../Cohomology/HerbrandExactSequence.lean | 264 ++ .../Idele/Cohomology/SPlaces.lean | 13 + .../Idele/Cohomology/SPlaces/All.lean | 11 + .../Idele/Cohomology/SPlaces/Herbrand.lean | 13 + .../Cohomology/SPlaces/Herbrand/All.lean | 16 + .../Cohomology/SPlaces/Herbrand/Factors.lean | 377 +++ .../SPlaces/Herbrand/FamilyCardinality.lean | 242 ++ .../SPlaces/Herbrand/FamilyFinite.lean | 174 + .../Cohomology/SPlaces/Herbrand/Local.lean | 324 ++ .../Idele/Cohomology/SPlaces/LocalBlocks.lean | 255 ++ .../SPlaces/OutsideIntegralInduced.lean | 19 + .../SPlaces/OutsideIntegralInduced/All.lean | 22 + .../OutsideIntegralInduced/ChosenPlace.lean | 323 ++ .../ChosenPlaceAction.lean | 231 ++ .../ChosenPlaceIntegralBlock.lean | 124 + .../ChosenPlaceIntegralBlockEquiv.lean | 63 + .../ChosenPlaceIntegralBlockEquivApply.lean | 64 + .../ChosenPlaceIntegralBlockInclusion.lean | 82 + .../ChosenPlaceIntegralBlockInducedSmul.lean | 54 + .../ChosenPlaceIntegralBlockTensorSmul.lean | 94 + .../CompletionTransport.lean | 133 + .../LocalInduction.lean | 13 + .../LocalInduction/Action.lean | 90 + .../LocalInduction/All.lean | 16 + .../LocalInduction/Equiv.lean | 115 + .../LocalInduction/Inclusion.lean | 177 + .../LocalInduction/Spine.lean | 159 + .../Cohomology/SPlaces/Reassociation.lean | 265 ++ .../Idele/Cohomology/SupportedBridge.lean | 532 +++ .../Idele/Extension.lean | 24 + .../Idele/Extension/All.lean | 27 + .../Idele/Extension/BaseChange.lean | 487 +++ .../Idele/Extension/ClassGroup.lean | 200 ++ .../Idele/Extension/EmbeddingNorm.lean | 576 ++++ .../Idele/Extension/GaloisDescent.lean | 254 ++ .../Idele/Extension/GaloisNorm.lean | 347 ++ .../Idele/Extension/IdealClass.lean | 891 +++++ .../Idele/Extension/IdeleClassBaseChange.lean | 104 + .../Idele/Extension/IdeleNorm.lean | 92 + .../Idele/Extension/IdeleNormComponents.lean | 1028 ++++++ .../Extension/InfiniteOnePlaceBaseNorm.lean | 301 ++ .../Idele/Extension/LocalComponent.lean | 403 +++ .../Idele/Extension/LocalNorm.lean | 111 + .../Idele/Extension/NormLocalOrder.lean | 457 +++ .../Idele/Extension/NormProperties.lean | 63 + .../Idele/Extension/OnePlaceBaseNorm.lean | 312 ++ .../FiniteMathlibTopologyComparison.lean | 128 + .../Idele/FinitePrime.lean | 106 + .../AlgebraicNumberTheory/Idele/IdealMap.lean | 422 +++ .../Idele/IdentityComponent.lean | 246 ++ .../Idele/LocallyCompact.lean | 292 ++ .../AlgebraicNumberTheory/Idele/Norm.lean | 240 ++ .../Idele/NormApproximation.lean | 11 + .../Idele/NormApproximation/All.lean | 9 + .../Idele/NormApproximation/FinitePlaces.lean | 522 +++ .../NormApproximation/InfinitePlaces.lean | 265 ++ .../AlgebraicNumberTheory/Idele/NormCore.lean | 119 + .../Idele/NormOneCompact.lean | 815 +++++ .../Idele/NormTopology.lean | 15 + .../Idele/NormTopology/All.lean | 13 + .../Idele/NormTopology/ArchimedeanNorm.lean | 402 +++ .../Idele/NormTopology/Continuity.lean | 725 ++++ .../Idele/NormTopology/ExtensionBehavior.lean | 382 +++ .../NormTopology/FiniteNormArithmetic.lean | 494 +++ .../Idele/NormTopology/IdeleClassNorm.lean | 87 + .../Idele/NormTopology/NormOne.lean | 64 + .../Idele/PositiveArchimedeanSection.lean | 450 +++ .../Idele/Principal.lean | 211 ++ .../Idele/PrincipalCore.lean | 77 + .../Idele/PrincipalNorm.lean | 305 ++ .../Idele/PrincipalTopology.lean | 226 ++ .../AlgebraicNumberTheory/Idele/Relative.lean | 14 + .../Idele/Relative/All.lean | 12 + .../Relative/FiniteIntegralNormPreimage.lean | 883 +++++ .../Idele/Relative/FinitePlaceTensorNorm.lean | 299 ++ .../Relative/InfinitePlaceTensorNorm.lean | 208 ++ .../Idele/Relative/SPlaces.lean | 790 +++++ .../Idele/Relative/Support.lean | 480 +++ .../Idele/RestrictedProductUnitsTopology.lean | 144 + .../AlgebraicNumberTheory/Idele/SPlaces.lean | 174 + .../Idele/SinglePlace.lean | 559 +++ .../Idele/SufficientlyLarge.lean | 142 + .../AlgebraicNumberTheory/Idele/Topology.lean | 96 + .../AlgebraicNumberTheory/NormalClosure.lean | 140 + .../AlgebraicNumberTheory/NumberField.lean | 25 + .../NumberField/All.lean | 23 + .../NumberField/CompletelySplitFinset.lean | 86 + .../NumberField/CompletelySplitPrimes.lean | 108 + .../CompletelySplitPrimesModFour.lean | 99 + .../NumberField/DegreeOnePrimes.lean | 95 + .../EverywhereUnramifiedTower.lean | 94 + .../FiniteUnramifiedEtaleBridge.lean | 82 + .../NumberField/FiniteUnramifiedTower.lean | 173 + .../NumberField/GaloisDifferentBound.lean | 65 + .../NumberField/IntegralPrimitiveElement.lean | 101 + .../MathlibUnramifiedInterface.lean | 157 + .../NumberField/PlaceEquiv.lean | 57 + .../NumberField/RootDiscriminantBound.lean | 36 + .../NumberField/SchurPrimeDivisors.lean | 113 + .../NumberField/SmallModel.lean | 38 + .../SupportedDiscriminantBound.lean | 109 + .../NumberField/TameDifferentTrace.lean | 94 + .../PowerResidueSymbols.lean | 11 + .../PowerResidueSymbols/All.lean | 9 + .../PowerResidueSymbols/FiniteField.lean | 110 + .../PowerResidueSymbols/Ideal.lean | 603 ++++ .../QuadraticReciprocity.lean | 241 ++ .../AlgebraicNumberTheory/Ramification.lean | 15 + .../Ramification/All.lean | 18 + .../Ramification/DegreeFromChosenPrimes.lean | 57 + .../Ramification/DegreeProduct.lean | 73 + .../Ramification/FiniteRamifiedPrimes.lean | 71 + .../Ramification/RationalPrime.lean | 50 + .../Ramification/Splitting.lean | 13 + .../Ramification/Splitting/All.lean | 11 + .../Ramification/Splitting/FinitePlace.lean | 353 ++ .../Splitting/FinitePlaceIdeal.lean | 283 ++ .../Ramification/Splitting/NormalClosure.lean | 948 ++++++ .../Splitting/PrimeOrderFixedField.lean | 306 ++ .../Ramification/UnramifiedRationals.lean | 59 + .../AlgebraicNumberTheory/RayClass.lean | 21 + .../AlgebraicNumberTheory/RayClass/All.lean | 24 + .../RayClass/Approximation.lean | 490 +++ .../AlgebraicNumberTheory/RayClass/Basic.lean | 159 + .../RayClass/FullModulus.lean | 362 ++ .../AlgebraicNumberTheory/RayClass/Ideal.lean | 979 ++++++ .../RayClass/IdealNorm.lean | 637 ++++ .../RayClass/LocalConductor.lean | 71 + .../RayClass/Narrow.lean | 540 +++ .../OrdinaryClassGroupComparison.lean | 109 + .../RayClass/PrimeGeneration.lean | 86 + .../RayClass/PublicHigherUnitComparison.lean | 32 + .../RayClass/Rational.lean | 1306 +++++++ .../RayClass/Topology.lean | 1093 ++++++ .../AlgebraicNumberTheory/SUnit.lean | 13 + .../AlgebraicNumberTheory/SUnit/All.lean | 15 + .../SUnit/GaloisAction.lean | 1173 +++++++ .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 1887 +++++++++++ .../SUnit/LogLattice.lean | 1226 +++++++ .../AlgebraicNumberTheory/SUnit/Rank.lean | 661 ++++ .../SeparableClosureEmbedding.lean | 91 + .../AlgebraicNumberTheory/TensorProduct.lean | 148 + .../ClassFieldTheory/All.lean | 35 + .../ClassFieldTheory/Definitions.lean | 16 + .../ClassFieldTheory/Definitions/All.lean | 21 + .../ConductorsAndRayClassFields.lean | 30 + .../ConductorsAndRayClassFields/All.lean | 29 + .../EmbedsInRayClassField.lean | 25 + .../FractionalIdealNorm.lean | 41 + .../FractionalIdealNormExponentMap.lean | 57 + .../IsAbelianConductor.lean | 25 + .../IsRayCongruent.lean | 76 + .../IsUnramifiedOutsideModulus.lean | 35 + .../NarrowClassGroup.lean | 53 + .../NarrowRayClassModulus.lean | 28 + .../OrdinaryRayClassModulus.lean | 33 + .../ConductorsAndRayClassFields/RayArtin.lean | 26 + .../RayClassFieldRealization.lean | 43 + .../RayClassGroup.lean | 30 + .../RayClassIdealModulusProjection.lean | 126 + .../RayClassIdealNorm.lean | 146 + .../RayClassModulus.lean | 139 + .../RayClassOfFinitePrime.lean | 59 + .../RayClassPrimeToIdeals.lean | 39 + .../RayClassSubgroupQuotientEquiv.lean | 34 + .../RayClassSubgroupRealization.lean | 49 + .../RayLocalHigherUnitGroup.lean | 45 + .../RayPrincipalIdealSubgroup.lean | 40 + .../FrobeniusAndHilbertClassFields.lean | 18 + .../FrobeniusAndHilbertClassFields/All.lean | 17 + .../ArithmeticFrobeniusAt.lean | 34 + .../FinitePrimeFractionalIdeal.lean | 32 + .../FinitePrimeSplitsCompletely.lean | 32 + .../IsBigHilbertClassField.lean | 27 + .../IsEverywhereUnramified.lean | 24 + .../IsSmallHilbertClassField.lean | 26 + .../IsUnramifiedAtFinitePlaces.lean | 28 + ...mberFieldFractionalIdealFactorization.lean | 145 + .../NumberFieldFractionalIdealGroup.lean | 25 + .../Definitions/GlobalClassFieldTheory.lean | 15 + .../GlobalClassFieldTheory/All.lean | 18 + .../FiniteAbelianExtension.lean | 58 + .../FiniteAbelianReciprocityData.lean | 47 + ...FiniteAbelianReciprocityQuotientEquiv.lean | 34 + .../FinitePlaceTensorNormSubgroup.lean | 39 + .../IdeleClassConnectedQuotient.lean | 41 + .../IsMaximalAbelianGlobalArtin.lean | 34 + .../Definitions/HasseArf.lean | 17 + .../Definitions/HasseArf/All.lean | 16 + .../HasseArf/HerbrandFunction.lean | 40 + .../HerbrandFunctionAtLowerIndex.lean | 34 + .../HasseArf/InverseHerbrandFunction.lean | 39 + .../HasseArf/IsLowerRamificationJump.lean | 21 + .../HasseArf/IsUpperRamificationJump.lean | 48 + .../HasseArf/LowerRamificationGroup.lean | 47 + .../HasseArf/RealLowerRamificationGroup.lean | 76 + .../HasseArf/UpperRamificationGroup.lean | 38 + .../Definitions/HilbertSymbols.lean | 24 + .../Definitions/HilbertSymbols/All.lean | 23 + .../FinitePlaceHilbertBadSet.lean | 31 + .../GlobalHilbertPairingFamily.lean | 26 + .../GlobalHilbertPairingFiniteFactor.lean | 42 + .../GlobalHilbertPairingProperties.lean | 37 + .../GlobalInfinitePlaceHilbertSymbol.lean | 45 + .../HilbertSymbols/HilbertPairing.lean | 23 + .../HilbertSymbols/HilbertPairingLaws.lean | 38 + .../HilbertPairingNormResidueCriterion.lean | 24 + .../HilbertSymbols/HilbertPairingSymbol.lean | 24 + .../HilbertSymbols/IsKummerNorm.lean | 24 + .../HilbertSymbols/IsLocalHilbertPairing.lean | 26 + .../HilbertSymbols/KummerAlgebra.lean | 22 + .../KummerAlgebraNormSubgroup.lean | 28 + .../HilbertSymbols/PowerClass.lean | 21 + .../HilbertSymbols/PowerClassGroup.lean | 26 + .../Definitions/LocalClassFieldTheory.lean | 15 + .../LocalClassFieldTheory/All.lean | 14 + .../LocalClassFieldTheory/FieldNormHom.lean | 25 + .../FieldNormQuotient.lean | 25 + .../FieldNormSubgroup.lean | 25 + .../FiniteAbelianLocalExtension.lean | 47 + .../LocalClassFieldTheory/IsFieldNorm.lean | 25 + .../OpenFiniteIndexSubgroup.lean | 23 + .../Definitions/NormTheorems.lean | 13 + .../Definitions/NormTheorems/All.lean | 12 + .../NormTheorems/ExtendingAbsoluteValue.lean | 27 + .../NormTheorems/IsEverywhereLocalNorm.lean | 30 + .../NormTheorems/IsNormAtFinitePlace.lean | 33 + .../NormTheorems/IsNormAtInfinitePlace.lean | 32 + .../GlobalClassFieldTheory.lean | 14 + .../GlobalClassFieldTheory/All.lean | 19 + .../ClassFieldAxiom.lean | 20 + .../ClassFieldAxiom/All.lean | 23 + .../CyclicIdeleClassNormIndex.lean | 1192 +++++++ .../ClassFieldAxiom/HasseNormPrinciple.lean | 1377 ++++++++ .../ClassFieldAxiom/IdeleClassFormation.lean | 153 + .../IdeleClassPowerLocalUnitQuotient.lean | 17 + .../IdeleClassPowerLocalUnitQuotient/All.lean | 20 + .../ArchimedeanPowerIndex.lean | 312 ++ .../FinitePlaceCompletionInstances.lean | 59 + .../FinitePlacePowerIndex.lean | 311 ++ .../LocalResidueArithmetic.lean | 338 ++ .../NormContainment.lean | 117 + .../PrimePowerKummerIndex.lean | 533 +++ .../SupportedIdeleIndex.lean | 338 ++ .../SupportedPrincipalQuotient.lean | 531 +++ .../IdelePowerLocalUnitNormContainment.lean | 667 ++++ .../IdelePowerLocalUnitSubgroup.lean | 204 ++ .../KummerLocalNormContainment.lean | 231 ++ .../ClassFieldAxiom/MathlibNormInterface.lean | 204 ++ .../SUnitKummerPrimeSelection.lean | 16 + .../SUnitKummerPrimeSelection/All.lean | 20 + .../BasePlaceSelection.lean | 472 +++ .../SUnitKummerPrimeSelection/Conclusion.lean | 431 +++ .../CoordinatePlaces.lean | 400 +++ .../DecompositionFields.lean | 435 +++ .../FinitePlaceDecomposition.lean | 183 + .../SUnitKummerPrimeSelection/PrimeSet.lean | 116 + .../RestrictionKernel.lean | 282 ++ .../ClassFieldAxiom/SUnitLocalPowerMap.lean | 723 ++++ .../SupportedIdelePowerLocalUnitQuotient.lean | 301 ++ .../GlobalClassFieldTheory/Cohomology.lean | 12 + .../Cohomology/All.lean | 12 + .../CofinitelySplitFiniteExtension.lean | 136 + .../CyclicPrimePowerFullDecomposition.lean | 401 +++ .../IdeleClassHerbrandSupportedFinal.lean | 1581 +++++++++ .../GlobalClassFields.lean | 86 + .../AbelianConductorExactness.lean | 555 +++ .../AbelianConductorRamification.lean | 110 + .../AbelianLocalConductorComparison.lean | 426 +++ .../AbelianNormConductor.lean | 269 ++ .../GlobalClassFields/All.lean | 91 + .../ArithmeticClassFieldCorrespondence.lean | 175 + ...rithmeticHilbertClassFieldReciprocity.lean | 246 ++ .../ArithmeticRayClassFieldReciprocity.lean | 187 + .../ArithmeticUnramifiedPrimeArtin.lean | 155 + .../BigHilbertClassField.lean | 114 + .../BigHilbertClassFieldMathlibArtin.lean | 182 + .../BigHilbertClassFieldNaturality.lean | 606 ++++ .../BigHilbertClassFieldOverOriginalBase.lean | 166 + .../ClassFieldRealization.lean | 131 + ...osedFiniteIndexClassFieldConstruction.lean | 125 + .../ClosedFiniteIndexClassFieldNormRange.lean | 208 ++ ...sedFiniteIndexClassFieldOriginalField.lean | 247 ++ ...losedFiniteIndexClassFieldReciprocity.lean | 13 + .../Algebraic.lean | 11 + .../Algebraic/All.lean | 14 + .../Algebraic/Construction.lean | 50 + .../Algebraic/Evaluation.lean | 41 + .../All.lean | 19 + .../Degree.lean | 53 + .../GlobalNormResidue.lean | 142 + .../Topological.lean | 14 + .../Topological/All.lean | 17 + .../Topological/Construction.lean | 54 + .../Topological/Evaluation.lean | 45 + .../Topological/EvaluationCore.lean | 62 + .../Topological/EvaluationValue.lean | 55 + .../Topological/QuotientTransport.lean | 47 + .../GlobalClassFields/Conductor.lean | 245 ++ .../GlobalClassFields/ConductorFrobenius.lean | 584 ++++ .../ConductorInfinitePart.lean | 298 ++ .../GlobalClassFields/ConductorLattice.lean | 183 + .../ConductorLocalComparison.lean | 329 ++ .../ConductorPrimeArtin.lean | 269 ++ .../ConductorRayClassMaximality.lean | 356 ++ .../GlobalClassFields/ConductorSupport.lean | 132 + .../CyclicConductorUniqueness.lean | 229 ++ .../CyclicNormConductor.lean | 77 + .../GlobalClassFields/CyclicNormTower.lean | 237 ++ .../CyclicRayClassMaximality.lean | 119 + .../CyclotomicKummerNormDescent.lean | 487 +++ .../EmbeddedAbelianSubextension.lean | 83 + .../FiniteAbelianClassFieldContainment.lean | 825 +++++ ...FiniteAbelianClassFieldCorrespondence.lean | 331 ++ ...elianClassFieldCorrespondenceTopology.lean | 205 ++ .../FiniteIndexNormClassField.lean | 331 ++ .../FinitePlaceArtinQuotient.lean | 139 + .../FullConductorRayClassField.lean | 45 + .../HilbertClassFieldComparison.lean | 432 +++ .../HilbertClassFieldMaximalSubextension.lean | 894 +++++ .../HilbertClassFieldMaximality.lean | 562 +++ .../HilbertClassFieldPrimeSplitting.lean | 736 ++++ .../HilbertClassFieldRealization.lean | 293 ++ .../HilbertClassFieldReciprocity.lean | 14 + .../HilbertClassFieldReciprocity/All.lean | 18 + .../BigActual.lean | 143 + .../BigOriginal.lean | 139 + .../SmallActual.lean | 142 + .../SmallOriginal.lean | 137 + .../Transport.lean | 144 + ...HilbertClassFieldUnramifiedMaximality.lean | 197 ++ .../HilbertNormCharacterization.lean | 312 ++ ...finiteAbelianClassFieldCorrespondence.lean | 181 + .../GlobalClassFields/KummerNormDescent.lean | 185 + .../MathlibFrobeniusHilbertComparison.lean | 810 +++++ .../MathlibGlobalReciprocity.lean | 300 ++ .../GlobalClassFields/NormConductor.lean | 739 ++++ .../GlobalClassFields/NormLimitation.lean | 160 + .../NormRayClassMaximality.lean | 281 ++ .../GlobalClassFields/NormTowerConductor.lean | 399 +++ .../OrdinaryNormClassField.lean | 477 +++ .../PowerCongruenceCore.lean | 196 ++ .../PublicIdealArtinKernelComparison.lean | 198 ++ .../PublicIdealNormArtinKernel.lean | 210 ++ .../PublicIdealNormQuotientComparison.lean | 112 + .../PublicRayClassComparison.lean | 606 ++++ .../RationalRayPrimeClass.lean | 275 ++ .../RayClassFieldRealization.lean | 691 ++++ .../RayClassModulusProjection.lean | 157 + .../GlobalClassFields/RayClassPrimeIdele.lean | 361 ++ .../RayClassSubgroupFieldAntitone.lean | 49 + .../RayClassSubgroupPrimeArtin.lean | 175 + .../RayFrobeniusRigidity.lean | 248 ++ .../GlobalClassFields/RayPrimeGeneration.lean | 82 + .../SUnitKummerNormCore.lean | 527 +++ .../SUnitKummerNormRealization.lean | 148 + .../SmallHilbertClassField.lean | 335 ++ .../SmallHilbertClassFieldMathlibArtin.lean | 157 + ...lHilbertClassFieldMaximalSubextension.lean | 348 ++ .../SmallHilbertClassFieldNaturality.lean | 173 + ...mallHilbertClassFieldOverOriginalBase.lean | 175 + .../SmallHilbertNormCharacterization.lean | 455 +++ .../UnramifiedPrimeArtin.lean | 233 ++ .../UnramifiedPrimeNormClass.lean | 245 ++ .../IdealClassFieldTheory.lean | 31 + .../AbstractCapitulation.lean | 294 ++ .../IdealClassFieldTheory/All.lean | 36 + .../ArithmeticIdealArtin.lean | 259 ++ .../ArithmeticIdealDecompositionLaw.lean | 131 + .../IdealClassFieldTheory/IdealArtinMap.lean | 824 +++++ .../IdealArtinQuotient.lean | 150 + .../IdealDecompositionLaw.lean | 560 +++ .../IdealClassFieldTheory/IdealFrobenius.lean | 106 + .../IdealNormArtinExactness.lean | 510 +++ .../IdealClassFieldTheory/NormLimitation.lean | 95 + .../NormLimitationCore.lean | 73 + .../NormLimitationStatement.lean | 44 + .../PrincipalIdealTheorem.lean | 122 + .../PrincipalIdealTower.lean | 224 ++ .../PrincipalIdealTransfer.lean | 647 ++++ .../RationalAbstractExtensionToOrdinary.lean | 164 + .../RationalFiniteNormTransfer.lean | 16 + .../RationalFiniteNormTransfer/All.lean | 20 + .../Compatibility.lean | 280 ++ .../FieldSpine.lean | 379 +++ .../FiniteNormClass.lean | 111 + .../MembershipTypes.lean | 462 +++ .../RationalFiniteNormTransfer/Quotient.lean | 178 + .../Representatives.lean | 221 ++ .../ZeroTransport.lean | 464 +++ .../RationalFixedFieldBaseChange.lean | 169 + .../SmallHilbertPrincipalization.lean | 219 ++ .../SmallHilbertSplitting.lean | 86 + .../SmallHilbertTowerConjugation.lean | 1228 +++++++ .../SmallHilbertTowerRealization.lean | 880 +++++ .../SmallHilbertTowerUnramified.lean | 326 ++ .../GlobalClassFieldTheory/Reciprocity.lean | 93 + .../AbstractFixedFieldGlobalNormResidue.lean | 1666 +++++++++ .../Reciprocity/All.lean | 101 + .../Reciprocity/ArithmeticNormalization.lean | 467 +++ .../Reciprocity/ComplexificationArtin.lean | 15 + .../ComplexificationArtin/All.lean | 20 + .../InfinitePlaceCompatibility.lean | 765 +++++ .../InfinitePlaceOverfield.lean | 688 ++++ .../NumberFieldComplexification.lean | 438 +++ .../OverextensionArtin.lean | 774 +++++ .../RamifiedOverextension.lean | 644 ++++ .../RationalComplexification.lean | 477 +++ .../CyclotomicAbstractFixedFieldArtin.lean | 2739 +++++++++++++++ .../CyclotomicIdeleClassValuation.lean | 1179 +++++++ .../Reciprocity/CyclotomicIdeleValue.lean | 942 ++++++ .../CyclotomicIdeleValueTopology.lean | 283 ++ .../CyclotomicNormOneCorrection.lean | 106 + .../Reciprocity/CyclotomicPrincipalIdele.lean | 903 +++++ .../CyclotomicTorsionFixedField.lean | 163 + ...lotomicUnramifiedGeometricRestriction.lean | 941 ++++++ ...micUnramifiedLocalGlobalCompatibility.lean | 394 +++ .../CyclotomicUnramifiedRestriction.lean | 411 +++ .../Reciprocity/CyclotomicZHatBaseChange.lean | 2027 +++++++++++ .../Reciprocity/FiniteGaloisRealization.lean | 552 +++ .../FiniteGaloisRealizationCore.lean | 511 +++ .../FiniteGaloisRealizationFinitePlace.lean | 137 + .../FiniteGaloisRealizationNormQuotient.lean | 346 ++ .../FiniteGaloisRealizationSubextension.lean | 259 ++ .../Reciprocity/FiniteIdeleArtin.lean | 748 ++++ .../Reciprocity/FiniteLocalFamily.lean | 145 + .../FinitePlaceAdicHilbertComparison.lean | 176 + .../FinitePlaceAdicHilbertProductFormula.lean | 64 + .../FinitePlaceAdicLocalField.lean | 167 + .../Reciprocity/FinitePlaceArtin.lean | 16 + .../Reciprocity/FinitePlaceArtin/All.lean | 15 + .../FinitePlaceArtin/Conjugation.lean | 564 ++++ .../FinitePlaceArtin/Construction.lean | 796 +++++ .../Reciprocity/FinitePlaceArtin/Core.lean | 258 ++ .../CrossLocalRestriction.lean | 938 +++++ .../FinitePlaceArtin/NormRestriction.lean | 1186 +++++++ .../FinitePlaceArtin/TowerRestriction.lean | 816 +++++ .../UnramifiedNormalization.lean | 103 + .../FinitePlaceCyclotomicFrobeniusLift.lean | 1973 +++++++++++ .../Reciprocity/GlobalArtin.lean | 529 +++ .../Reciprocity/GlobalArtinCompatibility.lean | 328 ++ ...GlobalArtinFiniteSupportApproximation.lean | 358 ++ .../Reciprocity/GlobalHilbertSymbol.lean | 23 + .../Reciprocity/GlobalHilbertSymbol/All.lean | 26 + .../Reciprocity/GlobalHilbertSymbol/Core.lean | 287 ++ .../FinitePlaceCharacterComparison.lean | 1018 ++++++ .../FinitePlaceComparison.lean | 209 ++ .../FinitePlaceFiniteSupport.lean | 101 + .../FinitePlaceLocalGlobal.lean | 163 + .../GlobalHilbertSymbol/InfinitePlace.lean | 88 + .../InfinitePlaceCharacter.lean | 112 + .../InfinitePlaceNegative.lean | 115 + .../InfinitePlaceNegativeRoot.lean | 102 + .../InfinitePlaceNegativeUnit.lean | 81 + .../InfinitePlacePositive.lean | 98 + .../InfinitePlaceRamification.lean | 95 + .../InfinitePlaceRealComparison.lean | 174 + .../InfinitePlaceRealSquare.lean | 80 + .../Reciprocity/GlobalNormResidue.lean | 512 +++ .../GlobalNormResidueAbelianization.lean | 758 +++++ ...alNormResidueAbelianizationNaturality.lean | 857 +++++ .../GlobalNormResidueNaturality.lean | 3005 +++++++++++++++++ .../Reciprocity/HilbertFamilyAlgEquiv.lean | 144 + .../HilbertFiniteFactorNaturality.lean | 100 + .../Reciprocity/HilbertProductFormula.lean | 188 ++ .../HilbertProductFormulaAlgEquiv.lean | 116 + ...eleClassDirectLimitAbstractFixedField.lean | 349 ++ .../IdeleClassDirectLimitCore.lean | 464 +++ .../IdeleClassDirectLimitExtension.lean | 661 ++++ .../IdeleClassDirectLimitExtensionAction.lean | 734 ++++ .../IdeleClassDirectLimitExtensionNorm.lean | 817 +++++ .../IdeleClassDirectLimitFiniteLevel.lean | 220 ++ .../IdeleClassDirectLimitFiniteLevelCore.lean | 256 ++ ...leClassDirectLimitFiniteTowerNormCore.lean | 510 +++ ...eClassDirectLimitFiniteTowerNormProof.lean | 647 ++++ ...ssDirectLimitFiniteTowerNormStatement.lean | 163 + ...deleClassDirectLimitFixedPointDescent.lean | 258 ++ ...ClassDirectLimitFixedPointDescentCore.lean | 200 ++ .../IdeleClassDirectLimitFixedPoints.lean | 597 ++++ .../IdeleClassDirectLimitNormQuotient.lean | 1142 +++++++ .../Reciprocity/IdeleClassNormTopology.lean | 277 ++ .../Reciprocity/InfiniteGlobalArtin.lean | 991 ++++++ .../InfiniteGlobalArtinDescent.lean | 132 + .../InfiniteGlobalArtinSurjectivity.lean | 287 ++ .../InfiniteHilbertFactorNaturality.lean | 107 + ...InfiniteLocalGlobalArtinCompatibility.lean | 464 +++ .../Reciprocity/InfinitePlaceArtin.lean | 1416 ++++++++ .../IntermediateNormAbelianization.lean | 173 + .../LocalGlobalArtinCompatibility.lean | 13 + .../LocalGlobalArtinCompatibility/All.lean | 18 + .../Factorization.lean | 779 +++++ .../FinitePadicAuxiliaryField.lean | 1898 +++++++++++ .../FinitePadicCyclicData.lean | 971 ++++++ .../SeparableClosurePadicLift.lean | 1491 ++++++++ .../MathlibHilbertProductFormula.lean | 72 + .../MathlibTopologicalGlobalReciprocity.lean | 50 + .../MaximalAbelianGlobalArtin.lean | 69 + .../Reciprocity/MaximalAbelianKernel.lean | 236 ++ .../Reciprocity/NormQuotient.lean | 61 + .../Reciprocity/OnePlaceNormKernel.lean | 319 ++ .../Reciprocity/PowerResidueReciprocity.lean | 2382 +++++++++++++ .../Reciprocity/ProductFormula.lean | 185 + .../RationalCyclotomicArithmeticProduct.lean | 409 +++ .../RationalCyclotomicCharacterRigidity.lean | 72 + .../RationalCyclotomicFinitePlace.lean | 116 + .../RationalCyclotomicFinitePlaceArtin.lean | 2992 ++++++++++++++++ .../RationalCyclotomicLocalization.lean | 268 ++ ...ationalCyclotomicPrincipalAwayProduct.lean | 666 ++++ ...ationalCyclotomicPrincipalPrimeFactor.lean | 47 + .../RationalCyclotomicPrincipalProduct.lean | 177 + .../RationalCyclotomicRayNorm.lean | 823 +++++ .../RationalCyclotomicZHatRigidity.lean | 83 + .../RationalPrimeFactorization.lean | 773 +++++ .../RationalPrincipalLocalUnit.lean | 445 +++ ...ionalQuadraticPowerResidueReciprocity.lean | 1233 +++++++ .../TopologicalGlobalNormResidue.lean | 166 + ...ogicalGlobalNormResidueAbelianization.lean | 188 ++ .../ClassFieldTheory/HasseArf.lean | 1296 +++++++ .../ClassFieldTheory/KroneckerWeber.lean | 24 + .../ClassFieldTheory/KroneckerWeber/All.lean | 23 + .../ClassFieldTheory/KroneckerWeber/Core.lean | 56 + .../KroneckerWeber/Final.lean | 131 + .../GlobalCompositumCyclotomicTarget.lean | 110 + .../GlobalCompositumGlobalEmbedding.lean | 53 + .../GlobalCompositumLeftFactors.lean | 135 + ...GlobalCompositumLocalizationEmbedding.lean | 150 + ...GlobalCompositumValuationInertiaBound.lean | 73 + .../GlobalCompositumValuedEmbedding.lean | 167 + .../GlobalPadicPrimePowInertiaBound.lean | 138 + .../LocalCyclotomicEmbedding.lean | 350 ++ ...tionalCyclotomicArithmeticReciprocity.lean | 254 ++ .../RationalRayClassFieldCyclotomic.lean | 736 ++++ .../KroneckerWeber/RayClassComparison.lean | 115 + .../KroneckerWeber/Setup.lean | 401 +++ .../UnramifiedCompositumSupport.lean | 265 ++ .../ClassFieldTheory/KummerTheory.lean | 10 + .../ClassFieldTheory/KummerTheory/All.lean | 12 + .../KummerTheory/Concrete.lean | 14 + .../KummerTheory/Concrete/All.lean | 18 + .../Concrete/CyclotomicPrimeBaseChange.lean | 351 ++ .../Concrete/FinitePlaceDecomposition.lean | 314 ++ .../Concrete/SUnitKummerUnramified.lean | 526 +++ .../Concrete/SUnitPreparation.lean | 15 + .../Concrete/SUnitPreparation/All.lean | 14 + .../Concrete/SUnitPreparation/Core.lean | 306 ++ .../EnlargedSUnitRestriction.lean | 615 ++++ .../FiniteRadicalSupport.lean | 397 +++ .../FullSUnitKummerExtension.lean | 550 +++ .../SUnitLocalPowerKernel.lean | 201 ++ .../SUnitPreparation/SUnitPowerQuotient.lean | 633 ++++ .../SimpleExtensionLocalBehavior.lean | 651 ++++ .../LocalClassFieldTheory.lean | 14 + .../LocalClassFieldTheory/All.lean | 43 + .../LocalClassFieldTheory/ClassFormation.lean | 30 + .../ClassFormation/All.lean | 33 + .../ClassFormation/ArchimedeanHilbert90.lean | 179 + .../ArchimedeanNormQuotient.lean | 881 +++++ .../ClassFormation/CohomologyBridge.lean | 492 +++ .../ClassFormation/FieldUnitsHerbrand.lean | 138 + .../FilteredLiftingSequence.lean | 157 + .../ClassFormation/Hilbert90.lean | 35 + .../ClassFormation/IntegerUnitsHerbrand.lean | 189 ++ .../ClassFormation/LocalBlocks.lean | 14 + .../ClassFormation/LocalBlocks/All.lean | 17 + .../ClassFormation/LocalBlocks/Family.lean | 12 + .../LocalBlocks/Family/All.lean | 15 + .../ClassFormation/LocalBlocks/Family/H0.lean | 85 + .../LocalBlocks/Family/HMinusOne.lean | 89 + .../LocalBlocks/Family/Instances.lean | 103 + .../LocalBlocks/FamilyClassAxiom.lean | 977 ++++++ .../ClassFormation/LocalBlocks/Induced.lean | 151 + .../ClassFormation/LocalBlocks/Tensor.lean | 1065 ++++++ .../LocalBlocks/TensorNorm.lean | 446 +++ .../LocalizedCompletionCohomology.lean | 15 + .../Algebra.lean | 346 ++ .../LocalizedCompletionCohomology/All.lean | 18 + .../Cardinality.lean | 13 + .../Cardinality/All.lean | 16 + .../Cardinality/H0.lean | 123 + .../Cardinality/HMinusOne.lean | 123 + .../Cardinality/Quotient.lean | 114 + .../Cardinality/Trivial.lean | 108 + .../CompMulEquiv.lean | 160 + .../LocalizedCompletionCohomology/Finite.lean | 162 + .../Generator.lean | 89 + .../HerbrandEquiv.lean | 226 ++ .../ClassFormation/Main.lean | 130 + .../ClassFormation/NormalBasis.lean | 738 ++++ .../ClassFormation/NormalBasisCohomology.lean | 113 + .../NormalBasisFiniteQuotient.lean | 111 + .../NormalBasisGaloisAction.lean | 291 ++ .../NormalBasisGradedLifting.lean | 483 +++ .../NormalBasisInfiniteProduct.lean | 473 +++ .../NormalBasisRecursiveLifting.lean | 245 ++ .../ClassFormation/PrincipalUnitGraded.lean | 258 ++ .../ClassFormation/Valuation.lean | 281 ++ .../ClassFormation/ValuationHerbrand.lean | 146 + .../ClassFormation/ValueGroupCohomology.lean | 232 ++ .../LocalClassFieldTheory/Finite.lean | 15 + .../LocalClassFieldTheory/Finite/All.lean | 19 + .../Finite/Conductor.lean | 142 + .../Finite/CyclotomicNorm.lean | 12 + .../Finite/CyclotomicNorm/All.lean | 15 + .../Finite/CyclotomicNorm/PrincipalUnits.lean | 942 ++++++ .../CyclotomicNorm/StandardSubgroup.lean | 82 + .../Finite/CyclotomicNorm/Unramified.lean | 312 ++ .../Finite/Existence.lean | 39 + .../Finite/Existence/All.lean | 47 + .../Finite/Existence/CharacteristicZero.lean | 84 + .../Finite/Existence/Classification.lean | 71 + .../Existence/CyclotomicKummerDescent.lean | 199 ++ .../Finite/Existence/EqualCharacteristic.lean | 620 ++++ ...qualCharacteristicDominatingExtension.lean | 98 + .../Existence/FiniteUnramifiedField.lean | 225 ++ .../Finite/Existence/KummerNormOpen.lean | 173 + .../Finite/Existence/LocalAbsoluteData.lean | 114 + .../LubinTateUniformizerDiagonal.lean | 1080 ++++++ .../Existence/MathlibFieldClassification.lean | 141 + .../Finite/Existence/MaximalKummerNorm.lean | 164 + .../Existence/NormSubgroupOrderEmbedding.lean | 444 +++ .../Existence/NormSubgroupRingEquiv.lean | 64 + .../Existence/NormSubgroupSurjectivity.lean | 289 ++ .../Finite/Existence/OrderReversal.lean | 182 + .../ShrinkChosenFiniteAbelianFields.lean | 104 + .../ShrinkChosenFiniteAbelianNorms.lean | 64 + .../Existence/ShrinkFiniteAbelianFields.lean | 102 + .../Existence/ShrinkFiniteAbelianNorms.lean | 52 + .../Existence/ShrinkIntermediateFields.lean | 104 + .../Existence/ShrinkLocalClassification.lean | 70 + .../Finite/Existence/ShrinkOpenSubgroups.lean | 77 + .../Existence/ShrinkSeparableClosure.lean | 78 + .../StandardDominatingExtension.lean | 85 + .../Finite/Existence/StandardLubinTate.lean | 190 ++ .../StandardSubgroupIntersection.lean | 176 + .../UnramifiedLubinTateDiagonal.lean | 147 + .../Existence/UnramifiedNormContainment.lean | 291 ++ .../Existence/UnramifiedNormSubgroup.lean | 301 ++ .../UnshrinkFiniteAbelianFields.lean | 104 + .../Finite/LocalReciprocity.lean | 63 + .../AbsoluteUnitsFixedField.lean | 194 ++ .../AbstractFixedFieldNorm.lean | 278 ++ .../AbstractFixedFieldUnits.lean | 301 ++ .../Finite/LocalReciprocity/All.lean | 66 + .../ConcreteReciprocityCanonical.lean | 1094 ++++++ .../ConcreteReciprocityPrimeNorm.lean | 170 + .../ConcreteReciprocityTransport.lean | 177 + .../ConjugationNaturality.lean | 153 + .../Finite/LocalReciprocity/Core.lean | 78 + .../Finite/LocalReciprocity/Filtered.lean | 18 + .../Filtered/AbstractUnramified.lean | 668 ++++ .../Finite/LocalReciprocity/Filtered/All.lean | 21 + .../LocalReciprocity/Filtered/Compositum.lean | 85 + .../LocalReciprocity/Filtered/Core.lean | 220 ++ .../Filtered/EqualCharacteristic.lean | 121 + ...EqualCharacteristicStandardCompositum.lean | 123 + .../Filtered/FiniteAbelian.lean | 249 ++ .../Filtered/InertiaUnramifiedExtension.lean | 118 + .../Filtered/StandardCompositum.lean | 115 + .../LocalReciprocity/Filtered/Unramified.lean | 98 + .../FiniteAbelianFamilyRigidity.lean | 73 + .../FiniteAbelianFamilySubgroupKernel.lean | 108 + ...niteAbelianFamilyUnramifiedCompositum.lean | 102 + .../FiniteAbstractFixedField.lean | 404 +++ .../FiniteExtensionClassFieldAxiom.lean | 232 ++ .../FiniteGaloisRealization.lean | 264 ++ .../FiniteResidueFinrankTransfer.lean | 272 ++ .../FiniteResidueFrobenius.lean | 293 ++ .../FiniteResidueValuationComparison.lean | 61 + .../FiniteSubgroupResidueDegree.lean | 459 +++ .../FixedFieldContinuousNaturality.lean | 953 ++++++ .../FixedFieldIntrinsicReciprocity.lean | 23 + .../FixedFieldIntrinsicReciprocity/All.lean | 26 + .../AmbientNormResidue.lean | 378 +++ .../AmbientPrimeComparison.lean | 263 ++ .../AmbientPrimeNormTransport.lean | 691 ++++ .../AmbientPrimeSymbolSetup.lean | 380 +++ .../AmbientPrimeWitness.lean | 360 ++ .../AmbientPrimeWitnessComparison.lean | 833 +++++ .../BaseComparison.lean | 14 + .../BaseComparison/All.lean | 17 + .../EmbeddedExtensionQuotient.lean | 720 ++++ .../EmbeddedInertiaComparison.lean | 280 ++ .../FixedFieldNormQuotient.lean | 524 +++ .../FixedFieldSpecialization.lean | 322 ++ .../IntrinsicBaseEquivalence.lean | 646 ++++ .../EmbeddedFrobeniusTransport.lean | 1857 ++++++++++ .../IntrinsicFrobeniusArtinComparison.lean | 116 + .../IntrinsicFrobeniusClosure.lean | 368 ++ .../IntrinsicFrobeniusFixedField.lean | 936 +++++ .../IntrinsicFrobeniusQuotientTransport.lean | 480 +++ .../NormRestriction.lean | 778 +++++ .../PrimeComparison.lean | 1257 +++++++ .../LocalReciprocity/FixedFieldLocalData.lean | 1393 ++++++++ .../FixedFieldNormResidueNaturality.lean | 747 ++++ .../FixedFieldRelativeNorm.lean | 273 ++ .../GaloisExtensionQuotient.lean | 159 + .../GeneralTowerNaturality.lean | 481 +++ .../HenselianValuationBase.lean | 191 ++ ...ntermediateFieldNormResidueNaturality.lean | 429 +++ .../IntrinsicAbsoluteData.lean | 84 + .../LocalClassFieldAxiom.lean | 155 + .../LocalHenselianValuation.lean | 166 + .../LocalReciprocity/LocalResidueDatum.lean | 437 +++ .../Finite/LocalReciprocity/Main.lean | 118 + .../LocalReciprocity/MathlibInterface.lean | 136 + .../Finite/LocalReciprocity/NormResidue.lean | 107 + .../NormResidueNaturality.lean | 73 + .../ResidueAbsoluteDegree.lean | 316 ++ .../ResidueAbsoluteFrobenius.lean | 179 + .../LocalReciprocity/ResidueActionIndex.lean | 112 + .../ResidueAlgebraicClosureDegree.lean | 532 +++ .../ResidueAlgebraicallyClosed.lean | 220 ++ .../Finite/LocalReciprocity/ResidueDatum.lean | 120 + .../SemilinearNaturality.lean | 355 ++ .../SeparableFixedFieldNorm.lean | 281 ++ .../SeparableNormProduct.lean | 91 + .../LocalReciprocity/SeparableUnitsNorm.lean | 447 +++ .../LocalReciprocity/TateTransport.lean | 177 + .../TopologicalReciprocity.lean | 482 +++ .../UnramifiedComparison.lean | 419 +++ .../UnramifiedNormComparison.lean | 186 + .../UnramifiedNormalization.lean | 596 ++++ .../UnramifiedReciprocity.lean | 242 ++ .../UnramifiedResidueUniqueness.lean | 107 + .../LocalReciprocity/ValuationSemilinear.lean | 47 + .../Finite/Unramified.lean | 14 + .../Finite/Unramified/All.lean | 12 + .../Finite/Unramified/Cohomology.lean | 447 +++ .../Finite/Unramified/Norm.lean | 295 ++ .../Finite/Unramified/PrincipalUnits.lean | 13 + .../Finite/Unramified/PrincipalUnits/All.lean | 11 + .../Unramified/PrincipalUnits/Basic.lean | 214 ++ .../Unramified/PrincipalUnits/Lift.lean | 536 +++ .../Unramified/PrincipalUnits/NormSide.lean | 243 ++ .../Unramified/PrincipalUnits/Trace.lean | 349 ++ .../Finite/Unramified/ResidueNorm.lean | 211 ++ .../Finite/Unramified/Uniformizer.lean | 58 + .../Finite/UnramifiedConductor.lean | 342 ++ .../LocalClassFieldTheory/Infinite.lean | 22 + .../Infinite/AbsoluteArtin.lean | 242 ++ .../Infinite/AbsoluteArtinRestriction.lean | 69 + .../AbsoluteFiniteQuotientTransitions.lean | 135 + .../Infinite/AbsoluteFiniteQuotients.lean | 224 ++ .../AbsoluteGaloisAbelianization.lean | 80 + ...AbstractProfiniteCompletionComparison.lean | 352 ++ .../LocalClassFieldTheory/Infinite/All.lean | 26 + .../FiniteAbelianQuotientKernels.lean | 223 ++ .../Infinite/FiniteReciprocityDiagram.lean | 305 ++ .../LocalMultiplicativeCompletion.lean | 151 + .../Infinite/ProfiniteCompletion.lean | 590 ++++ .../Infinite/ProfiniteCompletionCriteria.lean | 126 + .../Infinite/ProfiniteLocalReciprocity.lean | 399 +++ .../TopologicalAbelianizationCongr.lean | 103 + .../LocalClassFieldTheory/Kummer.lean | 21 + .../LocalClassFieldTheory/Kummer/All.lean | 24 + .../Kummer/CanonicalKummerNorm.lean | 480 +++ .../Kummer/KummerExponentTower.lean | 95 + .../Kummer/KummerNormPowerClassDegree.lean | 233 ++ .../LocalHilbertExponentCompatibility.lean | 137 + .../Kummer/LocalHilbertPairing.lean | 342 ++ .../LocalHilbertPairingNondegeneracy.lean | 383 +++ .../Kummer/LocalHilbertSymbol.lean | 222 ++ .../Kummer/LocalHilbertSymbolLaws.lean | 79 + .../Kummer/MathlibHilbertPairing.lean | 404 +++ .../Kummer/MaximalLocalKummerPairing.lean | 156 + .../Kummer/PowerResidueTameFormula.lean | 1008 ++++++ .../Kummer/SmallHilbertPairingTransport.lean | 282 ++ .../LubinTateApplication.lean | 29 + .../LubinTateApplication/All.lean | 36 + ...lCharacteristicRealFilteredComparison.lean | 420 +++ ...racteristicTransportedArtinComparison.lean | 198 ++ ...risticTransportedFixedFieldComparison.lean | 138 + ...alCharacteristicTransportedLevelTower.lean | 284 ++ ...sticTransportedRealFilteredComparison.lean | 674 ++++ ...cteristicTransportedUpperRamification.lean | 409 +++ ...acteristicTransportedUpperRestriction.lean | 192 ++ .../EqualCharacteristicUpperFiltration.lean | 222 ++ .../LaurentPrincipalUnitTransport.lean | 357 ++ .../LubinTateTransport.lean | 834 +++++ .../LubinTateApplication/NormIndex.lean | 70 + .../LubinTateApplication/NormSubgroup.lean | 86 + .../PadicMultiplicativeArtinComparison.lean | 989 ++++++ .../StandardArtinComparison.lean | 358 ++ .../StandardFilteredArtinComparison.lean | 643 ++++ .../StandardFixedFieldComparison.lean | 114 + .../StandardNormIndex.lean | 71 + .../StandardNormSubgroupExact.lean | 136 + .../StandardSubgroupIndex.lean | 140 + .../TransportedNormSubgroupExact.lean | 76 + .../ClassFieldTheory/LocalFieldTheory.lean | 10 + .../LocalFieldTheory/All.lean | 13 + .../LocalFieldTheory/Padic.lean | 10 + .../LocalFieldTheory/Padic/All.lean | 13 + .../LocalFieldTheory/Padic/Cyclotomic.lean | 10 + .../Padic/Cyclotomic/All.lean | 12 + .../Padic/Cyclotomic/Unramified.lean | 10 + .../Padic/Cyclotomic/Unramified/All.lean | 12 + .../Unramified/CanonicalExtension.lean | 901 +++++ .../ClassFieldTheory/LubinTate.lean | 13 + .../ClassFieldTheory/LubinTate/All.lean | 24 + .../LubinTate/EqualCharacteristic.lean | 18 + .../LubinTate/EqualCharacteristic/All.lean | 28 + .../EqualCharacteristic/CompletedLevel.lean | 39 + .../CompletedLevel/All.lean | 42 + .../CompletedLevel/ChangedCompletedLevel.lean | 736 ++++ .../ChangedCompletedPrimitiveAction.lean | 769 +++++ .../ChangedPolynomialEvaluation.lean | 136 + .../CompletedLevel/ChangedUniformizer.lean | 678 ++++ .../ChangedUniformizerNormalization.lean | 106 + .../CompletedFrobeniusBaseEquiv.lean | 97 + .../CompletedFrobeniusContinuity.lean | 206 ++ .../CompletedFrobeniusFixedField.lean | 208 ++ .../CompletedFrobeniusFixedFieldAlgebra.lean | 94 + ...FrobeniusFixedFieldCoefficientDescent.lean | 135 + .../CompletedFrobeniusFixedFieldDegree.lean | 154 + ...ompletedFrobeniusFixedFieldGeneration.lean | 85 + ...ompletedFrobeniusFixedFieldPowerBasis.lean | 64 + ...CompletedFrobeniusFixedFieldPrimitive.lean | 149 + .../CompletedFrobeniusFixedNorm.lean | 216 ++ .../CompletedFrobeniusLift.lean | 310 ++ .../CompletedLevel/CompletedLevel.lean | 718 ++++ .../CompletedPrimitiveAction.lean | 556 +++ .../CompletedPrimitiveIrreducible.lean | 203 ++ .../DirectBracketAtCompletedLevel.lean | 425 +++ .../DirectLubinTateBracket.lean | 271 ++ .../DirectLubinTateBracketRecursion.lean | 354 ++ .../DirectTargetLevelEmbedding.lean | 189 ++ .../DirectThetaAtCompletedLevel.lean | 763 +++++ .../DirectThetaFirstIdentity.lean | 310 ++ .../DirectThetaFrobeniusFixed.lean | 616 ++++ .../CompletedLevel/DirectThetaIteration.lean | 169 + .../CompletedLevel/DirectThetaSeries.lean | 314 ++ .../CompletedLevel/ThetaAtCompletedLevel.lean | 434 +++ .../CompletedLevel/ThetaLocalInverse.lean | 337 ++ .../EqualCharacteristic/Existence.lean | 12 + .../EqualCharacteristic/Existence/All.lean | 17 + .../Existence/LaurentLocalField.lean | 316 ++ .../Existence/LaurentModel.lean | 142 + .../LaurentUniformizerNormalization.lean | 117 + .../EqualCharacteristic/FiniteLevel.lean | 22 + .../EqualCharacteristic/FiniteLevel/All.lean | 25 + .../FiniteLevel/AmbientDivisionTorsion.lean | 209 ++ .../FiniteLevel/DivisionPolynomial.lean | 353 ++ .../FiniteLevel/FiniteParameters.lean | 205 ++ .../FiniteLevel/FreeRankOne.lean | 622 ++++ .../FiniteLevel/LevelAbelian.lean | 359 ++ .../FiniteLevel/LevelAutomorphisms.lean | 368 ++ .../FiniteLevel/LevelField.lean | 153 + .../FiniteLevel/LevelFieldTower.lean | 139 + .../FiniteLevel/NormUniformizer.lean | 101 + .../FiniteLevel/PrimitiveAction.lean | 280 ++ .../FiniteLevel/PrimitiveIrreducible.lean | 324 ++ .../FiniteLevel/PrimitiveTorsion.lean | 145 + .../FiniteLevel/UnitQuotientGalois.lean | 451 +++ .../EqualCharacteristic/FormalModule.lean | 13 + .../EqualCharacteristic/FormalModule/All.lean | 16 + .../FormalModule/AmbientBracketAction.lean | 556 +++ .../DivisionModuleEndomorphisms.lean | 327 ++ .../FormalModule/LubinTateAction.lean | 437 +++ .../FormalModule/LubinTateEndomorphism.lean | 302 ++ .../EqualCharacteristic/Frobenius.lean | 13 + .../EqualCharacteristic/Frobenius/All.lean | 16 + .../Frobenius/CoefficientFrobenius.lean | 73 + .../Frobenius/CompletedUnramifiedField.lean | 593 ++++ .../Frobenius/ContractingEquation.lean | 146 + .../Frobenius/LaurentSeriesFrobenius.lean | 563 +++ .../EqualCharacteristic/NormSubgroup.lean | 22 + .../EqualCharacteristic/NormSubgroup/All.lean | 28 + .../HigherUnitFixedFieldEmbedding.lean | 77 + .../HigherUnitFixedFieldEquiv.lean | 61 + .../HigherUnitFixedFieldMembership.lean | 68 + .../HigherUnitFixedFieldSurjective.lean | 89 + .../HigherUnitFrobeniusFixed.lean | 89 + .../NormSubgroup/HigherUnitLevelMapFixed.lean | 177 + .../NormSubgroup/HigherUnits.lean | 252 ++ .../NormSubgroup/HigherUnitsNorm.lean | 100 + .../NormSubgroup/LevelAlgebra.lean | 65 + .../NormSubgroup/StandardSubgroupNorm.lean | 71 + .../NormSubgroup/UniformizerNorm.lean | 78 + .../NormSubgroup/UnitQuotientCard.lean | 304 ++ .../NormSubgroup/UnitTransport.lean | 168 + .../EqualCharacteristic/Ramification.lean | 14 + .../EqualCharacteristic/Ramification/All.lean | 13 + .../Ramification/Core.lean | 379 +++ .../Ramification/DisplacementValuation.lean | 630 ++++ .../Ramification/GaloisAction.lean | 71 + .../Ramification/LowerGroups.lean | 754 +++++ .../Ramification/PrimitivePoint.lean | 1082 ++++++ .../EqualCharacteristic/RealIndexSteps.lean | 248 ++ .../LubinTate/EqualCharacteristic/Theta.lean | 14 + .../EqualCharacteristic/Theta/All.lean | 17 + .../Theta/ThetaCoefficients.lean | 406 +++ .../Theta/ThetaEvaluation.lean | 113 + .../Theta/ThetaFirstIdentity.lean | 759 +++++ .../Theta/ThetaSeries.lean | 726 ++++ .../Theta/ThetaUniqueness.lean | 79 + .../LubinTate/FiniteLevel.lean | 38 + .../LubinTate/FiniteLevel/All.lean | 45 + .../FiniteLevel/ChangedLevelCompositum.lean | 985 ++++++ .../ChangedPrimitiveEvaluation.lean | 189 ++ .../FiniteLevel/ChangedUniformizer.lean | 281 ++ .../FiniteLevel/CompletedEvaluation.lean | 359 ++ .../FiniteLevel/CompletedIterates.lean | 153 + .../FiniteLevel/DivisionPolynomial.lean | 291 ++ .../FiniteParameterFiltration.lean | 109 + .../FiniteLevel/FiniteParameters.lean | 224 ++ .../GaloisParameterFiltration.lean | 122 + .../FiniteLevel/HerbrandFormula.lean | 444 +++ .../FiniteLevel/HigherUnitLevelEquiv.lean | 1413 ++++++++ .../LubinTate/FiniteLevel/LevelAbelian.lean | 158 + .../FiniteLevel/LevelAutomorphisms.lean | 665 ++++ .../FiniteLevel/LevelFieldTower.lean | 141 + .../LubinTate/FiniteLevel/LevelValuation.lean | 57 + .../FiniteLevel/LocalUpperRamification.lean | 261 ++ .../FiniteLevel/LowerRamification.lean | 159 + .../FiniteLevel/LowerRamificationFormula.lean | 166 + .../LubinTate/FiniteLevel/NormSubgroup.lean | 121 + .../FiniteLevel/NormUniformizer.lean | 67 + .../FiniteLevel/ParameterCongruence.lean | 146 + .../FiniteLevel/PrimitiveAction.lean | 895 +++++ .../FiniteLevel/PrimitiveDisplacement.lean | 985 ++++++ .../FiniteLevel/PrimitiveEisenstein.lean | 138 + .../LubinTate/FiniteLevel/PrimitiveRoot.lean | 297 ++ .../FiniteLevel/PrimitiveTorsion.lean | 284 ++ .../FiniteLevel/PrimitiveUniformizer.lean | 937 +++++ .../FiniteLevel/StandardLocalField.lean | 313 ++ .../FiniteLevel/UpperRamification.lean | 107 + .../LubinTate/FormalModule.lean | 20 + .../LubinTate/FormalModule/All.lean | 26 + .../FormalModule/CoefficientEquation.lean | 90 + .../FormalModule/DegreeStabilization.lean | 925 +++++ .../LubinTate/FormalModule/Intertwiner.lean | 83 + .../LubinTate/FormalModule/LinearTerm.lean | 64 + .../FormalModule/RecursiveCoefficient.lean | 113 + .../FormalModule/RecursiveCorrection.lean | 659 ++++ .../FormalModule/RecursiveIntertwiner.lean | 1034 ++++++ .../LubinTate/FormalModule/Reduction.lean | 134 + .../LubinTate/FormalModule/Series.lean | 71 + .../FormalModule/StandardFormalGroup.lean | 983 ++++++ .../FormalModule/StandardSeries.lean | 71 + .../ClassFieldTheory/LubinTate/Padic.lean | 32 + .../ClassFieldTheory/LubinTate/Padic/All.lean | 35 + .../Padic/ChangedUniformizerCoefficient.lean | 295 ++ .../Padic/ChangedUniformizerIntertwiner.lean | 14 + .../ChangedUniformizerIntertwiner/All.lean | 17 + .../CompletedSeries.lean | 201 ++ .../DefectCorrection.lean | 694 ++++ .../IntertwinerConstruction.lean | 609 ++++ .../ScalarCompatibility.lean | 371 ++ .../ScalarEndomorphisms.lean | 569 ++++ .../CompletedChangedStandardCompositum.lean | 389 +++ .../CompletedChangedStandardFixedField.lean | 183 + .../CompletedChangedStandardFrobenius.lean | 200 ++ .../CompletedChangedStandardResidue.lean | 697 ++++ .../CompletedChangedStandardUnramified.lean | 349 ++ ...CompletedChangedUniformizerFixedField.lean | 555 +++ .../CompletedChangedUniformizerPrimitive.lean | 404 +++ ...CompletedChangedUniformizerThetaFixed.lean | 206 ++ .../Padic/CompletedFrobeniusEvaluation.lean | 520 +++ .../Padic/CompletedFrobeniusLift.lean | 520 +++ .../LubinTate/Padic/CompletedLevel.lean | 652 ++++ .../Padic/CompletedPrimitiveAction.lean | 760 +++++ .../Padic/CompletedPrimitiveIrreducible.lean | 150 + .../Padic/CompletedPrimitiveUniformizer.lean | 701 ++++ .../Padic/CompletedResidueFrobenius.lean | 217 ++ .../CompletedStandardLevelTransport.lean | 605 ++++ .../Padic/CompletedUnramifiedField.lean | 538 +++ .../CompletedUnramifiedFrobeniusFixed.lean | 212 ++ .../Padic/MultiplicativeEvaluation.lean | 15 + .../Padic/MultiplicativeEvaluation/All.lean | 14 + .../CompletedCoefficientEvaluation.lean | 409 +++ .../CompletedPrimitivePoint.lean | 365 ++ .../CompletedScalarEndomorphism.lean | 691 ++++ .../Padic/MultiplicativeEvaluation/Core.lean | 705 ++++ .../FiniteLevelEvaluation.lean | 409 +++ .../FiniteLevelPrimitiveRoot.lean | 1047 ++++++ .../Padic/MultiplicativeIntertwiner.lean | 385 +++ .../LubinTate/Padic/MultiplicativeSeries.lean | 109 + .../ClassFieldTheory/RamificationTheory.lean | 11 + .../RamificationTheory/All.lean | 14 + .../HilbertRamification.lean | 13 + .../HilbertRamification/All.lean | 15 + .../HilbertRamification/Dedekind.lean | 12 + .../HilbertRamification/Dedekind/All.lean | 15 + .../Dedekind/ChosenInertiaCoverage.lean | 113 + .../Dedekind/InertiaGeneration.lean | 64 + .../Dedekind/PadicValuationInertia.lean | 623 ++++ .../PadicCyclotomicInertiaBound.lean | 171 + ...PadicCyclotomicRamificationIndexBound.lean | 175 + .../PadicLocalizationCanonicalValuation.lean | 244 ++ .../RamificationIndexComparison.lean | 150 + .../ClassFieldTheory/Theorems.lean | 17 + .../ClassFieldTheory/Theorems/All.lean | 15 + .../Theorems/ConductorsAndRayClassFields.lean | 56 + ...AbelianConductorFiniteExponentIsLeast.lean | 47 + .../AbelianConductorFiniteNormCriterion.lean | 94 + .../AbelianConductorFiniteSupport.lean | 53 + .../AbelianConductorFiniteUnramified.lean | 66 + .../AbelianConductorRayClassFieldLe.lean | 30 + .../AbelianConductorRealRamification.lean | 42 + .../AbelianConductorTameCriterion.lean | 139 + .../ConductorsAndRayClassFields/All.lean | 61 + ...EmbedsInEveryRayClassFieldRealization.lean | 45 + .../EmbedsInRayClassFieldIffConductorLe.lean | 38 + .../ExistsAbelianConductor.lean | 28 + .../ExistsRayArtinModulusProjection.lean | 104 + .../ExistsUniqueAbelianConductor.lean | 29 + .../FractionalIdealNormPrimeExponent.lean | 43 + .../IsAbelianConductorUnique.lean | 30 + .../IsRayCongruentOfLe.lean | 44 + ...rowRayClassGroupEquivNarrowClassGroup.lean | 137 + .../OrdinaryNarrowModuliEqOfNoReal.lean | 30 + .../OrdinaryRayClassGroupEquivClassGroup.lean | 40 + .../RayArtinModulusProjection.lean | 178 + .../RayClassFieldDegree.lean | 38 + .../RayClassFieldModulusMonotone.lean | 41 + .../RayClassFieldPrimeSplitting.lean | 62 + .../RayClassFieldReciprocity.lean | 41 + .../RayClassGroupFinite.lean | 32 + .../RayClassGroupHomExtFinitePrime.lean | 59 + ...sIdealArtinKerEqNormRangeSupPrincipal.lean | 52 + .../RayClassIdealModulusProjectionPrime.lean | 41 + ...ClassIdealModulusProjectionSurjective.lean | 144 + .../RayClassIdealNormImageEqArtinKer.lean | 56 + .../RayClassIdealNormImageLeArtinKer.lean | 35 + .../RayClassSubgroupDegree.lean | 37 + .../RayClassSubgroupEmbedding.lean | 158 + .../RayClassSubgroupExistence.lean | 32 + .../RayClassSubgroupFieldAntitone.lean | 43 + .../RayClassSubgroupPrimeInertiaDegree.lean | 55 + .../RayClassSubgroupPrimeSplitting.lean | 56 + .../RayClassSubgroupQuotient.lean | 32 + .../RayClassSubgroupQuotientEquivMk.lean | 33 + .../RayClassSubgroupRealizationEq.lean | 30 + .../RayClassSubgroupRealizationEquiv.lean | 48 + .../RayLocalHigherUnitAntitone.lean | 33 + .../RayLocalHigherUnitMembership.lean | 75 + .../RayLocalHigherUnitOneAdd.lean | 85 + .../RayLocalHigherUnitOpen.lean | 36 + .../RayLocalHigherUnitZero.lean | 34 + .../RayPrincipalIdealMembership.lean | 54 + .../RayPrincipalIdealPrimeTo.lean | 49 + .../FrobeniusAndHilbertClassFields.lean | 35 + .../FrobeniusAndHilbertClassFields/All.lean | 39 + .../ArithmeticFrobeniusAlgEquivTransport.lean | 67 + ...eticFrobeniusEqOneIffSplitsCompletely.lean | 60 + ...ArithmeticFrobeniusIndependentOfPrime.lean | 54 + .../ArithmeticFrobeniusIsArithmetic.lean | 38 + .../ArithmeticFrobeniusOrder.lean | 95 + .../ArithmeticFrobeniusRestrictTower.lean | 79 + .../BigHilbertClassFieldArtinEquiv.lean | 66 + .../BigHilbertClassFieldDegree.lean | 40 + .../BigHilbertClassFieldExists.lean | 29 + ...HilbertClassFieldNarrowRayRealization.lean | 54 + .../BigHilbertClassFieldPrimeSplitting.lean | 56 + ...sFieldPrimeSplittingPositivePrincipal.lean | 47 + .../BigHilbertClassFieldUnique.lean | 47 + ...wRayRealizationIsBigHilbertClassField.lean | 47 + ...ayRealizationIsSmallHilbertClassField.lean | 56 + .../SmallBigHilbertClassFieldIffOfNoReal.lean | 56 + .../SmallHilbertClassFieldArtinEquiv.lean | 65 + .../SmallHilbertClassFieldDegree.lean | 31 + .../SmallHilbertClassFieldEmbedsInBig.lean | 29 + .../SmallHilbertClassFieldExists.lean | 28 + .../SmallHilbertClassFieldLeBig.lean | 38 + ...lbertClassFieldOrdinaryRayRealization.lean | 50 + .../SmallHilbertClassFieldPrimeSplitting.lean | 40 + ...mallHilbertClassFieldPrincipalization.lean | 31 + .../SmallHilbertClassFieldUnique.lean | 47 + ...SmallHilbertClassFieldUniqueUpToEquiv.lean | 38 + .../Theorems/GlobalClassFieldTheory.lean | 19 + .../Theorems/GlobalClassFieldTheory/All.lean | 23 + .../FiniteAbelianGlobalReciprocity.lean | 56 + ...initeAbelianGlobalReciprocityQuotient.lean | 37 + ...niteAbelianReciprocityQuotientEquivMk.lean | 35 + .../FinitePlaceCompletionLocalArtin.lean | 163 + .../FinitePlaceLocalGlobalNormKernel.lean | 84 + .../FinitePlaceRayArtinDecomposition.lean | 141 + .../FinitePlaceRayArtinLocalValue.lean | 292 ++ .../FinitePlaceRayArtinNormKernel.lean | 125 + .../MaximalAbelianGlobalArtin.lean | 54 + .../TopologicalGlobalReciprocity.lean | 60 + .../ClassFieldTheory/Theorems/HasseArf.lean | 30 + .../Theorems/HasseArf/All.lean | 28 + .../Theorems/HasseArf/HasseArf.lean | 109 + ...erbrandFunctionAtLowerIndexDifference.lean | 32 + ...HerbrandFunctionAtLowerIndexNatOfJump.lean | 64 + ...erbrandFunctionAtLowerIndexStrictMono.lean | 38 + .../HasseArf/HerbrandFunctionCanonical.lean | 50 + ...rbrandFunctionInverseHerbrandFunction.lean | 59 + .../HasseArf/HerbrandFunctionNat.lean | 28 + ...verseHerbrandFunctionHerbrandFunction.lean | 58 + .../HasseArf/IsUpperRamificationJumpInt.lean | 50 + .../LowerRamificationGroupAntitone.lean | 28 + .../LowerRamificationGroupEventuallyBot.lean | 87 + .../LowerRamificationGroupNormal.lean | 44 + .../LowerRamificationGroupZeroEqInertia.lean | 54 + .../RealAndUpperRamificationGroupNormal.lean | 36 + .../RealLowerRamificationGroupCanonical.lean | 44 + .../RealLowerRamificationGroupNat.lean | 29 + .../RealLowerRamificationGroupNormal.lean | 44 + .../HasseArf/UpperRamificationGroupAfter.lean | 30 + .../UpperRamificationGroupAntitone.lean | 34 + .../UpperRamificationGroupCanonical.lean | 36 + .../UpperRamificationGroupEventuallyBot.lean | 52 + .../Theorems/HilbertSymbols.lean | 41 + .../Theorems/HilbertSymbols/All.lean | 45 + .../FinitePlaceHilbertBadSetFinite.lean | 77 + .../GlobalHilbertPairingFiniteSupport.lean | 54 + .../GlobalHilbertPairingSupportBound.lean | 85 + .../HilbertSymbols/HilbertPairingPerfect.lean | 93 + .../HilbertPairingSymbolMul.lean | 27 + .../HilbertPairingSymbolMulRight.lean | 26 + .../HilbertSymbols/HilbertProductFormula.lean | 76 + .../KummerAlgebraCopiesOfSimpleFactor.lean | 81 + .../KummerAlgebraFiniteEtale.lean | 87 + .../KummerAlgebraFiniteFree.lean | 34 + .../HilbertSymbols/KummerAlgebraFinrank.lean | 30 + ...KummerAlgebraNormIffSimpleRadicalNorm.lean | 39 + .../KummerAlgebraNormIndex.lean | 39 + .../KummerAlgebraNormProduct.lean | 54 + .../KummerAlgebraOneNormSurjective.lean | 61 + .../KummerAlgebraProductDecomposition.lean | 82 + .../KummerAlgebraUniformFactorDegree.lean | 84 + .../KummerAlgebraUniformFieldFactors.lean | 94 + .../KummerRadicalDegreeEqPowerClassOrder.lean | 116 + ...LocalHilbertPairingArtinNormalization.lean | 104 + .../LocalHilbertPairingExists.lean | 64 + ...alHilbertPairingExponentCompatibility.lean | 127 + .../LocalHilbertPairingInverse.lean | 47 + .../LocalHilbertPairingNormCriterion.lean | 33 + .../LocalHilbertPairingPerfectExists.lean | 39 + .../HilbertSymbols/PowerClassEqIff.lean | 27 + .../HilbertSymbols/PowerClassEqOneIff.lean | 29 + .../HilbertSymbols/PowerClassGroupFinite.lean | 48 + .../HilbertSymbols/PowerClassInv.lean | 25 + .../HilbertSymbols/PowerClassMul.lean | 25 + .../HilbertSymbols/PowerClassPow.lean | 25 + .../RootQuotientChoiceIndependence.lean | 64 + .../Theorems/KroneckerWeber.lean | 45 + .../Theorems/LocalClassFieldTheory.lean | 29 + .../Theorems/LocalClassFieldTheory/All.lean | 33 + .../FieldNormSubgroupFiniteIndex.lean | 30 + .../FieldNormSubgroupIsOpen.lean | 30 + .../FieldNormSubgroupRingEquiv.lean | 39 + .../FieldNormSubgroupTower.lean | 37 + .../FiniteAbelianLocalExistence.lean | 41 + .../FiniteAbelianLocalExistenceOrderIso.lean | 42 + .../FiniteAbelianLocalReciprocity.lean | 43 + .../FiniteAbelianLocalReciprocityFamily.lean | 71 + ...lReciprocityFamilyArithmeticFrobenius.lean | 99 + ...initeAbelianLocalReciprocityFamilyExt.lean | 201 ++ ...iprocityFamilyUnramifiedNormalization.lean | 118 + .../FiniteAbelianLocalReciprocityIndex.lean | 30 + ...FiniteAbelianLocalReciprocityQuotient.lean | 39 + ...belianLocalReciprocityQuotientEquivMk.lean | 49 + ...nLocalReciprocityQuotientEquivOfArtin.lean | 74 + .../FiniteAbelianLocalReciprocityTower.lean | 57 + ...anLocalReciprocityUnramifiedFamilyExt.lean | 96 + ...elianLocalReciprocityUnramifiedHomExt.lean | 112 + ...calReciprocityUnramifiedNormalization.lean | 85 + .../MemFieldNormSubgroupIff.lean | 40 + .../Theorems/NormTheorems.lean | 18 + .../Theorems/NormTheorems/All.lean | 20 + .../CompletionTensorNormDecomposition.lean | 61 + ...etionTensorNormDecompositionCanonical.lean | 84 + .../ComplexInfinitePlaceAllNorm.lean | 45 + .../NormTheorems/CyclicHasseNormTheorem.lean | 38 + .../GlobalNormIsEverywhereLocalNorm.lean | 55 + .../NormTheorems/InfiniteNormIffPositive.lean | 72 + .../NegativeOneNotInfiniteNorm.lean | 58 + .../NormTheorems/TensorNormBaseChange.lean | 46 + .../UnramifiedInfinitePlaceAllNorm.lean | 43 + .../ClassFieldTheory/GaloisCohomology.lean | 13 + .../GaloisCohomology/Cyclic.lean | 14 + .../Cyclic/GaloisCohomology.lean | 84 + .../GaloisCohomology/Cyclic/Herbrand.lean | 15 + .../Cyclic/Herbrand/HerbrandFiniteness.lean | 457 +++ .../Cyclic/Herbrand/HerbrandLowDegree.lean | 16 + .../Herbrand/HerbrandLowDegree/Basic.lean | 1719 ++++++++++ .../HerbrandLowDegree/BinaryProduct.lean | 231 ++ .../HerbrandLowDegree/Cardinality.lean | 535 +++ .../Herbrand/HerbrandLowDegree/Core.lean | 125 + .../HerbrandLowDegree/EquivariantEquiv.lean | 315 ++ .../Herbrand/HerbrandLowDegree/Index.lean | 122 + .../Herbrand/HerbrandLowDegree/Product.lean | 332 ++ .../HerbrandLowDegree/TateComparison.lean | 361 ++ .../Cyclic/Herbrand/Induced.lean | 1189 +++++++ .../Cyclic/Herbrand/NormalBasisLattice.lean | 2276 +++++++++++++ .../Cyclic/Herbrand/Permutation.lean | 11 + .../Cyclic/Herbrand/Permutation/Lattice.lean | 891 +++++ .../Herbrand/Permutation/LatticeHerbrand.lean | 1004 ++++++ .../Cyclic/Herbrand/Permutation/Module.lean | 1463 ++++++++ .../Cyclic/Herbrand/PrincipalUnits.lean | 10 + .../Herbrand/PrincipalUnits/QuotientReps.lean | 120 + .../PrincipalUnits/QuotientTower.lean | 745 ++++ .../Cyclic/Herbrand/Product.lean | 80 + .../Cyclic/IntegralRepUniverse.lean | 17 + .../Cyclic/NormKernelVanishing.lean | 145 + .../Cyclic/TateComparison.lean | 135 + .../GaloisCohomology/Cyclic/TateH0.lean | 11 + .../Cyclic/TateH0/Invariants.lean | 149 + .../GaloisCohomology/Cyclic/TateH0/Main.lean | 51 + .../Cyclic/TateH0/NormImage.lean | 197 ++ .../GaloisCohomology/GroupTheory.lean | 14 + .../GroupTheory/Augmentation.lean | 490 +++ .../GaloisCohomology/GroupTheory/Finite.lean | 331 ++ .../GroupTheory/Quotient.lean | 122 + .../GroupTheory/QuotientTower.lean | 59 + .../GroupTheory/RestrictionKernel.lean | 38 + .../GroupTheory/Transfer.lean | 10 + .../Transfer/RelativeAugmentation.lean | 1025 ++++++ .../GroupTheory/Transfer/Witt.lean | 1291 +++++++ .../GaloisCohomology/Kummer.lean | 10 + .../GaloisCohomology/Kummer/Abstract.lean | 14 + .../Abstract/KummerAbelianAssembly.lean | 253 ++ .../Abstract/KummerAbelianCyclicFactors.lean | 314 ++ .../Kummer/Abstract/KummerCyclicOperator.lean | 190 ++ .../Kummer/Abstract/KummerDelta.lean | 177 + .../Kummer/Abstract/KummerFixedField.lean | 106 + .../Kummer/Abstract/KummerGlobalOperator.lean | 163 + .../GaloisCohomology/Kummer/Concrete.lean | 30 + .../Kummer/Concrete/Cyclotomic.lean | 13 + .../ProfiniteUnitDecomposition.lean | 20 + .../ProfiniteUnitDecomposition/Basic.lean | 93 + .../CyclotomicQuotient.lean | 30 + .../Decomposition.lean | 33 + .../DenseTorsion.lean | 68 + .../FiniteFree.lean | 41 + .../FiniteOrder.lean | 66 + .../FreeCoordinate.lean | 46 + .../ProfiniteUnitDecomposition/Gather.lean | 30 + .../ProfiniteUnitDecomposition/Local.lean | 29 + .../ProfiniteUnitDecomposition/Swap.lean | 27 + .../TorsionQuotientEquiv.lean | 107 + .../TorsionQuotientMk.lean | 39 + .../RationalCyclotomicCharacter.lean | 170 + .../RationalCyclotomicCharacterEquiv.lean | 433 +++ .../Cyclotomic/RationalCyclotomicField.lean | 137 + .../RationalCyclotomicTorsionField.lean | 87 + .../Kummer/Concrete/CyclotomicField.lean | 74 + .../Kummer/Concrete/ExtensionRoundTrip.lean | 128 + .../Kummer/Concrete/FiniteCharacterEquiv.lean | 160 + .../Kummer/Concrete/FiniteDualSeparation.lean | 316 ++ .../Kummer/Concrete/FiniteGeneration.lean | 148 + .../Kummer/Concrete/FiniteSupport.lean | 465 +++ .../Kummer/Concrete/GaloisCohomology.lean | 147 + .../Kummer/Concrete/InfiniteContinuity.lean | 213 ++ .../Kummer/Concrete/InfiniteGeneration.lean | 79 + .../Kummer/Concrete/InfiniteInverse.lean | 265 ++ .../Concrete/KummerCorrespondenceFormula.lean | 508 +++ .../Concrete/LocalMaximalKummerExtension.lean | 66 + .../Concrete/LocalUnitKummerUnramified.lean | 137 + .../Concrete/MaximalKummerSubgroup.lean | 66 + .../Kummer/Concrete/RadicalExtension.lean | 337 ++ .../Kummer/Concrete/RadicalQuotient.lean | 305 ++ .../Kummer/Concrete/RestrictedFinite.lean | 532 +++ .../Kummer/Concrete/RootCharacters.lean | 339 ++ .../Kummer/Concrete/SUnitPreparation.lean | 9 + .../PrimePowerKernelCoordinates.lean | 323 ++ .../Kummer/Concrete/SimpleExtension.lean | 343 ++ .../Kummer/Concrete/SimpleExtensionNorm.lean | 257 ++ .../GaloisCohomology/ProfiniteIntegers.lean | 14 + .../CyclotomicTorsionQuotient.lean | 70 + .../ProfiniteIntegers/ProfiniteInteger.lean | 270 ++ .../ProfiniteIntegerCore.lean | 225 ++ .../ProfiniteIntegerPrimeProduct.lean | 344 ++ .../ProfiniteIntegerUnits.lean | 59 + .../TopologicalGeneration.lean | 201 ++ .../GaloisCohomology/Topology.lean | 9 + .../TotallyDisconnectedQuotients.lean | 184 + LeanPool/ClassFieldTheory/ProCGroups.lean | 9 + .../ProCGroups/InducedFunctions.lean | 116 + .../ClassFieldTheory/ValuedFieldTheory.lean | 11 + .../ValuedFieldTheory/LocalField.lean | 15 + .../LocalField/Analytic.lean | 18 + .../LocalField/Analytic/Arithmetic.lean | 743 ++++ .../Analytic/ContinuousFieldUnitLog.lean | 521 +++ .../Analytic/DenominatorValuation.lean | 245 ++ .../Analytic/FieldUnitLogExtension.lean | 264 ++ .../Analytic/FieldUnitLogUniqueness.lean | 127 + .../LocalField/Analytic/LogExpAdditivity.lean | 747 ++++ .../Analytic/LogExpComposition.lean | 785 +++++ .../LocalField/Analytic/LogExpContinuity.lean | 504 +++ .../LocalField/Analytic/LogExpSeries.lean | 18 + .../Analytic/LogExpSeries/ExpConvergence.lean | 1184 +++++++ .../Analytic/LogExpSeries/FormalCore.lean | 431 +++ .../Analytic/LogExpSeries/FormalCoreBase.lean | 14 + .../FormalCoreBase/BasicFactors.lean | 332 ++ .../FormalCoreBase/ChoiceCountSystem.lean | 277 ++ .../FormalCoreBase/ChoicePositions.lean | 276 ++ .../FormalCoreBase/ExplicitChoiceCounts.lean | 267 ++ .../PowerSeriesComposition.lean | 222 ++ .../FormalCoreBase/ProductArgument.lean | 386 +++ .../Analytic/LogExpSeries/FormalProduct.lean | 1587 +++++++++ .../Analytic/LogExpSeries/Homomorphisms.lean | 1404 ++++++++ .../LogExpSeries/InverseEstimates.lean | 1199 +++++++ .../Analytic/LogExpSeries/LogConvergence.lean | 1151 +++++++ .../LogExpSeries/PrincipalUnitExp.lean | 1066 ++++++ .../LogExpSeries/PrincipalUnitLog.lean | 1276 +++++++ .../Analytic/LogExpSeries/SeriesTerms.lean | 1175 +++++++ .../Analytic/PrincipalUnitExpLogEquiv.lean | 164 + .../LocalField/DiscreteValuationField.lean | 41 + .../DiscreteValuationField/Basic.lean | 506 +++ .../EqualCharacteristicLaurent.lean | 1153 +++++++ .../DiscreteValuationField/FieldNorm.lean | 1933 +++++++++++ .../DiscreteValuationField/FieldNormBase.lean | 225 ++ .../FieldNormEquiv.lean | 56 + .../FieldUnitDecomposition.lean | 1337 ++++++++ .../FieldUnitFactors.lean | 323 ++ .../FieldUnitPowerIndexFormulas.lean | 435 +++ .../FieldUnitStructure.lean | 139 + .../FiniteCoefficientLaurent.lean | 371 ++ .../IwasawaIndexing.lean | 82 + .../IwasawaPrincipalUnits.lean | 2634 +++++++++++++++ .../MixedCharacteristicQp.lean | 1028 ++++++ .../MixedCharacteristicStructure.lean | 11 + .../MixedCharacteristicStructure/Core.lean | 568 ++++ .../DeepPrincipalUnits.lean | 569 ++++ .../IntegralLattice.lean | 1134 +++++++ .../DiscreteValuationField/Norm.lean | 10 + .../DiscreteValuationField/Norm/Basic.lean | 1077 ++++++ .../Norm/Quotients.lean | 2865 ++++++++++++++++ .../NormFiltration.lean | 1609 +++++++++ .../DiscreteValuationField/PadicField.lean | 383 +++ .../PadicLinearOfContinuous.lean | 120 + .../PadicModuleStructure.lean | 101 + .../PadicPowerIndex.lean | 690 ++++ .../PadicValuationComparison.lean | 107 + .../PolynomialRootProximity.lean | 147 + .../DiscreteValuationField/PowerIndex.lean | 818 +++++ ...PrincipalUnitInverseLimitSurjectivity.lean | 159 + .../PrincipalUnitPadicAction.lean | 19 + .../AdicPadicModule.lean | 287 ++ .../AdicProdiscreteComparison.lean | 213 ++ .../PrincipalUnitPadicAction/Core.lean | 159 + .../FiniteQuotientPadicModule.lean | 417 +++ .../InverseLimitCore.lean | 439 +++ .../InverseLimitTopology.lean | 494 +++ .../PadicReductionContinuous.lean | 56 + .../ProdiscretePadicModule.lean | 333 ++ .../QuotientTransition.lean | 77 + .../TopologyModelTypes.lean | 382 +++ .../WithZeroValuationTopology.lean | 225 ++ .../PrincipalUnits.lean | 15 + .../PrincipalUnits/AutomorphismTransport.lean | 385 +++ .../PrincipalUnits/Core.lean | 1363 ++++++++ .../PrincipalUnits/Filtration.lean | 255 ++ .../PrincipalUnits/ResidueQuotient.lean | 98 + .../PrincipalUnits/ResidueRoots.lean | 300 ++ .../TeichmullerDecomposition.lean | 580 ++++ .../PrincipalUnits/TeichmullerLift.lean | 360 ++ .../RamificationAddVal.lean | 168 + .../RamificationIdeal.lean | 346 ++ .../RamificationInvariants.lean | 389 +++ .../DiscreteValuationField/Units.lean | 1372 ++++++++ .../ValuationSubringUnits.lean | 19 + .../CompleteRangeRestriction.lean | 255 ++ .../CyclicValueGroup.lean | 172 + .../IntegerValuation.lean | 184 + .../IntegerValuationUniformizer.lean | 135 + .../LocalFieldRangeRestriction.lean | 71 + .../RangeRestrictedTopology.lean | 385 +++ .../RangeRestriction.lean | 155 + .../SeriesValuationEstimates.lean | 364 ++ .../UniformizerIntegerValuation.lean | 211 ++ .../ValuationSubringUnitMap.lean | 65 + .../ValuedExtensionUnitMap.lean | 129 + .../DiscreteValuationField/ValueGroup.lean | 210 ++ .../WithZeroValuationTopology.lean | 107 + .../LocalField/GroupTheory.lean | 11 + .../GroupTheory/ContinuousQuotientEquiv.lean | 60 + .../GroupTheory/IntegerMultipleSubgroup.lean | 149 + .../LocalField/GroupTheory/PowerIndex.lean | 929 +++++ .../LocalField/NonarchimedeanLocalField.lean | 40 + .../AdditiveEquiv.lean | 37 + .../NonarchimedeanLocalField/Basic.lean | 225 ++ .../FiniteExtensionCompleteDVF.lean | 203 ++ .../FiniteExtensionTopology.lean | 288 ++ .../FiniteUnramified.lean | 945 ++++++ .../GaloisIntegerRing.lean | 781 +++++ .../IdealQuotients.lean | 914 +++++ .../MultiplicativeDecomposition.lean | 170 + .../NonarchimedeanLocalField/Norm.lean | 257 ++ .../NormContinuity.lean | 66 + .../NormQuotient.lean | 382 +++ .../NormSubgroupFunctoriality.lean | 82 + .../NormalizedIntegerValuation.lean | 294 ++ .../PowerClassFiniteness.lean | 114 + .../PrincipalUnitActions.lean | 544 +++ .../PrincipalUnitQuotients.lean | 1561 +++++++++ .../PrincipalUnits.lean | 211 ++ .../ProfiniteUnits.lean | 79 + .../ResidueExtension.lean | 514 +++ .../ResidueGalois.lean | 404 +++ .../ResidueUnits.lean | 341 ++ .../SeparableNormValuation.lean | 778 +++++ .../ShrinkTransport.lean | 256 ++ .../NonarchimedeanLocalField/Small.lean | 56 + .../StandardOpenSubgroups.lean | 102 + .../UniformizerPrincipalQuotient.lean | 181 + .../UnitTopology.lean | 70 + .../UnramifiedFrobenius.lean | 585 ++++ .../NonarchimedeanLocalField/Valuation.lean | 75 + .../ValuationExactSequence.lean | 477 +++ .../ValuativeExtension.lean | 79 + .../ValuedTopology.lean | 67 + .../LocalField/NormUnits.lean | 47 + .../ValuedFieldTheory/LocalField/Padic.lean | 13 + .../LocalField/Padic/ClosedAddSubgroup.lean | 130 + .../LocalField/Padic/Cyclotomic.lean | 10 + .../Padic/Cyclotomic/TotallyRamified.lean | 16 + .../TotallyRamified/EisensteinPolynomial.lean | 295 ++ .../TotallyRamified/EisensteinRelation.lean | 110 + .../Cyclotomic/TotallyRamified/Existence.lean | 87 + .../TotallyRamified/IntegralClosure.lean | 181 + .../TotallyRamified/IntegralTranslate.lean | 63 + .../TotallyRamified/PrimeElement.lean | 115 + .../TotallyRamified/RamificationIndex.lean | 194 ++ .../TotallyRamified/ValuationRingEquiv.lean | 119 + .../Padic/Cyclotomic/Unramified.lean | 9 + .../Unramified/ArithmeticFrobenius.lean | 1775 ++++++++++ .../Padic/NonarchimedeanLocalField.lean | 89 + .../LocalField/Padic/PrincipalUnits.lean | 529 +++ .../LocalField/Padic/UnitDecomposition.lean | 605 ++++ .../LocalField/Unramified.lean | 22 + .../LocalField/Unramified/BaseChange.lean | 397 +++ .../LocalField/Unramified/BaseChangeCore.lean | 350 ++ .../Unramified/BasicInvariants.lean | 409 +++ .../LocalField/Unramified/Composition.lean | 235 ++ .../LocalField/Unramified/Definitions.lean | 299 ++ .../LocalField/Unramified/FiniteSupport.lean | 159 + .../Unramified/HenselReduction.lean | 72 + .../HenselianAlgebraicExtension.lean | 162 + .../LocalField/Unramified/MaximalResidue.lean | 123 + .../Unramified/MaximalSubextension.lean | 96 + .../Unramified/RamificationIndexTower.lean | 119 + .../Unramified/ResidueEmbedding.lean | 231 ++ .../LocalField/Unramified/ResidueLifting.lean | 394 +++ .../LocalField/Unramified/Separable.lean | 382 +++ .../ValuedFieldTheory/Ramification.lean | 17 + .../Ramification/ClosedSubgroups.lean | 216 ++ .../Ramification/Different.lean | 708 ++++ .../Ramification/Filtration.lean | 123 + .../Ramification/GaloisValuation.lean | 14 + .../GaloisValuation/AbsoluteGalois.lean | 12 + .../AbsoluteGalois/AbsoluteRamification.lean | 959 ++++++ .../FiniteExtensionCorrespondence.lean | 1652 +++++++++ .../FiniteLevelValuationRestriction.lean | 342 ++ .../InfiniteGaloisCorrespondence.lean | 1757 ++++++++++ .../GaloisValuation/ClosedFixingSubgroup.lean | 27 + .../CompositumRestriction.lean | 183 + .../IntermediateFieldRestriction.lean | 48 + .../GaloisValuation/Ramification.lean | 1757 ++++++++++ .../RamificationQuotients.lean | 600 ++++ .../Ramification/Herbrand.lean | 13 + .../Ramification/Herbrand/Average.lean | 418 +++ .../Ramification/Herbrand/FixedField.lean | 134 + .../Ramification/Herbrand/Function.lean | 484 +++ .../Ramification/Herbrand/Quotient.lean | 316 ++ .../Ramification/Herbrand/Tower.lean | 253 ++ .../Ramification/HilbertRamification.lean | 53 + .../AbsoluteValueConjugacy.lean | 155 + .../AlgebraicLocalization.lean | 624 ++++ .../HilbertRamification/BaseChange.lean | 341 ++ .../HilbertRamification/CharacterMap.lean | 952 ++++++ .../HilbertRamification/CompleteDVF.lean | 504 +++ .../CyclotomicDegreeBound.lean | 105 + .../DecompositionField.lean | 77 + .../DecompositionFieldExtension.lean | 105 + .../DecompositionFieldLocalization.lean | 513 +++ .../DecompositionGroup.lean | 223 ++ .../HilbertRamification/Dedekind.lean | 19 + .../HilbertRamification/Dedekind/Basic.lean | 569 ++++ .../Dedekind/CompositumUnramified.lean | 355 ++ .../Dedekind/Conjugation.lean | 72 + .../Dedekind/FixedFieldTower.lean | 306 ++ .../Dedekind/FixedFieldUnramified.lean | 145 + .../Dedekind/FixedFields.lean | 303 ++ .../Dedekind/NumberFieldPrimes.lean | 574 ++++ .../Dedekind/OrbitCardinality.lean | 194 ++ .../Dedekind/PrimeContractions.lean | 189 ++ .../Dedekind/TowerInvariants.lean | 168 + .../Dedekind/ValuedGalois.lean | 59 + .../FiniteGaloisLevel.lean | 187 + .../FiniteGaloisLevelIndependence.lean | 375 ++ .../FiniteInertiaStructure.lean | 116 + .../FiniteOrderValuation.lean | 94 + .../FiniteRamificationPrimary.lean | 61 + .../FirstRamificationComparison.lean | 317 ++ .../FixedFieldRamification.lean | 265 ++ .../FixedFieldRamificationIndex.lean | 560 +++ .../FixedFieldValuationRing.lean | 443 +++ .../HilbertRamification/GaloisStabilizer.lean | 51 + .../HilbertRamification/HerbrandFunction.lean | 188 ++ .../HilbertRamification/HerbrandTheorem.lean | 1344 ++++++++ .../InertiaRamificationCard.lean | 95 + .../InertiaRestrictionCard.lean | 62 + .../LocalizationDensity.lean | 540 +++ .../LocalizationRamificationGroups.lean | 470 +++ .../HilbertRamification/Monogeneity.lean | 594 ++++ .../OrbitPolynomialIdeal.lean | 545 +++ .../PadicLocalization.lean | 110 + .../HilbertRamification/Polynomial.lean | 49 + .../RamificationCharacterization.lean | 89 + .../RamificationDepth.lean | 277 ++ .../RamificationGroup.lean | 173 + .../RamificationNumber.lean | 294 ++ .../RamificationNumberFormula.lean | 335 ++ .../RamificationNumberRestriction.lean | 202 ++ .../RamificationPrimeToResidueTorsion.lean | 115 + .../HilbertRamification/RealLowerGroups.lean | 570 ++++ .../ResidueExactSequence.lean | 460 +++ .../UniformizerGradedHom.lean | 1062 ++++++ .../UniqueExtensionIntegralClosure.lean | 217 ++ .../HilbertRamification/ValuationKrasner.lean | 113 + .../ValuationRestriction.lean | 67 + .../HilbertRamification/ValuationSubring.lean | 753 +++++ .../Ramification/InertiaCardinality.lean | 64 + .../Ramification/LocalField.lean | 13 + .../Ramification/LocalField/BaseChange.lean | 265 ++ .../Ramification/LocalField/Core.lean | 1045 ++++++ .../FirstRamificationComparison.lean | 92 + .../Ramification/LocalField/InertiaCard.lean | 64 + .../Ramification/LocalField/Unramified.lean | 187 + .../Ramification/ProfiniteInvariant.lean | 104 + .../ValuedFieldTheory/Valuation.lean | 17 + .../Valuation/AbsoluteValue.lean | 20 + .../AbsoluteValue/AlgebraicExtension.lean | 18 + .../AlgebraicExtension/Core.lean | 507 +++ .../FiniteNormExtension.lean | 1271 +++++++ .../AlgebraicExtension/NormFormula.lean | 271 ++ .../NormFormulaAbsoluteValue.lean | 240 ++ .../NormFormulaCoefficients.lean | 172 + .../NormFormulaExtension.lean | 312 ++ .../NormFormulaIntegralClosure.lean | 146 + .../RamificationInvariants.lean | 1568 +++++++++ .../UniqueExtensionCoefficients.lean | 293 ++ .../UniqueValuationSubring.lean | 124 + .../AbsoluteValue/AlgebraicLocalization.lean | 155 + .../Valuation/AbsoluteValue/Completeness.lean | 121 + .../Valuation/AbsoluteValue/Completion.lean | 472 +++ .../AbsoluteValue/ExponentialValuation.lean | 151 + .../Valuation/AbsoluteValue/Extension.lean | 21 + .../AbsoluteValue/Nonarchimedean.lean | 238 ++ .../Valuation/AbsoluteValue/Ostrowski.lean | 1170 +++++++ .../PrincipalAdicCompleteness.lean | 286 ++ .../AbsoluteValue/SpectralExtension.lean | 231 ++ .../Valuation/AbsoluteValue/Theory.lean | 11 + .../AbsoluteValue/Theory/AbsoluteValues.lean | 753 +++++ .../Valuation/AbsoluteValue/Theory/Core.lean | 844 +++++ .../Theory/ExponentialValuations.lean | 1541 +++++++++ .../AbsoluteValue/ValuationSubring.lean | 299 ++ .../Valuation/Completion.lean | 23 + .../Completion/AbsoluteValueExtensions.lean | 828 +++++ .../Completion/BaseChangeAdjoinRoot.lean | 187 + .../Completion/BaseChangeNormTrace.lean | 54 + .../Completion/CanonicalTensorMap.lean | 116 + .../Valuation/Completion/DegreeNormTrace.lean | 168 + .../ExtensionFactorClassification.lean | 1109 ++++++ .../Completion/ExtensionInvariants.lean | 578 ++++ .../Completion/FiniteLocalization.lean | 243 ++ .../Completion/FiniteProductNormTrace.lean | 203 ++ .../Valuation/Completion/Padic.lean | 137 + .../Valuation/Completion/PolynomialCRT.lean | 76 + .../Completion/PolynomialFactors.lean | 215 ++ .../SeparablePolynomialFactors.lean | 80 + .../TensorProductDecomposition.lean | 428 +++ .../TensorProductProductFormulas.lean | 90 + .../Valuation/DiscreteValuationField.lean | 26 + .../DiscreteValuationField/AddVal.lean | 51 + .../DiscreteValuationField/AdicPower.lean | 300 ++ .../AmbientUniformizer.lean | 301 ++ .../DiscreteValuationField/Basic.lean | 662 ++++ .../ChevalleyExtension.lean | 1378 ++++++++ .../DiscreteValuationField/Complete.lean | 388 +++ .../CompleteDVRExpansion.lean | 548 +++ .../DiscreteValuationField/Compositum.lean | 1009 ++++++ .../DiscreteValuationField/Extensions.lean | 501 +++ .../FiniteExtension.lean | 12 + .../FiniteExtension/Core.lean | 740 ++++ .../FiniteExtension/Defectless.lean | 61 + .../FiniteExtension/Degree.lean | 919 +++++ .../FiniteExtension/Uniqueness.lean | 1311 +++++++ .../FiniteIntegralClosure.lean | 761 +++++ .../DiscreteValuationField/Henselian.lean | 273 ++ .../HenselianFinite.lean | 319 ++ .../HenselianValuationExtension.lean | 159 + .../IntegralClosure.lean | 1790 ++++++++++ .../DiscreteValuationField/ResidueField.lean | 337 ++ .../ValuationExtension.lean | 271 ++ .../ValuationTransport.lean | 182 + .../Valuation/HenselLemma.lean | 328 ++ .../Valuation/Henselian.lean | 27 + .../AlgebraicExtensionUniqueness.lean | 51 + .../Henselian/AlgebraicIntegralClosure.lean | 107 + .../Valuation/Henselian/Complete.lean | 74 + .../Henselian/CoprimeFactorLifting.lean | 84 + .../Valuation/Henselian/Core.lean | 156 + .../Valuation/Henselian/EtaleLifting.lean | 43 + .../Valuation/Henselian/Factorization.lean | 23 + .../Henselian/Factorization/AdicLimits.lean | 278 ++ .../Henselian/Factorization/Assembly.lean | 275 ++ .../Henselian/Factorization/Basic.lean | 453 +++ .../Factorization/CoefficientMinimum.lean | 296 ++ .../Henselian/Factorization/Complete.lean | 77 + .../Henselian/Factorization/DegreeBounds.lean | 133 + .../Factorization/DivisionBounds.lean | 53 + .../Henselian/Factorization/ErrorPowers.lean | 239 ++ .../Factorization/FiniteApproximation.lean | 139 + .../Factorization/InfiniteApproximation.lean | 1039 ++++++ .../Henselian/Factorization/Iteration.lean | 361 ++ .../Factorization/PrincipalLimits.lean | 441 +++ .../Henselian/Factorization/Step.lean | 474 +++ .../Henselian/Factorization/Truncation.lean | 800 +++++ .../Henselian/Factorization/WeakLimits.lean | 367 ++ .../IrreduciblePolynomialBounds.lean | 811 +++++ .../IrreduciblePolynomialLifting.lean | 368 ++ .../Henselian/MonicFactorization.lean | 1149 +++++++ .../Henselian/NonmonicReduction.lean | 170 + .../Henselian/PrimitiveFactorization.lean | 375 ++ .../Henselian/PrimitiveReduction.lean | 348 ++ .../Henselian/SimpleRootFactorization.lean | 38 + .../Henselian/StandardEtaleLifting.lean | 75 + .../Henselian/UniqueAlgebraicExtensions.lean | 191 ++ .../Henselian/UniqueExtensionPrimitive.lean | 401 +++ .../Henselian/UniqueExtensionReduction.lean | 529 +++ .../ValuationExtensionCriterion.lean | 217 ++ .../Valuation/LocalRingEquiv.lean | 97 + .../ValuedFieldTheory/Valuation/Topology.lean | 13 + .../Topology/AdicCompletionInverseLimit.lean | 1759 ++++++++++ .../AdicCompletionInverseLimitRing.lean | 947 ++++++ .../Topology/AdicContractingFixedPoint.lean | 148 + .../Topology/CompatibleInverseLimit.lean | 165 + .../Valuation/Topology/Models.lean | 46 + .../Valuation/UniqueRing.lean | 278 ++ .../Valuation/ValuedAdicComplete.lean | 166 + LeanPool/projects.yml | 33 + 1819 files changed, 516795 insertions(+) create mode 100644 LeanPool/ClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean create mode 100644 LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean create mode 100644 LeanPool/ClassFieldTheory/ProCGroups.lean create mode 100644 LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean diff --git a/LeanPool.lean b/LeanPool.lean index 50fa6e5b30..1f5190ab18 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -528,6 +528,1823 @@ import LeanPool.Circuitlib.Circuit.Category.Sequential import LeanPool.Circuitlib.Circuit.Combinational import LeanPool.Circuitlib.Circuit.Gate import LeanPool.Circuitlib.Circuit.Wires +import LeanPool.ClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Topology +import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +import LeanPool.ClassFieldTheory.ProCGroups +import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +import LeanPool.ClassFieldTheory.ValuedFieldTheory +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete import LeanPool.ClassificationOfSurfaces import LeanPool.ClassificationOfSurfaces.API import LeanPool.ClassificationOfSurfaces.Basic diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean new file mode 100644 index 0000000000..5444fa3695 --- /dev/null +++ b/LeanPool/ClassFieldTheory.lean @@ -0,0 +1,1672 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +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..6a08f3d9d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory +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..a495215f9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree +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..698fee9af6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +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..60952f7c45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +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..6c1e2632e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +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..6acf806369 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -0,0 +1,1312 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.GroupTheory.QuotientGroup.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger + +/-! # Fields -/ +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. -/ +@[simp] 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. -/ +@[simp] 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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal + (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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal 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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal 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 extensionQuotient_groupInstance (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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal 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. -/ +@[simp] 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. -/ +@[simp] 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. -/ +@[simp] 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..955fcf3e4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields + +/-! # Frobenius -/ +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 + (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) + (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) (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..afc74b3d89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -0,0 +1,1137 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +/-! # Frobenius Fixed Field -/ +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. -/ +private 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. -/ +private 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] [T2Space 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] [T2Space 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 := + (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. -/ +@[simp] +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) + [IsTopologicalGroup 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] [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) : + 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] [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.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] [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) : + (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] [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 σ) : + (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] [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) : + 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] [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 ⧸ 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 frobeniusFixedField_normalizedDegreeEquiv (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.frobeniusFixedField_normalizedDegreeEquiv 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.frobeniusFixedField_normalizedDegreeEquiv 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.frobeniusFixedField_normalizedDegreeEquiv K L hLK σ).injective + rw [D.frobeniusFixedField_normalizedDegreeEquiv_apply] + rw [D.fixedFieldNormalizedDegree_generator] + exact + ((D.frobeniusFixedField_normalizedDegreeEquiv 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..fc3784b7cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius + +/-! # Frobenius Lift -/ +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 + (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..a3f574ef72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +/-! # Indices -/ +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] + +private 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⟩ + +private 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) fun x y h ↦ + (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) + ⟨kernelCosetToSaturationCoset_injective d L K, + 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..371af04fa8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.GroupTheory.Index +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta + +/-! # Norm -/ +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..8b79d81660 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Norm Conjugation -/ +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..f4a7b28602 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -0,0 +1,460 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +/-! # Norm Laws -/ +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 + +private 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)`. +-/ +@[simp] +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..4c4902ba5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import Mathlib.GroupTheory.Index +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. +-/ + +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..b4fca591bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +/-! # Prime Elements -/ +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..01759c99c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.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 +-/ + +import Mathlib.Data.ZMod.QuotientGroup +import Mathlib.GroupTheory.Archimedean +import Mathlib.GroupTheory.FiniteIndexNormalSubgroup +import Mathlib.Topology.Algebra.Group.Quotient +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Completion +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +/-! # Profinite Integer Finite Quotient -/ +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] + +private 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 + (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 + (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 + (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 + (finiteIndexNormalAddSubgroup_index_pos H) x = + zHatReduction H.toAddSubgroup.index + (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) + ⟨zHatToIntegerProfiniteCompletion_injective, + 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..ae40e21f7b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm + +/-! # Valuation -/ +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`. -/ +@[simp] +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 cyclic_value_quotients (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.cyclic_value_quotients 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.cyclic_value_quotients 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..4f677da326 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws + +/-! # Valuation Laws -/ +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..594b3b6421 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase +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..13b1fb7244 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +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..64f8a5ed2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.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 +-/ + +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. +-/ + +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..8d0c1bff5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +/-! # Class Field Axiom -/ +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..2dfcef7ad2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +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. +-/ + +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..68fdb84ca9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +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..b93c545658 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +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..ef7e3ed2cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Canonical Unramified Norm Quotient -/ +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. -/ +@[simp] +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.cyclic_value_quotients 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) + (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..e5a59e91bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal + +/-! # Chosen Degree One Frobenius -/ +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..f6bf94ae20 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation + +/-! # Core Frobenius Norm -/ +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)`. -/ +private 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) + (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)`. -/ +private 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] + +/-- Defines `frobeniusFixedCosetClosureEquiv`. -/ +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 σ) + (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. -/ +private 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 φ σ) + (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`. -/ +private 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⟩ + +/-- Defines `frobeniusNormIdentityCosetEquiv`. -/ +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 φ σ) + (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 : Fintype + ((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..a1c8189f1f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import Mathlib.GroupTheory.DoubleCoset +import Mathlib.GroupTheory.GroupAction.Quotient +import Mathlib.Topology.Algebra.Group.ClosedSubgroup +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. +-/ + +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. -/ +@[simp] +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..a0208c40fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction + +/-! # Finite Field Unit Maps -/ +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..8da2b9684e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +/-! # Finite Intermediate Compositum -/ +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..1dda8dabe2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +/-! # Finite Intermediate Field Compositum -/ +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..335f5ff1e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Finite Norm Quotient -/ +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) + (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..13fdfc60d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +/-! # Fixed Tower Unit Correction -/ +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..c4f320369e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean @@ -0,0 +1,653 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent + +/-! # Fixed Tower Unit Descent -/ +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..ac4e136d3e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +/-! # Frobenius Closure Commutation -/ +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] [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) + (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..4e532effaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField + +/-! # Frobenius Descent -/ +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] [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)] : + 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] [CompactSpace G] [T2Space 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..8409f0e516 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean @@ -0,0 +1,725 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +/-! # Frobenius Field -/ +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..f781d9e240 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation + +/-! # Frobenius Fixed Field Action -/ +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..1009fa5ff7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +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. +-/ + +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..cf24b4485b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -0,0 +1,700 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum + +/-! # Frobenius Power Fixed Field -/ +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, 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] [CompactSpace G] [T2Space 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..8e6cba6842 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent + +/-! # Frobenius Quotient Descent -/ +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) [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) + (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..7d521a4fc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +/-! # Frobenius Semigroup -/ +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`. +-/ +@[simp] +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..32a1de27d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean @@ -0,0 +1,508 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +/-! # Infinite Unit Descent -/ +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..40f2b99093 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent + +/-! # Infinite Unit Norm Subgroup -/ +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..2a46e06821 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -0,0 +1,1197 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +/-! # Main Finite Reciprocity -/ +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. -/ +@[simp] +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. -/ +private 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' := D.finiteReciprocityCandidate_zero A v K L hLK + map_add' := 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] [CompactSpace G] [T2Space 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) + [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)) : + Function.Bijective f := by + let e := v.unramifiedReciprocity_valuationEquiv + 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 unramifiedReciprocity_equiv_of_generator + (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.unramifiedReciprocity_equiv_of_generator 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.unramifiedReciprocity_equiv_of_generator 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..4d8a9fc9a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +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..75c8a83521 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences +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..ec1a7fc22b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +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. +-/ + +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..38c51b4d31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.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 +-/ + +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. +-/ + +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*} [Group R] + (τ₁ τ₄ : 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..aef5d55a58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.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 +-/ + +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. +-/ + +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..64c56d1ef3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal +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. +-/ + +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 [frobeniusActionRemainder, frobeniusExponent_mul, + frobeniusActionConjugate_coe, frobeniusExponent_actionConjugate, + frobeniusMul_coe, pow_add, mul_assoc] + 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..21e75c1566 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.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 +-/ + +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. +-/ + +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..cf35761ffe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder +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. +-/ + +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 (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] + [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..ecc17c9c92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.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 +-/ + +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. +-/ + +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..d71904173a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum +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. +-/ + +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..b8adcc7dc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -0,0 +1,1580 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity + +/-! # Main Naturality -/ +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) [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) := 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 [DegreeData.frobeniusClosure] + 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)) := + 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 + +/-- 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 + +private 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 + +@[instance_reducible] +private 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 + have hKRs_conjugate : KR.conjugate s = KRs := by + dsimp [KRs, Ks, KR] + unfold FiniteAbstractField.toFiniteResidueAbstractField + unfold FiniteAbstractField.conjugate + unfold DegreeData.FiniteResidueAbstractField.conjugate + rfl + 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) := by + subst KRs + exact 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σ] + symm + change finiteReciprocityNaturalityConjugation K.field L hLK s + (D.extensionRestriction KR.field L hLK σ.1) = + D.extensionRestriction KRs.field + (conjugateClosedSubgroup L s) + (conjugateClosedSubgroup_mono hLK s) σs.1 + unfold σs + cases hKRs_conjugate + dsimp only [id] + rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] + refine Quotient.inductionOn' σ.1 ?_ + intro k + rfl + 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..0213f5deac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -0,0 +1,1297 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius +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. +-/ + +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)`. -/ +private 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 + +/-- 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 := 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 hLbasefiniteE : 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 hLbasefinite + let hL'finiteE : 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 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 := by + change S.toSubgroup ≤ E.base.field.toSubgroup + exact 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) := by + change Finite (E.base.field.toSubgroup ⧸ + extensionSubgroup E.base.field S hSK) + infer_instance + 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 π : 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 := by + change (Sβ q).toSubgroup ≤ E.field.field.toSubgroup + exact 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) := by + exact 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] + let hLnormalF : + (extensionSubgroup F.base.field L (hL.trans F.below)).Normal := + hLnormal + let hL'normalF : (extensionSubgroup F.field.field L hL).Normal := + hL'normal + let hLbasefiniteF : Finite (F.base.field.toSubgroup ⧸ + extensionSubgroup F.base.field L (hL.trans F.below)) := + hLbasefinite + let hL'finiteF : Finite (F.field.field.toSubgroup ⧸ + extensionSubgroup F.field.field L hL) := + hL'finite + 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 + have hReciprocity : + D.finiteReciprocityHom A v hAxiom F.field L hL + (Additive.ofMul + (D.frobeniusRestriction E.field L hL (β q))) = + finiteNormClass A F.field.field L hL + (relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q)) := + D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom F.field L hL + (Additive.ofMul + (D.frobeniusRestriction E.field L hL (β q))) + (β q) rfl (πβ q) (by + simpa [Sβfinite, Sβ, E, + FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, + FiniteAbstractField.toFiniteResidueAbstractField] using hPrime q) + exact (D.transferNormNaturalityAbelianizedReciprocity_of + A v hAxiom F.field L hL + (D.frobeniusRestriction E.field L hL (β q))).trans hReciprocity + rw [hLeft] + have hBase : + 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) σ))) = + finiteNormClass A F.base.field L (hL.trans F.below) + (relativeNorm A F.base.field S hSKF π) := + (D.transferNormNaturalityAbelianizedReciprocity_of + A v hAxiom F.base L (hL.trans F.below) + (D.frobeniusRestriction (F.base.toFiniteResidueAbstractField D) L + (hL.trans F.below) σ)).trans + (D.finiteReciprocityHom_apply_eq_primeNormClass + A v hAxiom F.base L (hL.trans F.below) + (Additive.ofMul + (D.frobeniusRestriction (F.base.toFiniteResidueAbstractField D) L + (hL.trans F.below) σ)) + σ rfl π (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 hNormSub : + fixedFieldInclusion A E.base.field E.field.field E.below + (relativeNorm A E.base.field S hSK π) = + ∑ q : Ω, + relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q) := by + apply Subtype.ext + let valHom : ambientFixedAddSubgroup A E.field.field →+ A.V := + { toFun := fun x => x.1 + map_zero' := rfl + map_add' := fun _ _ => rfl } + change valHom (fixedFieldInclusion A E.base.field E.field.field E.below + (relativeNorm A E.base.field S hSK π)) = + valHom (∑ q : Ω, + relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q)) + rw [map_sum] + exact hNorm + have hNormSubF : + fixedFieldInclusion A F.base.field F.field.field F.below + (relativeNorm A F.base.field S hSKF π) = + ∑ q : Ω, + relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q) := by + change fixedFieldInclusion A F.base.field F.field.field F.below + (relativeNorm A F.base.field S hSKF π) = + ∑ q : Ω, + relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q) at hNormSub + exact hNormSub + have hNormClasses := congrArg + (finiteNormClassHom A F.field.field L hL) hNormSubF + rw [map_sum] at hNormClasses + 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..21d7d65c27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean @@ -0,0 +1,1662 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry + +/-! # Main Transfer Frobenius -/ +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] [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 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..2298fc00eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean @@ -0,0 +1,492 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +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`. +-/ + +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] [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] : + 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..4f00515025 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean @@ -0,0 +1,419 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Norm Subgroup -/ +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..e3c7441aa7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements + +/-! # Prime Choice -/ +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..9c84900415 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice + +/-! # Reciprocity Definition -/ +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..51006626d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition + +/-! # Reciprocity Independence -/ +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..aeeb87246b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import Mathlib.GroupTheory.GroupAction.Quotient + +/-! # Relative Norm Double Coset -/ +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 _ + +@[implicit_reducible] +private 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) + +@[implicit_reducible] +private 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) + +@[implicit_reducible] +private 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..45d639db97 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean @@ -0,0 +1,279 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.GroupTheory.Transfer +import Mathlib.GroupTheory.Abelianization.Defs + +/-! # Transfer Naturality -/ +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..1e298ecbd0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration +import Mathlib.GroupTheory.Transfer +import Mathlib.Topology.Algebra.Group.ClosedSubgroup + +/-! # Transfer Orbit Closure -/ +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..59c059d6bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Unit Cohomology Axiom -/ +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) := + 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. -/ +@[simp] +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 in ; +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..57e7c515c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean @@ -0,0 +1,683 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent +/-! +Proves the universal norm-descent argument from maximal-unramified units to finite intermediate +norm subgroups. +-/ + +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 + +/-- 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 finiteFixedTower := + powerTower.toFiniteAmbientFrobeniusFixedFieldTower + let SF := fixedTower.base + let TF := fixedTower.field + let hSMu : S.toSubgroup ≤ Mu.field.toSubgroup := hSP.trans hPMu + let hSMufinite : Finite + (Mu.field.toSubgroup ⧸ extensionSubgroup Mu.field S hSMu) := + FiniteIntermediateField.finite_extension_of_le hSK Mu.below hSMu + let : Finite + ((Mu.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (Mu.toFiniteAbstractField K).field S hSMu) := by + change Finite + (Mu.field.toSubgroup ⧸ extensionSubgroup Mu.field S hSMu) + exact hSMufinite + let ESMu : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + S (Mu.toFiniteAbstractField K) hSMu + have hESMuField : ESMu.field = SF := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let uS : v.unitAddSubgroup SF := + hESMuField ▸ v.finiteUnitInclusion ESMu uMu + let hSMi (j : ιs) : S.toSubgroup ≤ (Mi j).field.toSubgroup := + hSP.trans (hPMi j) + let hSMifinite (j : ιs) : Finite + ((Mi j).field.toSubgroup ⧸ extensionSubgroup (Mi j).field S (hSMi j)) := + FiniteIntermediateField.finite_extension_of_le hSK (Mi j).below (hSMi j) + let hSMifiniteBundled (j : ιs) : Finite + (((Mi j).toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup ((Mi j).toFiniteAbstractField K).field S (hSMi j)) := by + change Finite + ((Mi j).field.toSubgroup ⧸ + extensionSubgroup (Mi j).field S (hSMi j)) + exact hSMifinite j + let ESMi (j : ιs) : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + S ((Mi j).toFiniteAbstractField K) (hSMi j) + have hESMiField (j : ιs) : (ESMi j).field = SF := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let uᵢS (j : ιs) : v.unitAddSubgroup SF := + hESMiField j ▸ v.finiteUnitInclusion (ESMi j) (uMi j) + have huSval : uS.1.1 = u.1.1 := by + have huMuVal := congrArg Subtype.val huMu + change uMu.1.1 = u.1.1 at huMuVal + have huStransport : uS.1.1 = uMu.1.1 := by + dsimp only [uS] + cases hESMuField + rfl + calc + uS.1.1 = uMu.1.1 := huStransport + _ = u.1.1 := huMuVal + have huᵢSval (j : ιs) : (uᵢS j).1.1 = (uᵢ j.1).1.1 := by + have huMiVal := congrArg Subtype.val (huMi j) + change (uMi j).1.1 = (uᵢ j.1).1.1 at huMiVal + have huᵢStransport : (uᵢS j).1.1 = (uMi j).1.1 := by + dsimp only [uᵢS] + cases hESMiField j + rfl + calc + (uᵢS j).1.1 = (uMi j).1.1 := huᵢStransport + _ = (uᵢ j.1).1.1 := huMiVal + 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φσ : φ.1 * σ.1 = σ.1 * φ.1 := + powerTower.frobenius_commute_base + 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 := by + let MT := D.frobeniusFixedIntermediateField KR L hLK σn + have hTFMT : TF = MT.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let uBarMT : v.unitAddSubgroup (MT.toFiniteAbstractField K) := + hTFMT ▸ uBar + refine ⟨MT, uBarMT, ?_⟩ + apply Subtype.ext + change uBarMT.1.1 = uBar.1.1 + dsimp only [uBarMT] + have hyBarEmem : yBarE ∈ v.infiniteUnitAddSubgroup E K hEK := by + let MT := D.frobeniusFixedIntermediateField KR L hLK σn + have hTFMT : TF = MT.toFiniteAbstractField K := + FiniteAbstractField.eq_of_field_eq _ _ rfl + let yBarMT : v.unitAddSubgroup (MT.toFiniteAbstractField K) := + hTFMT ▸ yBar + refine ⟨MT, yBarMT, ?_⟩ + apply Subtype.ext + change yBarMT.1.1 = yBar.1.1 + dsimp only [yBarMT] + 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 + 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 hsumUnit (f : Fin n → v.unitAddSubgroup TF) : + ((∑ i, f i).1.1 : A.V) = ∑ i, (f i).1.1 := by + calc + ((∑ i, f i).1.1 : A.V) = + (ambientFixedAddSubgroup A TF.field).subtype + (∑ i, (v.unitAddSubgroup TF).subtype (f i)) := by + exact congrArg (ambientFixedAddSubgroup A TF.field).subtype + (map_sum (v.unitAddSubgroup TF).subtype f Finset.univ) + _ = _ := + map_sum (ambientFixedAddSubgroup A TF.field).subtype + (fun i => (v.unitAddSubgroup TF).subtype (f i)) Finset.univ + have hsumAmbient (f : Fin n → ambientFixedAddSubgroup A T) : + ((∑ i, f i).1 : A.V) = ∑ i, (f i).1 := + map_sum (ambientFixedAddSubgroup A T).subtype f Finset.univ + have hpowerTUnit : powerTUnit.1 = powerT := by + apply Subtype.ext + calc + (powerTUnit.1.1 : A.V) = + ∑ i : Fin n, (v.frobeniusFixedFieldUnitAction KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar).1.1 := + hsumUnit (fun i : Fin n => + v.frobeniusFixedFieldUnitAction KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar) + _ = ∑ i : Fin n, + (D.frobeniusFixedFieldAction A KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar.1).1 := rfl + _ = powerT.1 := + (hsumAmbient (fun i : Fin n => + D.frobeniusFixedFieldAction A KR L hLK σn + (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar.1)).symm + 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.1, by + intro g + have hg : g.1 ∈ SF.field := by + change g.1 ∈ D.frobeniusFixedField KR L hLK σ + exact g.2 + exact uS.1.2 ⟨g.1, hg⟩⟩ + let ySraw : ambientFixedAddSubgroup A S := + ⟨yS.1.1, by + intro g + have hg : g.1 ∈ SF.field := by + change g.1 ∈ D.frobeniusFixedField KR L hLK σ + exact g.2 + exact yS.1.2 ⟨g.1, hg⟩⟩ + let uBarraw : ambientFixedAddSubgroup A T := + ⟨uBar.1.1, by + intro g + have hg : g.1 ∈ + (D.frobeniusFixedAbstractField KR L hLK σn).field := by + change g.1 ∈ D.frobeniusFixedField KR L hLK σn + exact g.2 + exact uBar.1.2 ⟨g.1, hg⟩⟩ + let wBarraw : ambientFixedAddSubgroup A T := + ⟨wBar.1.1, by + intro g + have hg : g.1 ∈ TF.field := by + change g.1 ∈ D.frobeniusFixedField KR L hLK σn + exact g.2 + exact wBar.1.2 ⟨g.1, hg⟩⟩ + 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 := by + apply Subtype.ext + have h := congrArg Subtype.val huBar + change + (relativeNorm A S T hTS uBar.1).1 = uS.1.1 at h + change + (relativeNorm A S T hTS uBarraw).1 = uSraw.1 + exact h + have hySraw : relativeNorm A S T hTS yBar.1 = ySraw := by + apply Subtype.ext + rfl + have hpowerNormRaw : relativeNorm A S T hTS powerT = powerS := by + simpa [powerT, powerS, S, T, σ, σn, hySraw] using 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 K.field L hLK σ.1 n + (J (N (fixedFieldInclusion A T E hTE wBarraw))) := by + change + J (N (fixedFieldInclusion A S E hSE + (relativeNorm A S T hTS wBar.1))) = + D.frobeniusPowerSum A K.field L hLK σ.1 n + (J (N (fixedFieldInclusion A T E hTE wBar.1))) at hnormW + exact hnormW + have hσfixedZ : D.frobeniusQuotientAction A K.field L hLK σ.1 (J (N w)) = + J (N w) := by + let B := D.frobeniusQuotientRepresentation A K.field L hLK + have hpow := rep_action_pow_fixed + B φ.1 (J (N w)) hfixedZ n + change D.frobeniusQuotientAction A K.field L hLK + (φ.1 ^ n) (J (N w)) = J (N w) at hpow + simpa only [σ, D.frobeniusPowerOfDegreeOne_coe] using hpow + have hpowerZ : D.frobeniusPowerSum A K.field L hLK σ.1 n (J (N w)) = + n • J (N w) := + D.frobeniusPowerSum_eq_nsmul_of_fixed A K.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.1 := by + apply Subtype.ext + change uSraw.1 = u.1.1 + exact huSval + have hnormRelationE : + J (N u.1) = + J (N (D.frobeniusPowerSum A K.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))) + n • J (N w) := by + have h := hnormW' + simp only [map_sub] at h + rw [huSIncl, hpowerSIncl] at h + calc + J (N u.1) = n • J (N w) + + J (N (D.frobeniusPowerSum A K.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))) := + sub_eq_iff_eq_add.mp h + _ = _ := add_comm _ _ + 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 + have h53' : + (N (D.frobeniusPowerSum A K.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))).1 = + (relativeNorm A K.field S hSK ySraw).1 := by + have h53' := h53.symm + have hσexp : D.frobeniusExponent KR L hLK σ = n := + D.frobeniusExponent_powerOfDegreeOne KR L hLK φ hφ n hn + rw [hσexp] at h53' + change + (N (D.frobeniusPowerSum A K.field L hLK φ.1 n + (fixedFieldInclusion A S E hSE ySraw))).1 = + (relativeNorm A K.field S hSK ySraw).1 at h53' + exact 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] + rw [h53'] + let hPSfinite : Finite + (P.field.toSubgroup ⧸ extensionSubgroup P.field S hSP) := + FiniteIntermediateField.finite_extension_of_le hSK P.below hSP + let : Finite + ((P.toFiniteAbstractField K).field.toSubgroup ⧸ + extensionSubgroup (P.toFiniteAbstractField K).field S hSP) := by + change Finite + (P.field.toSubgroup ⧸ extensionSubgroup P.field S hSP) + exact hPSfinite + let EPS : FiniteAbstractFieldExtension G := + FiniteAbstractFieldExtension.ofInclusion + S (P.toFiniteAbstractField K) hSP + let yP : v.unitAddSubgroup (P.toFiniteAbstractField K) := by + simpa [SF, EPS, FiniteAbstractFieldExtension.ofInclusion, + DegreeData.frobeniusFixedAbstractField] 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 := S + middle := P.field + base := K.field + top_le_middle := hSP + middle_le_base := P.below + finiteTopQuotient := hPSfinite + finiteBaseQuotient := P.finite } + have hnDegree : (EP.degree : ℕ) = n := by + change (EP.toFiniteAbstractExtension.degree : ℕ) = n + rw [EP.toFiniteAbstractExtension.degree_coe] + change + Nat.card + (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) = n + 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 S 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 + +/-- **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..4c9dc7f29b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm +import Mathlib.Dynamics.BirkhoffSum.Basic + +/-! # Universal Norm Descent -/ +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..c3f1abd4cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +/-! # Unramified Norm Quotient -/ +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.cyclic_value_quotients 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.cyclic_value_quotients n hn) + ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w)) = 0 + rw [hq, map_zero] + +private 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) + (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 unramifiedReciprocity_valuationEquiv + (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.unramifiedReciprocity_valuationEquiv 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..0e20c8a331 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -0,0 +1,1270 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +/-! # Core -/ +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.cyclic_value_quotients 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) + +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⟩ + 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 + (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 hvalNorm : + v.valuationAt E.field + (extensionFixedRepresentationEquiv A K L hLK hnormal + (M.norm.hom y)) = + n • v.valuationAt E.field yL := by + rw [hnormM, + v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified normK] + apply Subtype.ext + exact htower.symm + change v.valueModulo n hn + (v.valuationAt E.field + (extensionFixedRepresentationEquiv A K L hLK hnormal + (M.norm.hom y))) = 0 + rw [hvalNorm] + exact v.valueModulo_nsmul n hn (v.valuationAt E.field yL) + 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 := by + exact (Submodule.Quotient.mk_eq_zero _).1 huClass + obtain ⟨y, hy⟩ := huCycleRange + have hyNorm : M.norm.hom y = uM := by + exact 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..d5f6c1c420 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +/-! # Cyclic Norm Quotient -/ +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..99d169c364 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Field Representation -/ +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..f517d838b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +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. +-/ + +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..ab1feb2fab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean @@ -0,0 +1,474 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import Mathlib.Algebra.Group.Subgroup.Pointwise +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. +-/ + +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 extensionQuotient_commGroup (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..47857e9036 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient + +/-! # Finite Galois Subextension -/ +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 extensionQuotient_groupInstance (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..4541154ff2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import Mathlib.Topology.Algebra.Group.Basic + +/-! # Intermediate Extension -/ +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 [extensionSubgroup, intermediateField] + 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. -/ +@[simp] +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 upperQuotient_groupInstance (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..b3e45e51e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean @@ -0,0 +1,1576 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Main -/ +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..59578da5d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +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. +-/ + +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..495f495dd3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -0,0 +1,594 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 [finiteUnramifiedRestriction, + maximalUnramifiedExtensionRestriction_mk, + FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv] + 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 [FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv] + 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) + (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)`. +-/ +@[simp] +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. -/ +@[simp] +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) + [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)) + (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.unramifiedReciprocity_equiv_of_generator 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.unramifiedReciprocity_equiv_of_generator 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..17fe300c65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.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 +-/ + +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. +-/ + +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..edd91c3e65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean @@ -0,0 +1,325 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.Group.TransferInstance +import Mathlib.Topology.Algebra.FilterBasis +import Mathlib.Topology.Algebra.Group.ClosedSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +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. +-/ + +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..24d67e4db7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity +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. +-/ + +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..0b1084042e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.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 +-/ + +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +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. +-/ + +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..da8cbaaebf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean @@ -0,0 +1,846 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +/-! # Reduction -/ +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̃` 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̃`. -/ +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̃) / 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..db2ac9313b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import Mathlib.GroupTheory.Nilpotent + +/-! # Sylow -/ +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 : ℕ} [Fact p.Prime] + (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..dae9121366 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -0,0 +1,442 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core + +/-! # Totally Ramified -/ +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-σ̃)` 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 `σ̃`, `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 `σ̃` fixes `π_Σ`, and that `σ` and +`σ̃` 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..c457780815 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +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..eed5f77933 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +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..a9893bebc2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.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 +-/ + +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. +-/ + +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..500da16829 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms +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. +-/ + +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) + +/-- 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)) := 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)), + 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 : 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 hq := E.galoisGenerator_generates + 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 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 EM : FiniteAbstractFieldExtension G := + { field := MF + base := K + below := M.below + finiteQuotient := M.finite } + 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) := by + apply Subtype.ext + rfl + have hcM : + cM = fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma) := by + apply Subtype.ext + rfl + have hNormL : + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field E.field E.below (k • piL + w.1)) := by + have h := + D.abstractReciprocity_totallyRamified_relativeNorm_L + A KR LG hLGTot q (k • piL + w.1) + change + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field E.field E.below (k • piL + w.1)) at h + exact h + have hNormSigma : + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) := by + have h := + D.abstractReciprocity_totallyRamified_relativeNorm_sigma + A KR LG hLGTot q (k • piSigma) + change + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) at h + exact h + have hNormBC : relativeNorm A M₀ M.field hMM₀ bM = + relativeNorm A M₀ M.field hMM₀ cM := by + calc + relativeNorm A M₀ M.field hMM₀ bM = + relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A E.field M.field hML + (k • piL + w.1)) := congrArg _ hbM + _ = + fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field E.field E.below (k • piL + w.1)) := + hNormL + _ = fixedFieldInclusion A K.field M₀ hM₀K + (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) := by + exact congrArg + (fixedFieldInclusion A K.field M₀ hM₀K) hnorm + _ = relativeNorm A M₀ M.field hMM₀ + (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) := + hNormSigma.symm + _ = relativeNorm A M₀ M.field hMM₀ cM := + congrArg _ hcM.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 := by + rw [isCyclic_iff_exists_zpowers_eq_top] + refine ⟨g, ?_⟩ + ext x + constructor + · intro _ + exact Subgroup.mem_top x + · intro _ + exact 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 haNLocal : + B₀.ρ g aN - aN = eB₀.symm (wM - uM) := by + have h := haN + change B₀.ρ g aN - aN = eB₀.symm (wM - uM) at h + exact h + 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 (wM - uM) := 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 (wM - uM)) := + congrArg eB₀ haNLocal + _ = wM - uM := eB₀.apply_symm_apply _ + _ = eB (eB.symm (wM - uM)) := + (eB.apply_symm_apply _).symm + have hbc : bB - cB = B.ρ gB aB - aB := by + rw [hprimitiveB] + apply eB.injective + dsimp only [bB, cB] + simp only [map_sub, AddEquiv.apply_symm_apply] + dsimp only [bM, cM, uM] + abel + have htc : B.ρ tB cB = cB := by + apply eB.injective + apply Subtype.ext + calc + (eB (B.ρ tB cB)).1 = + relativeCosetAction A K.field M.field M.below cM tB := + extensionFixedRepresentation_action_coe + A K.field M.field M.below M.normal tB cB + _ = cM.1 := by + dsimp only [cM] + have hActionNsmul : + relativeCosetAction A K.field M.field M.below + (k • piSigmaM) tB = + k • relativeCosetAction A K.field M.field M.below + piSigmaM tB := by + refine Quotient.inductionOn' tB ?_ + intro t + simp only [relativeCosetAction_mk] + exact map_nsmul (A.ρ t.1) k piSigmaM.1 + rw [hActionNsmul] + congr 1 + have h := + D.abstractReciprocityTotallyRamified_frobenius_fixes_sigma + A KR LG hLGTot q piSigma + change + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A Sigma M.field hMSigma piSigma) tB = + (fixedFieldInclusion A Sigma M.field hMSigma piSigma).1 at h + simpa [piSigmaM] using h + _ = (eB cB).1 := rfl + have hgb : B.ρ gB bB = B.ρ tB bB := by + apply eB.injective + apply Subtype.ext + calc + (eB (B.ρ gB bB)).1 = + relativeCosetAction A K.field M.field M.below bM gB := + extensionFixedRepresentation_action_coe + A K.field M.field M.below M.normal gB bB + _ = relativeCosetAction A K.field M.field M.below bM tB := by + have h := + D.abstractReciprocityTotallyRamified_actions_agree_on_L + A KR LG hLGTot q (k • piL + w.1) + change + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) gB = + relativeCosetAction A K.field M.field M.below + (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) tB at h + rw [hbM] + exact h + _ = (eB (B.ρ tB bB)).1 := by + exact (extensionFixedRepresentation_action_coe + A K.field M.field M.below M.normal tB bB).symm + have hcomm : Commute gB tB := + (D.abstractReciprocityTotallyRamified_generator_commutes_frobenius + KR LG hLGTot q).map M.extensionQuotientMulEquiv.toMonoidHom + 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 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 + 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] + dsimp only [bM] + rw [map_sub, map_add, map_add, map_nsmul, hpiLM, + wUnitM.2, 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 + +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..26fffc9330 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.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 +-/ + +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. +-/ + +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..01e51d6652 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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..0f3626d110 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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) [IsTopologicalGroup 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..80a17fc589 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets +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. +-/ + +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..1b24216a21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +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. +-/ + +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) [IsTopologicalGroup 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..be211ce3df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv +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..ca51c89070 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.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 +-/ + +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. +-/ + +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 galEquiv_of_equiv_equiv + {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..43685a9991 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +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. +-/ + +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..35690133ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.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 +-/ + +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. +-/ + +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..c9ad4d203a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +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..2d5c99004a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +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..15ac50743f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +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..5b81d375af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.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 +-/ + +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. +-/ + +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..04f2f4231b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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. +-/ + +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) + +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 + +local instance finitePlaceExtensionCompletionAlgebra : + Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +local instance finitePlaceExtensionCompletionSMul : + SMul K w.1.Completion := + (finitePlaceExtensionCompletionAlgebra v w).toSMul + +local instance finitePlaceLocalizedCompletionAlgebra : + Algebra + (HeightOneSpectrum.adicAbv K v).Completion + w.1.Completion := + AbsoluteValue.completionAlgebra + (HeightOneSpectrum.adicAbv K v) w.1 w.2 + +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 + +local instance finitePlaceScalarTensorUnitsAction : + MulDistribMulAction + (L ≃ₐ[K] L) + (v.adicCompletion K ⊗[K] L)ˣ := + scalarTensorUnitsAction + (K := K) (L := L) (A := v.adicCompletion K) + +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..b622a78d42 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean @@ -0,0 +1,596 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +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`. +-/ + +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) := + completionTensorDecomposition_extensionFintype + (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..680c4827d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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. +-/ + +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) + +local instance infinitePlaceExtensionCompletionAlgebra : + Algebra K u.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) u.1 + +local instance infinitePlaceExtensionCompletionSMul : + SMul K u.1.Completion := + infinitePlaceExtensionCompletionAlgebra w u |>.toSMul + +local instance infinitePlaceLocalizedCompletionAlgebra : + Algebra w.1.Completion u.1.Completion := + AbsoluteValue.completionAlgebra w.1 u.1 u.2 + +local instance infinitePlaceAllCompletionAlgebra + (u' : AbsoluteValueExtension w.1 L) : + Algebra w.1.Completion u'.1.Completion := + AbsoluteValue.completionAlgebra w.1 u'.1 u'.2 + +local instance infinitePlaceScalarTensorUnitsAction : + MulDistribMulAction (L ≃ₐ[K] L) (w.Completion ⊗[K] L)ˣ := + scalarTensorUnitsAction (K := K) (L := L) (A := w.Completion) + +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..b724508540 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean @@ -0,0 +1,637 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +import Mathlib.Algebra.Group.Pi.Units +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. +-/ + +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 + ((completionTensorDecomposition_left + (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 + (completionTensorDecomposition_left + (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..e441e0f6c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +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..0dd5880fbd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +import Mathlib.Algebra.Module.Torsion.Basic +import Mathlib.LinearAlgebra.Basis.SMul +import Mathlib.RingTheory.Algebraic.Integral +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.RingTheory.Discriminant +import Mathlib.RingTheory.Localization.Finiteness +import Mathlib.RingTheory.Valuation.LocalSubring +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. +-/ + +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..8bcb9aad9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +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..5a78d45248 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.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 +-/ + +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. +-/ + +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 ι] + [Module.Free A B] [Module.Finite A B] + (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*} [Fintype ι] + (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, + completionTensorDecomposition_left + (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) := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_left + (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 + (completionTensorDecomposition_left + (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..ee6a19cd40 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.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 +-/ + +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. +-/ + +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..17cdb234d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean @@ -0,0 +1,559 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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..6d0077b9ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -0,0 +1,722 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 + completionTensorDecomposition_left + (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) := + completionTensorDecomposition_extensionFintype + (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, + completionTensorDecomposition_left + (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), + completionTensorDecomposition_left + (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..a56f6105d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.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 +-/ + +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. +-/ + +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..69012586cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean @@ -0,0 +1,204 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 [relativeExtensionBasis, Finsupp.single_apply] + 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..5414592d1c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.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 +-/ + +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. +-/ + +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..30dc2f5532 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean @@ -0,0 +1,627 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +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. +-/ + +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..6c989ecd5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -0,0 +1,1110 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +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. +-/ + +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 + (completionTensorDecomposition_left + (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 + ((completionTensorDecomposition_left + (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 + (completionTensorDecomposition_left + 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 + (completionTensorDecomposition_left + 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 + +/-- 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 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' x 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 + map_mul' x 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 + +/-- 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 + (completionTensorDecomposition_left + 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..d8830ec032 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +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..5b91fc09a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +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..f85f3c1498 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean @@ -0,0 +1,403 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +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. +-/ + +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..bda8ad5edd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +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. +-/ + +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..da7c1fd105 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +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..030f897df8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +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. +-/ + +open scoped NumberField Classical 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] + +/-- The completion of the base field at the chosen finite place. -/ +abbrev ChosenFinitePlaceBaseCompletion + (w₀ : HeightOneSpectrum (𝓞 K)) := + (HeightOneSpectrum.adicAbv K w₀).Completion + +noncomputable instance chosenFinitePlaceExtensionCompletionAlgebra + (w₀ : HeightOneSpectrum (𝓞 K)) : + Algebra K + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K) (chosenFinitePlaceExtension (L := L) w₀).1 + +noncomputable instance chosenFinitePlaceExtensionCompletionSMul + (w₀ : HeightOneSpectrum (𝓞 K)) : + SMul K + (chosenFinitePlaceExtension (L := L) w₀).1.Completion := + (chosenFinitePlaceExtensionCompletionAlgebra + (K := K) (L := L) w₀).toSMul + +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 + +noncomputable instance chosenFinitePlaceBaseValued + (w₀ : HeightOneSpectrum (𝓞 K)) : + Valued + (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0 := + finitePlaceCompletionValued + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +noncomputable instance chosenFinitePlaceBaseValuativeRel + (w₀ : HeightOneSpectrum (𝓞 K)) : + ValuativeRel + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + finitePlaceCompletionValuativeRel + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +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₀) + +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₀) + +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₀) + +noncomputable instance chosenFinitePlaceLocalizedIntegerAlgebra + (w₀ : HeightOneSpectrum (𝓞 K)) : + Algebra + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + Algebra.ofSubsemiring + 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] + +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₀) + +noncomputable instance + chosenFinitePlaceBaseNontriviallyNormedField + (w₀ : HeightOneSpectrum (𝓞 K)) : + NontriviallyNormedField + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + absoluteValueExtension_completionNontriviallyNormedField + (HeightOneSpectrum.adicAbv K w₀) + (RayClass.adicAbv_isNontrivial w₀) + +noncomputable instance chosenFinitePlaceBaseLocallyCompactSpace + (w₀ : HeightOneSpectrum (𝓞 K)) : + LocallyCompactSpace + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry w₀) + +noncomputable instance chosenFinitePlaceBaseIsUltrametricDist + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsUltrametricDist + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + completionIsUltrametricDist + (HeightOneSpectrum.adicAbv K w₀) + (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) + +noncomputable instance + chosenFinitePlaceBaseValuationIsNontrivial + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation + (K := ChosenFinitePlaceBaseCompletion (K := K) w₀)).IsNontrivial) + +noncomputable instance chosenFinitePlaceBaseValuationCompatible + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +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 + +noncomputable instance chosenFinitePlaceBaseIsValuativeTopology + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsValuativeTopology + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + isValuativeTopology_of_valued_ofValuation + (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0 + +noncomputable instance + chosenFinitePlaceBaseIsNonarchimedeanLocalField + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsNonarchimedeanLocalField + (ChosenFinitePlaceBaseCompletion (K := K) w₀) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +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₀) + +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 + +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 + +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₀) + +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₀) + +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 + +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₀) + +noncomputable instance chosenFinitePlaceLocalizedValuationCompatible + (w₀ : HeightOneSpectrum (𝓞 K)) : + (Valued.v : + Valuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +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₀)) + +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 + +noncomputable instance chosenFinitePlaceLocalizedIsValuativeTopology + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsValuativeTopology + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + isValuativeTopology_of_valued_ofValuation + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) ℝ≥0 + +noncomputable instance + chosenFinitePlaceLocalizedIsNonarchimedeanLocalField + (w₀ : HeightOneSpectrum (𝓞 K)) : + IsNonarchimedeanLocalField + (ChosenFinitePlaceLocalizedCompletion + (K := K) (L := L) w₀) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +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₀) + +/-- 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..d6e28ac1b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +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. +-/ + +open scoped NumberField Classical +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 +/-- 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 +/-- 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) + +/-- 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 +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 +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 + +/-- 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 +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 +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 + +/-- 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 +@[simp] +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 +/-- 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 +/-- 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) + +/-- 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 + +/-- 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 +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 +@[simp] +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 +/-- 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..4faff2a4a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +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`. +-/ + +open scoped NumberField Classical +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] + +/-- 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 + +@[simp] +theorem finitePlaceBelow_asIdeal + (W : HeightOneSpectrum (𝓞 L)) : + (finitePlaceBelow (K := K) W).asIdeal = + W.asIdeal.under (𝓞 K) := + rfl + +/-- 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] + +/-- 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 +/-- 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) + +/-- 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 +/-- 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 + +/-- 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 +@[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 + +/-- 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 +/-- 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 +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 +/-- 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 +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 + +/-- 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 +@[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 +@[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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 +@[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 +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 + +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 + +/-- 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 + +/-- 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⟩ + +@[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..9b3f045f17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.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 +-/ + +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. +-/ + +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..d3f30f3704 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean @@ -0,0 +1,588 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +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. +-/ + +open scoped NumberField Classical NNReal ValuativeRel +open NumberField IsDedekindDomain + +noncomputable section + +open AlgebraicNumberTheory.Valuations +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +/-- 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) + +@[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 + +/-- 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 + +/-- 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) + +/-- 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))) + +@[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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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)) + +@[simp] +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 + +/-- 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 + +/-- 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 + +/-- 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..b3086d4ea4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +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. +-/ + +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..3f36123873 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +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..819795ef2f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +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..23fd2abbc6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean @@ -0,0 +1,400 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..4bba5f0543 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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]) + +/-- 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 } + +/-- 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 + +/-- 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) + +/-- 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 +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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..e6d8b49638 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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..dbea136378 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 [ValuationTheory.DiscreteValuationField.Valuation.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) + +/-- 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..adb726b2be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.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 +-/ + +import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +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. +-/ + +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..900d962f8b --- /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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.Galois.GaloisClosure +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. +-/ + +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] + [FiniteDimensional 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) + [FiniteDimensional K A] [FiniteDimensional K B] + [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..5bad9ae34e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +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..118b5bef6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.Galois.Profinite +import Mathlib.FieldTheory.IsSepClosed +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. +-/ + +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..a611fb1bba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization +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..563d5e5fd2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.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 +-/ + +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`. +-/ + +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..15b0007b08 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean @@ -0,0 +1,815 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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`. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +section ValuationRestriction + +variable {F E : Type} + [Field F] [Field E] [Algebra F E] + +/-- 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 + +@[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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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 +/-- 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⟩ + +/-- 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 +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 +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 +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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..14d61e79c9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.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 +-/ + +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. +-/ + +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..0bf76472f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.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 +-/ + +import Mathlib.FieldTheory.Galois.GaloisClosure +import Mathlib.FieldTheory.Normal.Basic +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. +-/ + +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..ea3a0d3f1e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +import Mathlib.FieldTheory.AbsoluteGaloisGroup +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. +-/ + +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..a3c91dcd04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +import Mathlib.FieldTheory.AbsoluteGaloisGroup +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. +-/ + +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] + +private 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] + +private 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 + (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] + +private 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 := + RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + e E hE (semilinearGaloisEquiv e E hE).toMonoidHom (by intro σ; rfl) + continuous_invFun := + 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..b7e0e722dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +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. +-/ + +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..0f468dab87 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.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 +-/ + +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. +-/ + +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..c3a48613f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.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 +-/ + +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. +-/ + +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..47a873d778 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.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 +-/ + +import Mathlib.FieldTheory.Galois.GaloisClosure +import Mathlib.FieldTheory.IntermediateField.Basic +import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +import Mathlib.Algebra.Algebra.Equiv +import Mathlib.LinearAlgebra.Dimension.Free +import Mathlib.LinearAlgebra.Dimension.Finite +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. +-/ + +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..f7119995f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +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..4929846d96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +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..376fe982fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean @@ -0,0 +1,592 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +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. +-/ + +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 + (completionTensorDecomposition_left + 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..1cca0c9f26 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/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 +-/ + +import Mathlib.NumberTheory.NumberField.AdeleRing +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +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. +-/ + +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..7091d0f6bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +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..1f677105a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -0,0 +1,1554 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +import Mathlib.RingTheory.Norm.Basic +import Mathlib.RingTheory.TensorProduct.Maps +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. +-/ + +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) + +@[simp] +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] + [FiniteDimensional K L] [FiniteDimensional K M] + [FiniteDimensional 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⟩ + +/-- 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, 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. -/ +@[simp] +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. -/ +@[simp] +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] + +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. -/ +private 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) + +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..fa49727ba4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +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. +-/ + +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..1a555ce935 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +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. +-/ + +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..27542b5547 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +import Mathlib.Topology.Algebra.Group.Quotient +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. +-/ + +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..02b8c2deec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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. +-/ + +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..2a6509ddac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +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..cf4f13239b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +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. +-/ + +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 +@[simp] +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 +@[simp] +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 +@[simp] +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..657b51f832 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients +import Mathlib.GroupTheory.QuotientGroup.Defs +import Mathlib.Topology.Algebra.ContinuousMonoidHom +import Mathlib.Topology.Algebra.Group.Quotient +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. +-/ + +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. -/ +@[simp] +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..3fc8168a82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +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. +-/ + +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..34666c433b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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`. +-/ + +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..87c0add590 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +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..d784c3f5f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison +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. +-/ + +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..36d017dda8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +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`. +-/ + +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 +@[simp] +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 + +/-- 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] + +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..02741a9274 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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. +-/ + +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..3740fc7164 --- /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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import Mathlib.LinearAlgebra.TensorProduct.Basis +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. +-/ + +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 +@[simp] +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 +@[simp] +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 +@[simp] +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 +@[simp] +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..4a041857ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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. +-/ + +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. -/ +@[simp] +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..3f5eddafda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean @@ -0,0 +1,1063 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +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`. +-/ + +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 +@[simp] +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 +@[simp] +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..0ab04fecca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces +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..127ea00d05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +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..ed83621b8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -0,0 +1,535 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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⁻¹`. +-/ + +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..3f8e78c72a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -0,0 +1,640 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module +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. +-/ + +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 +@[simp] +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 + +local instance : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup K L) := + relativeIdeleMulDistribMulAction K L + +local instance : + MulDistribMulAction (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) := + ideleClassMulDistribMulAction K L + +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) σ)] : + ∃ hC : + 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) + σ hC.1 hC.2 := 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..224310f9a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +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]`. +-/ + +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 + ∃ hC : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.ClassGroup K L) + _ _ _ _ σ hC.1 hC.2 = + (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) + _ _ _ _ σ hC.1 hC.2 = + 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..a041ac5d74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced +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..ba0fb1e873 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +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..c984ac4101 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +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..970f7784b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +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..882f51b407 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +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. +-/ + +open scoped NumberField BigOperators ValuativeRel Classical 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 +@[reducible] +private 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 +@[reducible] +private 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..303a30c20c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.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 +-/ + +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. +-/ + +open scoped NumberField BigOperators ValuativeRel Classical 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 +/-- 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 +/-- 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..ab1cf8bf68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.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 +-/ + +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. +-/ + +open scoped NumberField BigOperators ValuativeRel Classical 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 +/-- 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 +/-- 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..98374a2aaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +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`. +-/ + +open scoped NumberField BigOperators ValuativeRel Classical 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] + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..8a324b75b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock +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. +-/ + +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..a3dafae86d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +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..7cd5afbc52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +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..c8141b3a6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +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. +-/ + +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..ba48a49f07 --- /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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition +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. +-/ + +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..ad8b1d7b4d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +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. +-/ + +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..a3757b4988 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +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. +-/ + +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..169babd806 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +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. +-/ + +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..7f2e616745 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.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 +-/ + +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. +-/ + +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..c5d486eb12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.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 +-/ + +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. +-/ + +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..85265c6db4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +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. +-/ + +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..31a9500486 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +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. +-/ + +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..feed29073f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +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..69396625cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.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 +-/ + +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. +-/ + +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..d79b4291b0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +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..3781f7ae23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.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 +-/ + +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. +-/ + +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..71826ab397 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.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 +-/ + +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. +-/ + +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..85e4148f4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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. +-/ + +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..3182d5f9c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +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. +-/ + +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..11118e9cad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +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`. +-/ + +open scoped Classical 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] + +/-- 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 +@[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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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⟩ + +/-- 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 +/-- 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 + +/-- 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 +@[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] + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..9e097da061 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +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..7ef95bf054 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +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..314578accf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import Mathlib.FieldTheory.Galois.NormalBasis +import Mathlib.GroupTheory.GroupAction.Defs +import Mathlib.LinearAlgebra.TensorProduct.Basis +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +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 +@[simp] +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 +@[simp] +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 + [IsGalois K L] + (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..0482f7bd92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +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. +-/ + +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 +@[simp] +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 +@[simp] +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..910c44b6b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +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`. +-/ + +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 + [FiniteDimensional K M] [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 + [Normal K M] : + (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] + +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 ι] [DecidableEq ι] + (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 ι] [DecidableEq ι] + (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 + 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 ι] [DecidableEq ι] + (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 + 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] + +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..ea51d8f0fa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +import Mathlib.Algebra.Group.Action.Basic +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`. +-/ + +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 + [IsGalois K L] + (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..b15d2b6a15 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +import Mathlib.Algebra.Module.LinearMap.Polynomial +import Mathlib.LinearAlgebra.Charpoly.BaseChange +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. +-/ + +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 ι] [DecidableEq ι] + (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 ι] [DecidableEq ι] + (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 + 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 ι] [DecidableEq ι] + (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 + 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..ca5181c023 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean @@ -0,0 +1,891 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import Mathlib.NumberTheory.RamificationInertia.Valuation +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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 +@[simp] +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..6f608c2b5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup +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. +-/ + +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)) + +@[simp] +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..cd6306e4e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +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`. +-/ + +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⟩) + +@[simp] +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..d2ced2baf4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean @@ -0,0 +1,1028 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +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. +-/ + +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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 + (completionTensorDecomposition_left + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 + (completionTensorDecomposition_left + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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..5cbf63b828 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +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..253056f068 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean @@ -0,0 +1,403 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 + +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..03e5098fc0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +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. +-/ + +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 := + completionTensorDecomposition_extensionFintype + (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 + (completionTensorDecomposition_left + (K := K) (L := L) vK hvK z w) := by + classical + let := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_left + (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 := + completionTensorDecomposition_extensionFintype + (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 + (completionTensorDecomposition_left + (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..37825ff803 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +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. +-/ + +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..7d4b81be1f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +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. +-/ + +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..502e5300ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +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..50fa5c1cc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology +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. +-/ + +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..27aa7a72dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +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. +-/ + +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..f4f8dc1b59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +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. +-/ + +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 + +@[simp] +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) + +@[simp] +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] [NumberField 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 + +@[simp] +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..d5eb30214e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +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. +-/ + +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..3dffae0e92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +import Mathlib.LinearAlgebra.FreeModule.IdealQuotient +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. +-/ + +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 := by + exact 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 + +/-- Every nonarchimedean completion of a number field is a proper metric +space. -/ +instance adicCompletionProperSpace + (v : HeightOneSpectrum (𝓞 K)) : + ProperSpace (v.adicCompletion K) := by + apply + Valued.integer.properSpace_iff_completeSpace_and_isDiscreteValuationRing_integer_and_finite_residueField.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..2af9837211 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +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. +-/ + +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..4e8b7aee9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +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..86c825f227 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +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..c91c5de40d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 + +@[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 + +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 + +/-- The base embedding is an isometry. -/ +theorem finitePlaceCompletionBaseMap_isometry + (v : HeightOneSpectrum (𝓞 K)) : + Isometry (finitePlaceCompletionBaseMap v) := + AddMonoidHomClass.isometry_of_norm _ + (finitePlaceCompletionBaseMap_norm v) + +/-- 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 + +@[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 + +theorem finitePlaceCompletionRingHom_isometry + (v : HeightOneSpectrum (𝓞 K)) : + Isometry (finitePlaceCompletionRingHom v) := + (finitePlaceCompletionBaseMap_isometry v).completion_extension + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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 + +/-- 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) + +noncomputable instance + chosenFinitePlaceIntrinsicNormQuotientCommGroup + (v : HeightOneSpectrum (𝓞 K)) : + CommGroup + (ChosenFinitePlaceIntrinsicNormQuotient + (K := K) (L := L) v) := by + unfold ChosenFinitePlaceIntrinsicNormQuotient + infer_instance + +/-- 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 +@[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 + +/-- 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 + +/-- 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 +@[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 + +/-- 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) + +/-- 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) + +/-- 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 +/-- 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 +/-- 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..bd66bec8cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import Mathlib.Analysis.SpecialFunctions.Pow.Real +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. +-/ + +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..62626c1989 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +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. +-/ + +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..0508a1802f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -0,0 +1,815 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +import Mathlib.Algebra.Module.ZLattice.Basic +import Mathlib.Analysis.Normed.Field.ProperSpace +import Mathlib.NumberTheory.NumberField.ClassNumber +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. +-/ + +open scoped Classical NumberField Pointwise RestrictedProduct NNReal +open NumberField IsDedekindDomain +open NumberField.Units.dirichletUnitTheorem + +noncomputable section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace FiniteIdeleGroup + +/-- 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 + +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⟩ + +/-- 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 + +/-- 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 +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 + +/-- 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 +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 +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 + +/-- 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) + +/-- 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)‖ + +@[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] + +/-- Ring-of-integers units, viewed as units of the number field. -/ +def ringUnitToFieldUnit : + (𝓞 K)ˣ →* Kˣ := + Units.map (algebraMap (𝓞 K) K) + +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] + +/-- 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 + +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 + +/-- 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' + +/-- 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 _) + +/-- 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 + +/-- A real basis obtained from the full unit lattice. -/ +private 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) + +/-- An explicit uniform logarithmic bound for representatives modulo the +ordinary unit lattice. -/ +def logFundamentalBound : ℝ := + ∑ i, ‖unitLatticeRealBasis (K := K) i‖ + +theorem logFundamentalBound_nonneg : + 0 ≤ logFundamentalBound (K := K) := + Finset.sum_nonneg fun _ _ ↦ norm_nonneg _ + +/-- 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 + +/-- 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] + +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] + +/-- 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 + +/-- 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} + +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) + +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 + +/-- 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) + +/-- For every ordinary ideal class which occurs on a norm-one idele, choose +one such representative; use `1` for the (irrelevant) remaining classes. -/ +private 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 + +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 + +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 + +/-- The finite set of chosen norm-one representatives of ordinary ideal +classes. -/ +def normOneIdealClassRepresentativeSet : Set (IdeleGroup K) := + Set.range (normOneIdealClassRepresentative (K := K)) + +theorem isCompact_normOneIdealClassRepresentativeSet : + IsCompact (normOneIdealClassRepresentativeSet (K := K)) := by + apply Set.Finite.isCompact + exact Set.finite_range _ + +theorem normOneIdealClassRepresentativeSet_subset_normOne : + normOneIdealClassRepresentativeSet (K := K) ⊆ + (normOneSubgroup (K := K) : Set (IdeleGroup K)) := by + rintro _ ⟨c, rfl⟩ + exact normOneIdealClassRepresentative_mem c + +/-- 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 + +/-- A compact set of ideles meeting every norm-one idele class. -/ +def compactNormOneClassCover : Set (IdeleGroup K) := + compactIntegralNormOneSet (K := K) * + normOneIdealClassRepresentativeSet (K := K) + +theorem isCompact_compactNormOneClassCover : + IsCompact (compactNormOneClassCover (K := K)) := + by + simpa [compactNormOneClassCover] using + (isCompact_compactIntegralNormOneSet (K := K)).mul + (isCompact_normOneIdealClassRepresentativeSet (K := K)) + +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] + +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 + +/-- 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 + +/-- 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 + +/-- 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..2fef6e7293 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +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..9cb91401f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +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..d1d7eeb9ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.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 +-/ + +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. +-/ + +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] + +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 + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension + hCompatible x + rw [InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, + InfinitePlace.mult_isReal ⟨W, hWReal⟩, + pow_one, 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) := by + simp [LocalFieldTheory.normUnits] + _ = nnnormUnitHom W.Completion x := + nnnormUnitHom_map_ringEquiv_of_isometry + eExtension + (InfinitePlace.Completion.isometryEquivRealOfIsReal + hWReal).isometry 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 : + RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = + RingHom.comp eExtension.toRingHom + (algebraMap v₀.Completion W.Completion)) + (hExtensionIsometry : Isometry eExtension) : + nnnormUnitHom v₀.Completion + (LocalFieldTheory.normUnits + v₀.Completion W.Completion x) = + nnnormUnitHom W.Completion x := by + have hNorm := + LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension + hCompatible x + 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.isometryEquivComplexOfIsComplex + hvComplex).isometry _ + _ = + nnnormUnitHom ℂ + (LocalFieldTheory.normUnits ℂ ℂ + (Units.mapEquiv eExtension.toMulEquiv x)) := by + rw [hNorm] + _ = + nnnormUnitHom ℂ + (Units.mapEquiv eExtension.toMulEquiv x) := by + simp [LocalFieldTheory.normUnits] + _ = nnnormUnitHom W.Completion x := + nnnormUnitHom_map_ringEquiv_of_isometry + eExtension hExtensionIsometry 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.completionTensorDecomposition_extensionFintype + (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..287817fcec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -0,0 +1,725 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +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. +-/ + +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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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) + +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 + have hNormEq : + (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + fun x => + eBaseUnits.symm + (LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x)) := by + funext x + apply eBaseUnits.injective + calc + eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x) := by + simpa only [eBaseUnits, eExtensionUnits] using + (LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension hCompatible x) + _ = eBaseUnits + (eBaseUnits.symm + (LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x))) := by + simp + change Continuous (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) + rw [hNormEq] + exact hBaseUnitsContinuous.comp + ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℝ).comp + hExtensionUnitsContinuous) + · 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 + have hNormEq : + (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + fun x => + eBaseUnits.symm + (LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x)) := by + funext x + apply eBaseUnits.injective + calc + eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x) := by + simpa only [eBaseUnits, eExtensionUnits] using + (LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension hCompatible x) + _ = eBaseUnits + (eBaseUnits.symm + (LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x))) := by + simp + change Continuous (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) + rw [hNormEq] + exact hBaseUnitsContinuous.comp + ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℂ).comp + hExtensionUnitsContinuous) + · 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 + have hNormEq : + (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + fun x => + eBaseUnits.symm + (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x)) := by + funext x + apply eBaseUnits.injective + calc + eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x) := by + simpa only [eBaseUnits, eExtensionUnits] using + (LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension hCompatible x) + _ = eBaseUnits + (eBaseUnits.symm + (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x))) := by + simp + change Continuous (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) + rw [hNormEq] + exact hBaseUnitsContinuous.comp + ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ).comp + hExtensionUnitsContinuous) + · 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 _ + have hNormEq : + (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + fun x => + eBaseUnits.symm + (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x)) := by + funext x + apply eBaseUnits.injective + calc + eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = + LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x) := by + simpa only [eBaseUnits, eExtensionUnits] using + (LocalClassFieldTheory.normUnits_map_ringEquiv + eBase eExtension hCompatible x) + _ = eBaseUnits + (eBaseUnits.symm + (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x))) := by + simp + change Continuous (fun x : W.1.Completionˣ => + LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) + rw [hNormEq] + exact hBaseUnitsContinuous.comp + ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ).comp + hExtensionUnitsContinuous) + +/-- 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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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..d07648a9e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped BigOperators Classical 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 +private theorem infinitePlaceCompletionMap_isometry + (v₀ : InfinitePlace K) + (W : InfinitePlace L) + [W.1.LiesOver v₀.1] : + Isometry + (NumberField.LiesOver.completionMap + (v := v₀) (w := W)) := by + unfold NumberField.LiesOver.completionMap + exact + (InfinitePlace.Completion.isometryEquivCompletion W).symm.isometry.comp + ((UniformSpace.Completion.isometry_mapRingHom + (InfinitePlace.LiesOver.isometry_algebraMap W v₀)).comp + (InfinitePlace.Completion.isometryEquivCompletion v₀).isometry) + +omit [NumberField L] 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) + +/-- 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 +/-- 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 +/-- 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 +/-- 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₀] + +/-- 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) + +/-- 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] + +/-- 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..5e03eba47b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import Mathlib.Algebra.BigOperators.Finprod +import Mathlib.NumberTheory.NumberField.Completion.Ramification +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. +-/ + +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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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..17850ad6dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +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. +-/ + +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..4f89b772cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +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. +-/ + +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..62a24a4797 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +open scoped Classical 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] + +/-- A positive real unit placed in an archimedean completion. At a complex +place it is first regarded as a complex unit. -/ +private 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)) + +/-- The positive local archimedean component, with its natural continuity. -/ +private 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 +@[simp] +private theorem positiveArchimedeanLocalComponentContinuous_apply + (v : InfinitePlace K) (r : ℝ≥0ˣ) : + positiveArchimedeanLocalComponentContinuous v r = + positiveArchimedeanLocalComponent v r := + rfl + +omit [NumberField K] 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 +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) + +/-- The positive root needed to compensate for the multiplicity of the +chosen infinite place. -/ +private noncomputable def positiveArchimedeanRoot : + ℝ≥0ˣ →* ℝ≥0ˣ := + Units.map + (NNReal.rpowMonoidHom + (((w₀ (K := K)).mult : ℝ)⁻¹)) + +/-- The positive root map used in the archimedean section is continuous. -/ +private 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 : ℝ)⁻¹)) + +/-- 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))) + +/-- 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))) + +@[simp] +theorem positiveArchimedeanSectionContinuous_apply + (r : ℝ≥0ˣ) : + positiveArchimedeanSectionContinuous K r = + positiveArchimedeanSection K r := + rfl + +/-- The positive archimedean section is continuous. -/ +theorem continuous_positiveArchimedeanSection : + Continuous (positiveArchimedeanSection K) := + (positiveArchimedeanSectionContinuous K).continuous_toFun + +@[simp] +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] + +@[simp] +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 + +/-- Every finite component of the positive archimedean idele is one. -/ +@[simp] +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] + +/-- 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 _ + +/-- The positive archimedean idele has absolute idele norm `r⁻¹`. -/ +@[simp] +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] + +/-- 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)⟩ + +/-- 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 + +/-- 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..b2b7c33d1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +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. +-/ + +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 hP := + principalIdelesHerbrandQuotientDefined + K L σ h + @herbrandQuotient + (L ≃ₐ[K] L) Lˣ _ _ _ + (galoisGroupFieldUnitsMulDistribMulAction K L) + σ h.1 h.2 = + @herbrandQuotient + (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L) + _ _ _ + (principalIdeleMulDistribMulAction K L) + σ hP.1 hP.2 := 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..35c9467f6b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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..dc8986979d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore +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. +-/ + +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. -/ +@[simp] +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)) + +@[simp] +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] + +@[simp] +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..130cc479e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +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. +-/ + +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..9b01b659cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +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..afdda5b488 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces +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..ca7b6863d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -0,0 +1,883 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +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. +-/ + +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] + [∀ u : + AbsoluteValueExtension + (HeightOneSpectrum.adicAbv K v₀) L, + Module.Finite + (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 := + completionTensorDecomposition_extensionFintype + (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, + completionTensorDecomposition_left + (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 := + absoluteValueExtension_completionNontriviallyNormedField 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..6dfbb87d3d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +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. +-/ + +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. -/ +@[simp] +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..1108af15fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +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. +-/ + +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..19b00aea7b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor +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. +-/ + +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 + 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..c6c69db992 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.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 +-/ + +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. +-/ + +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..3ebd37314a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.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 +-/ + +import Mathlib.Topology.Algebra.Group.Units +import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace +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. +-/ + +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 := ?_ } + · 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 + · 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..98bda634a0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +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. +-/ + +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..3ae954bd8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -0,0 +1,559 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology +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. +-/ + +open scoped NumberField Classical TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace IdeleGroup + +variable {K : Type*} [Field K] [NumberField K] + +/-- The dependent archimedean value which is `x` at `v` and `1` +elsewhere. -/ +private 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 +@[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 +@[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 + +/-- 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 + +/-- 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 + +/-- 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 + +@[simp] +theorem infinitePlaceIdeleContinuous_apply + (v : InfinitePlace K) (x : v.Completionˣ) : + infinitePlaceIdeleContinuous v x = + infinitePlaceIdele v x := + rfl + +/-- An archimedean one-place idele recovers its prescribed component +at the supporting place. -/ +@[simp] +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 + +/-- An archimedean one-place idele has component one at every other +archimedean place. -/ +@[simp] +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 + +/-- An archimedean one-place idele has component one at every finite +place. -/ +@[simp] +theorem infinitePlaceIdele_finiteComponent + (v : InfinitePlace K) + (w : HeightOneSpectrum (𝓞 K)) + (x : v.Completionˣ) : + IdeleGroup.finiteComponent w + (infinitePlaceIdele v x) = 1 := by + rfl + +/-- 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) + +/-- The dependent local value which is `x` at `v` and `1` elsewhere. -/ +private 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 + +@[simp] +private theorem finitePlaceValue_same + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + finitePlaceValue v x v = x := by + simp [finitePlaceValue] + +@[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] + +/-- 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] + +/-- A finite-place idele recovers its prescribed component at the +supporting place. -/ +@[simp] +theorem finitePlaceIdele_finiteComponent_same + (v : HeightOneSpectrum (𝓞 K)) + (x : (v.adicCompletion K)ˣ) : + IdeleGroup.finiteComponent v + (finitePlaceIdele v x) = x := + finitePlaceValue_same v x + +/-- A finite-place idele has component one at every other finite place. -/ +@[simp] +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 + +/-- A finite-place idele has component one at every infinite place. -/ +@[simp] +theorem finitePlaceIdele_infiniteComponent + (v : HeightOneSpectrum (𝓞 K)) + (w : InfinitePlace K) + (x : (v.adicCompletion K)ˣ) : + IdeleGroup.infiniteComponent w + (finitePlaceIdele v x) = 1 := by + rfl + +/-- 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] + +/-- The dependent archimedean tensor value which is `z` at `v` and +`1` elsewhere. -/ +private 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 +@[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 +@[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] + +/-- Restricted local tensor data supported at one archimedean place. -/ +private 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- The dependent local tensor value which is `z` at `v` and `1` +elsewhere. -/ +private 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 +@[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 +@[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] + +/-- Restricted local data supported at one finite place. -/ +private 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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..f8fa01dfd8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +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ˣ`. +-/ + +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. -/ +private 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. -/ +private 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..a39da6246b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.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 +-/ + +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. +-/ + +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..feadb60af9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.FieldTheory.Normal.Closure +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. +-/ + +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..9bc315ab6b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +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..7787e3f618 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound +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..e7126f47fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +import Mathlib.RingTheory.Ideal.Maps +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. +-/ + +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..e0f72b0f45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import Mathlib.FieldTheory.Galois.IsGaloisGroup +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +import Mathlib.RingTheory.RamificationInertia.Ramification +import Mathlib.Algebra.Group.Subgroup.Finite + +/-! # Completely Split Primes -/ +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..1651bc6009 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes +import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +import Mathlib.NumberTheory.RamificationInertia.Unramified +import Mathlib.NumberTheory.LegendreSymbol.Basic +import Mathlib.LinearAlgebra.Dimension.FreeAndStrongRankCondition +import Mathlib.RingTheory.RamificationInertia.Inertia +import Mathlib.RingTheory.Ideal.Quotient.Operations +import Mathlib.Data.Nat.ModEq + +/-! # Completely Split Primes Mod Four -/ +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..6925a64e78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind +import Mathlib.NumberTheory.Divisors +import Mathlib.Data.ZMod.Basic + +/-! # Degree One Primes -/ +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..85e6a15e1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +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. +-/ + +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..53e4c2249b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +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. +-/ + +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..a1ec41cfa6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +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. +-/ + +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] [NumberField K] + [Field L] [NumberField 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 + +/-- 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..4c15a27351 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace +import Mathlib.NumberTheory.RamificationInertia.Galois +import Mathlib.RingTheory.RamificationInertia.Ramification +import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +import Mathlib.RingTheory.RamificationInertia.Inertia +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. +-/ + +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..4e95f13b7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.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 +-/ + +import Mathlib.FieldTheory.PrimitiveElement +import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed +import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind +import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient +import Mathlib.RingTheory.Algebraic.Integral +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. +-/ + +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..7e60ff42fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +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. +-/ + +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] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field E] [NumberField 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] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [Field E] [NumberField 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..e0013fc1de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.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 +-/ + +import Mathlib.NumberTheory.NumberField.Basic +import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +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. +-/ + +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] + [NumberField F] [NumberField 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..cd54df66e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.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 +-/ + +import Mathlib.NumberTheory.NumberField.Discriminant.Basic +import Mathlib.Analysis.SpecialFunctions.Pow.Real +import Mathlib.Tactic.Positivity +import Mathlib.Tactic.NormNum +/-! +# From an integral discriminant bound to a root discriminant bound +-/ + +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..0d01d90ce5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.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 +-/ + +import Mathlib.Algebra.Polynomial.Roots +import Mathlib.Algebra.Polynomial.Div +import Mathlib.Algebra.BigOperators.Group.Finset.Piecewise +import Mathlib.Algebra.BigOperators.GroupWithZero.Finset +import Mathlib.Order.Filter.TendstoCofinite +import Mathlib.Data.Nat.Prime.Defs +import Mathlib.Data.Int.Basic +import Mathlib.Data.Set.Finite.Basic +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. +-/ + +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..ee4d120335 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.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 +-/ + +import Mathlib.Algebra.Field.Shrink +import Mathlib.Algebra.Ring.Shrink +import Mathlib.Basic.Countable.Small +import Mathlib.Data.Rat.Encodable +import Mathlib.LinearAlgebra.Countable +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. +-/ + +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..bdb50e44ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound +import Mathlib.RingTheory.UniqueFactorizationDomain.NormalizedFactors +import Mathlib.Data.Multiset.Count +import Mathlib.NumberTheory.NumberField.Discriminant.Different +import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas +import Mathlib.RingTheory.Ideal.Norm.AbsNorm +import Mathlib.RingTheory.KrullDimension.Basic +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. +-/ + +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..351ee9a2c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.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 +-/ + +import Mathlib.NumberTheory.NumberField.Discriminant.Different +import Mathlib.RingTheory.Ideal.Int +import Mathlib.FieldTheory.Finiteness +import Mathlib.RingTheory.DedekindDomain.Different +import Mathlib.RingTheory.Ideal.Quotient.Operations +import Mathlib.RingTheory.Ideal.Norm.AbsNorm +import Mathlib.RingTheory.Trace.Defs +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. +-/ + +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 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..48c6b506ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +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..b5ee9ccd87 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +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..fee187c581 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.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 +-/ + +import Mathlib.Algebra.Group.Subgroup.Finite +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. +-/ + +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..b6931e7c78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean @@ -0,0 +1,603 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +import Mathlib.NumberTheory.NumberField.Ideal.Basic +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`. +-/ + +open scoped NumberField Classical BigOperators +open NumberField IsDedekindDomain + +noncomputable section + +namespace AlgebraicNumberTheory +namespace PowerResidueSymbols + +attribute [local instance] Ideal.Quotient.field + +variable (K : Type*) [Field K] [NumberField K] + +noncomputable local instance primeIdealResidueFintype + (P : HeightOneSpectrum (𝓞 K)) : + Fintype (𝓞 K ⧸ P.asIdeal) := + Fintype.ofFinite _ + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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⟩) + +/-- 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 + +/-- 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] + +/-- 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) + +@[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 + +/-- 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)) + +/-- 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 _ + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 +/-- 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 + +/-- 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 + +/-- **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 + +/-- 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 + +/-- 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]) + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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..b17b02e75f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.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 +-/ + +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)`. +-/ + +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..fde7c351b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting +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..2c466eb4e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +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..9963e7d811 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +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. +-/ + +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..3ba4be9951 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.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 +-/ + +import Mathlib.FieldTheory.Galois.GaloisClosure +import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +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. +-/ + +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..5336b9ca76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.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 +-/ + +import Mathlib.RingTheory.DedekindDomain.Different +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. +-/ + +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..9f39c13d6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.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 +-/ + +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +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. +-/ + +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..7f5a0387a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +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..1e732e8a91 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +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..5b2ff6bb0a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +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. +-/ + +open scoped NumberField Classical +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] + +/-- 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 + +/-- 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 +/-- 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) σ + +/-- 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) + +/-- 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 +/-- 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 + +/-- 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 +/-- 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) + +/-- 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 + +/-- 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] + +/-- 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 +/-- 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 + +/-- 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 +/-- 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'] + +/-- 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..c34388f3a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +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. +-/ + +open scoped NumberField Classical +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 +/-- 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 +/-- 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 + +/-- 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 +/-- 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 +/-- 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 + show + ((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 +/-- 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 + +/-- 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 + +/-- 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..2b42119677 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -0,0 +1,948 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +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`. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + +open AlgebraicNumberTheory.Valuations +open HilbertRamification + +section AbsoluteValueExtensions + +variable {K M : Type} + [Field K] [Field M] [Algebra K M] + +/-- 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 + (absoluteValueExtension_algebraicCompletionClosure 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] } + +@[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 + (absoluteValueExtension_algebraicCompletionClosure 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 + +/-- 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) + +@[simp] +theorem doubleCosetExtension_mk + (g : G) : + doubleCosetExtension vK hvK w L + (DoubleCoset.mk H D g) = + restrictAbsoluteValueExtensionToIntermediate + vK + (absoluteValueExtensionConjugate + vK w g⁻¹) + L := + rfl + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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'] + +/-- 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 +/-- 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 +/-- 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] + +/-- 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 +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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..f6cf1e5de1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.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 +-/ + +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'`. +-/ + +open scoped NumberField Classical +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 + +/-- 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 + +/-- 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 + +/-- 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 + +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 + +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 + +/-- 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) + +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] + +/-- 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) + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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 +/-- 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 +/-- 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⟩ + +/-- 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..e638b55b5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.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 +-/ + +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. +-/ + +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..457115b175 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +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..9665040d6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +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..67432ded0c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -0,0 +1,490 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace IdeleGroup + +/-- 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)) + +@[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 + +@[simp] +theorem modulusOfFinset_support + (S : Finset (HeightOneSpectrum (𝓞 K))) : + (modulusOfFinset S).finitePart.support = S := by + classical + ext v + simp [modulusOfFinset, RayClass.Modulus.ofFinite] + +/-- 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) ⊤ + +/-- 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 + +/-- 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) + +/-- 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 _ _ + +/-- 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 + +/-- 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⟩ + +/-- 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) + +/-- 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) + +/-- 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 _ _ + +/-- 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 + +/-- 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⟩ + +/-- 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] + +@[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 + +@[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 + +/-- 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) + +@[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 + +/-- 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)) + +@[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 + +/-- 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..62d7bab465 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +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`. +-/ + +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] [NumberField 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..617e6d6703 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.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 +-/ + +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +/-- A real infinite place of a number field. -/ +abbrev RealPlace (K : Type*) [Field K] [NumberField K] := + {v : InfinitePlace K // v.IsReal} + +/-- 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 + +/-- The full modulus with a prescribed finite part and no archimedean +positivity condition. -/ +def ofFinite (m : FiniteModulus K) : Modulus K where + finitePart := m + infinitePart := ∅ + +/-- 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 + +instance : Zero (Modulus K) where + zero := ofFinite 0 + +@[simp] +theorem finitePart_ofFinite (m : FiniteModulus K) : + (ofFinite m).finitePart = m := + rfl + +@[simp] +theorem infinitePart_ofFinite (m : FiniteModulus K) : + (ofFinite m).infinitePart = ∅ := + rfl + +@[simp] +theorem finitePart_narrowOfFinite (m : FiniteModulus K) : + (narrowOfFinite m).finitePart = m := + rfl + +@[simp] +theorem infinitePart_narrowOfFinite (m : FiniteModulus K) : + (narrowOfFinite m).infinitePart = Finset.univ := + rfl + +@[simp] +theorem finitePart_zero : + (0 : Modulus K).finitePart = 0 := + rfl + +@[simp] +theorem infinitePart_zero : + (0 : Modulus K).infinitePart = ∅ := + rfl + +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 + +instance : LE (Modulus K) where + le m n := + m.finitePart ≤ n.finitePart ∧ m.infinitePart ⊆ n.infinitePart + +@[simp] +theorem le_iff {m n : Modulus K} : + m ≤ n ↔ + m.finitePart ≤ n.finitePart ∧ m.infinitePart ⊆ n.infinitePart := + Iff.rfl + +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⟩) +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⟩⟩ + +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⟩ + +instance : Bot (Modulus K) where + bot := 0 + +instance : OrderBot (Modulus K) where + bot_le _ := ⟨bot_le, Finset.empty_subset _⟩ + +/-- 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 + +@[simp] +theorem finitePart_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) : + (m.replaceFinitePart f).finitePart = f := + rfl + +@[simp] +theorem infinitePart_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) : + (m.replaceFinitePart f).infinitePart = m.infinitePart := + rfl + +/-- 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 + +@[simp] +theorem finitePart_eraseRealPlace + (m : Modulus K) (v : RealPlace K) : + (m.eraseRealPlace v).finitePart = m.finitePart := + rfl + +@[simp] +theorem infinitePart_eraseRealPlace + (m : Modulus K) (v : RealPlace K) : + (m.eraseRealPlace v).infinitePart = m.infinitePart.erase v := + rfl + +/-- 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 + +@[simp] +theorem finitePart_eraseRealPlaces + (m : Modulus K) (s : Finset (RealPlace K)) : + (m.eraseRealPlaces s).finitePart = m.finitePart := + rfl + +@[simp] +theorem infinitePart_eraseRealPlaces + (m : Modulus K) (s : Finset (RealPlace K)) : + (m.eraseRealPlaces s).infinitePart = m.infinitePart \ s := + rfl + +@[simp] +theorem eraseRealPlaces_empty (m : Modulus K) : + m.eraseRealPlaces ∅ = m := by + apply ext + · rfl + · exact Finset.sdiff_empty + +@[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 _ _ _ + +/-- 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 ⊤ + +@[simp] +theorem localInfiniteCongruenceSubgroup_replaceFinitePart + (m : Modulus K) (f : FiniteModulus K) (w : InfinitePlace K) : + (m.replaceFinitePart f).localInfiniteCongruenceSubgroup w = + m.localInfiniteCongruenceSubgroup w := by + rfl + +@[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] + +@[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] + +@[simp] +theorem localInfiniteCongruenceSubgroup_of_not_isReal + (m : Modulus K) (w : InfinitePlace K) (hw : ¬ w.IsReal) : + m.localInfiniteCongruenceSubgroup w = ⊤ := by + simp [localInfiniteCongruenceSubgroup, hw] + +/-- 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)) + +@[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] + +@[simp] +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] + +/-- 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 + +/-- 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) + +@[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 + +/-- 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] + +/-- 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) + +/-- 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 + +/-- The ray class group attached to a full modulus. -/ +abbrev RayClassGroup (m : Modulus K) := + IdeleClassGroup K ⧸ m.congruenceSubgroup + +/-- 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..7304bf60d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -0,0 +1,979 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace +import Mathlib.Topology.Algebra.IsOpenUnits +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. +-/ + +open scoped NumberField WithZero Classical +open NumberField IsDedekindDomain + +noncomputable section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +/-- 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] + +@[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 + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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) + +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 + +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) + +/-- 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 _ _ _ + +/-- 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]⟩ + +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] + +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 + +theorem ideleCongruenceSubgroup_le_primeTo + (m : Modulus K) : + m.ideleCongruenceSubgroup ≤ + idelePrimeToModulusSubgroup m := by + intro a ha + exact ⟨ha.1, fun v _ => ha.2 v⟩ + +/-- 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) + +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) + +/-- 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) + +/-- 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) + +/-- 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) + +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] + +/-- The ideal-theoretic ray class group `J_K^m / P_K^m`. -/ +abbrev IdealRayClassGroup (m : Modulus K) := + primeToModulusIdeals m ⧸ principalRayIdealSubgroup m + +/-- 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) + +/-- 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 + +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⟩ + +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⟩ + +/-- 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)) + +/-- The quotient equivalence induced by the ideal-ray projection evaluates on +the class of a prime-to-modulus idele as the original projection. -/ +@[simp] +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 -/ + +/-- The finite primes in `m`, together with all infinite places. -/ +abbrev ApproximationPlace (m : Modulus K) := + (↥m.finitePart.support) ⊕ InfinitePlace K + +/-- 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 + +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 + +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) + +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 + +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 + +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 + +/-- 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 + +noncomputable instance approximationCompletionTopologicalSpace + (m : Modulus K) (i : ApproximationPlace m) : + TopologicalSpace (approximationCompletion m i) := by + cases i <;> simp only [approximationCompletion] <;> infer_instance + +/-- 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) + +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 + +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 + +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 + +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 + +/-- 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)) + +@[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 + +@[simp] +theorem approximationEmbedding_infinite + (m : Modulus K) (x : K) (w : InfinitePlace K) : + approximationEmbedding m x (Sum.inr w) = + (x : w.Completion) := + rfl + +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)) + +/-- 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ˣ) + +/-- 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) + +/-- 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⟩ + +/-- 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) + +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 + +/-- 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) + +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 _ _ + +/-- 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 + +/-- 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 + +/-- 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 + +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 + +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 + +/-- 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)) + +/-- The quotient equivalence induced by the idelic ray projection evaluates +on a prime-to-modulus idele class as the original projection. -/ +@[simp] +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 + +/-- 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..8c7d5357f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -0,0 +1,637 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +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`. +-/ + +open scoped BigOperators Classical 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 +/-- 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 +/-- 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 +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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 +@[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 +@[simp] +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] + +/-- 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 +@[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 +/-- 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 + +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 + +/-- 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 +/-- 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 +private theorem fractionalIdealNormPrimeBelow_eq_finitePlaceBelow + (W : HeightOneSpectrum (𝓞 L)) : + ClassFieldTheory.fractionalIdealNormPrimeBelow K L W = + _root_.finitePlaceBelow (K := K) W := by + ext + rfl + +private theorem idealNormExponentMap_eq_public : + idealNormExponentMap (K := K) (L := L) = + ClassFieldTheory.fractionalIdealNormExponentMap K L := by + unfold idealNormExponentMap ClassFieldTheory.fractionalIdealNormExponentMap + simp only [fractionalIdealNormPrimeBelow_eq_finitePlaceBelow] + +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] + +/-- 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] + +/-- 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 + +/-- 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.completionTensorDecomposition_extensionFintype + (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 +/-- 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] + +/-- 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 +@[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 + +/-- 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.completionTensorDecomposition_extensionFintype + (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 + +/-- 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..cc75e6d98b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +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..5f824861c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.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 +-/ + +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. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +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] + +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 + +/-- 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 + +/-- The narrow class group realized as an idele quotient. -/ +abbrev NarrowClassGroup + (K : Type*) [Field K] [NumberField K] := + IdeleGroup K ⧸ narrowDenominator (K := K) + +/-- 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)) + +/-- 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]) + +theorem narrowToClassGroup_mk (a : IdeleGroup K) : + narrowToClassGroup + (QuotientGroup.mk' (narrowDenominator (K := K)) a) = + IdeleGroup.idealClass a := + QuotientGroup.lift_mk _ _ _ + +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⟩ + +/-- The quotient of infinite ideles by the positive congruence +subgroup. -/ +abbrev realSignGroup + (K : Type*) [Field K] [NumberField K] := + InfiniteIdeleGroup K ⧸ narrowInfiniteCongruenceSubgroup (K := K) + +/-- 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 + +/-- Map an infinite idele to its narrow ideal class. -/ +def infiniteToNarrow : + InfiniteIdeleGroup K →* NarrowClassGroup K := + (QuotientGroup.mk' (narrowDenominator (K := K))).comp + (infiniteToIdele (K := K)) + +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⟩ + +/-- 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)) + +@[simp] +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 _ _ _ + +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 + +/-- The inclusion of global integral units into the field units. -/ +def integralUnitToFieldUnit : + (𝓞 K)ˣ →* Kˣ := + Units.map (algebraMap (𝓞 K) K) + +/-- 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 + +/-- The archimedean image of a global integral unit. -/ +def integralUnitToInfiniteIdele : + (𝓞 K)ˣ →* InfiniteIdeleGroup K := + (MonoidHom.fst _ _).comp + ((IdeleGroup.principalIdele K).comp + (integralUnitToFieldUnit (K := K))) + +/-- The totally positive global units. -/ +def totallyPositiveUnitSubgroup : + Subgroup ((𝓞 K)ˣ) := + Subgroup.comap (integralUnitToInfiniteIdele (K := K)) + (narrowInfiniteCongruenceSubgroup (K := K)) + +/-- The sign classes of global integral units. -/ +abbrev IntegralUnitSignGroup := + (𝓞 K)ˣ ⧸ totallyPositiveUnitSubgroup (K := K) + +/-- Send a global integral unit to its real sign class. -/ +def integralUnitToRealSign : + (𝓞 K)ˣ →* realSignGroup K := + (QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K))).comp + (integralUnitToInfiniteIdele (K := K)) + +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 + +/-- 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)) + +@[simp] +theorem integralUnitSignToRealSign_mk (u : (𝓞 K)ˣ) : + integralUnitSignToRealSign + (QuotientGroup.mk' + (totallyPositiveUnitSubgroup (K := K)) u) = + QuotientGroup.mk' + (narrowInfiniteCongruenceSubgroup (K := K)) + (integralUnitToInfiniteIdele (K := K) u) := + QuotientGroup.lift_mk _ _ _ + +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' + +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⟩ + +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 + +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 + +/-- 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..1dfd2eb7fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +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. +-/ + +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 _ + +private noncomputable def ordinaryRayIdealsEquiv : + rayClassPrimeToIdeals (ordinaryRayClassModulus K) ≃* + NumberFieldFractionalIdealGroup K := + (MulEquiv.subgroupCongr 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 + 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..f2920af78b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.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 +-/ + +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace RayClass + +universe u v + +/-- 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..ee3e35dfab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +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. +-/ + +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..a1a0e6961a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -0,0 +1,1306 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import Mathlib.Data.Nat.Factorization.Basic +import Mathlib.Data.Nat.GCD.BigOperators +import Mathlib.Data.ZMod.Units +import Mathlib.NumberTheory.NumberField.Units.Basic +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +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)ˣ`. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + + +namespace RayClass + +local instance rationalRingOfIntegersIsPrincipalIdealRing : + IsPrincipalIdealRing (𝓞 ℚ) := + IsPrincipalIdealRing.of_surjective + Rat.ringOfIntegersEquiv.symm + Rat.ringOfIntegersEquiv.symm.surjective + +local instance rationalNatGeneratorPrimeFact + (v : HeightOneSpectrum (𝓞 ℚ)) : + Fact (Nat.Prime (Rat.HeightOneSpectrum.natGenerator v)) := + ⟨Rat.HeightOneSpectrum.prime_natGenerator v⟩ + +local instance rationalPrimesEquivPrimeFact + (v : HeightOneSpectrum (𝓞 ℚ)) : + Fact + (Nat.Prime + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ)) := + ⟨(Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v).property⟩ + +/-- The height-one prime of `𝓞 ℚ` associated with a natural prime. -/ +noncomputable abbrev rationalPrime (p : Nat.Primes) : + HeightOneSpectrum (𝓞 ℚ) := + (Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p + +@[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) + +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 + +/-- 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 + +@[simp] +theorem rationalFiniteModulus_apply + (m : ℕ) (v : HeightOneSpectrum (𝓞 ℚ)) : + rationalFiniteModulus m v = + m.factorization (Rat.HeightOneSpectrum.natGenerator v) := by + rw [rationalFiniteModulus, Finsupp.comapDomain_apply] + +/-- 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) + +@[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] + +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' + +/-- The fractional ideal underlying a rational fractional-ideal unit. -/ +abbrev rationalFractionalIdeal (I : FractionalIdealGroup ℚ) : + FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ := + I + +/-- An arbitrary principal generator of a nonzero rational fractional +ideal, before choosing its sign. -/ +private noncomputable def rawRationalIdealGenerator + (I : FractionalIdealGroup ℚ) : ℚ := + Submodule.IsPrincipal.generator + ((rationalFractionalIdeal I : FractionalIdeal + (nonZeroDivisors (𝓞 ℚ)) ℚ) : Submodule (𝓞 ℚ) ℚ) + +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) + +/-- 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 + +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)) + +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 + +/-- 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 + +@[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 + +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 + +/-- The positive generator, regarded as a nonzero rational number. -/ +noncomputable def positiveRationalIdealGeneratorUnit + (I : FractionalIdealGroup ℚ) : ℚˣ := + Units.mk0 (positiveRationalIdealGenerator I) + (ne_of_gt (positiveRationalIdealGenerator_pos I)) + +@[simp] +theorem positiveRationalIdealGeneratorUnit_val + (I : FractionalIdealGroup ℚ) : + (positiveRationalIdealGeneratorUnit I : ℚ) = + positiveRationalIdealGenerator I := + rfl + +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 + +@[simp] +theorem positiveRationalIdealGeneratorUnit_one : + positiveRationalIdealGeneratorUnit + (1 : FractionalIdealGroup ℚ) = 1 := by + apply Units.ext + exact positiveRationalIdealGenerator_one + +theorem positiveRationalIdealGeneratorUnit_mul + (I J : FractionalIdealGroup ℚ) : + positiveRationalIdealGeneratorUnit (I * J) = + positiveRationalIdealGeneratorUnit I * + positiveRationalIdealGeneratorUnit J := by + apply Units.ext + exact positiveRationalIdealGenerator_mul I J + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +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) + +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) + +/-- 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 + +/-- 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 + +/-- 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)⁻¹ + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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 + +@[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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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 + +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 `ℚ` -/ + +/-- 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]⟩ + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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 : ℚ)) + +/-- The positive rational prime attached to a finite place. -/ +abbrev rationalPadicPrime + (v : HeightOneSpectrum (𝓞 ℚ)) : ℕ := + ((Rat.HeightOneSpectrum.primesEquiv + (R := 𝓞 ℚ) v : Nat.Primes) : ℕ) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- Congruences modulo pairwise coprime moduli combine to a congruence +modulo their finite product. -/ +theorem intModEq_finset_prod_of_pairwise_coprime + {ι : Type*} [DecidableEq ι] + (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 + 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) + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 ℚ)⟩ + +/-- 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) + +/-- 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)) + +/-- 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..f5089fefda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean @@ -0,0 +1,1093 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import Mathlib.Analysis.Complex.Convex +import Mathlib.Basic.Sign.Basic +import Mathlib.Topology.Algebra.Ring.Compact +import Mathlib.Topology.Connected.Clopen +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. +-/ + +open scoped Classical NumberField RestrictedProduct WithZero +open NumberField IsDedekindDomain +open Topology + +noncomputable section + + +variable {K : Type*} [Field K] [NumberField K] + +namespace RayClass + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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' + +/-- 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ϖ) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- A positive real number regarded as a unit. -/ +def positiveRealUnit (x : Set.Ioi (0 : ℝ)) : ℝˣ := + Units.mk0 x.1 x.2.ne' + +/-- 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 +/-- 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 +/-- 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) + +/-- 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) + +/-- 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 +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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..6380d00e4f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +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..973a9edb31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +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..2f35acbb4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +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. +-/ + +open scoped BigOperators Classical 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] + +/-- 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 + +/-- 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 + +@[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 +@[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 +@[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 +@[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 +@[simp] +theorem finitePlaceEquiv_inv_apply + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + finitePlaceEquiv K L σ + (finitePlaceEquiv K L σ⁻¹ v) = v := by + rw [← finitePlaceEquiv_mul] + simp + +/-- 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 +/-- 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 +/-- 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] + +/-- Absolute ideal norms are invariant under a ring automorphism. -/ +theorem absNorm_map_ringEquiv + {R : Type*} [CommRing R] [IsDedekindDomain R] + [Module.Free ℤ 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 + +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 +/-- 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 +/-- 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] + +/-- 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 + +local instance : + MulAction (L ≃ₐ[K] L) + (HeightOneSpectrum (𝓞 L)) := + finitePlaceMulAction K L + +local instance : + MulDistribMulAction (L ≃ₐ[K] L) Lˣ := + fieldUnitsMulDistribMulAction K L + +omit [NumberField K] [NumberField L] in +@[simp] +theorem finitePlace_smul_def + (σ : L ≃ₐ[K] L) + (v : HeightOneSpectrum (𝓞 L)) : + σ • v = finitePlaceEquiv K L σ v := + rfl + +/-- 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 +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 +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 +/-- 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 + +/-- 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 +@[simp] +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 + +/-- 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)) + +/-- 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] } + +/-- 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) } + +/-- 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 +@[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 + +/-- 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 +@[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 +/-- 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 +/-- 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) + +/-- 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) : ℝ)⁻¹ + +@[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)) + +/-- 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 + +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 _ _ + +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] + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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 ℝ) + +/-- 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)) + +/-- 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 + +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 + +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 +/-- 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 + +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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) + +/-- 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) + +/-- 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 _ + ∃ h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) + _ _ _ _ σ h.1 h.2 = + ∏ ω : + 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..6ad22791dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -0,0 +1,1887 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic +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. +-/ + +open scoped BigOperators Classical 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 + +/-- 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) } + +/-- 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) + +/-- 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 + +/-- 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 +/-- 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) + +/-- 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) + +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 _ + ∃ h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ h.1 h.2 = + (∏ ω : + 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 : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S))) := + hExtended.1 + let extendedHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) σ) := + 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 : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ))) := + hProduct.1 + let productHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ) := + hProduct.2 + let hInteger : + HerbrandQuotientDefined + (L ≃ₐ[K] L) (Multiplicative ℤ) σ := + ⟨trivialIntHerbrandH0Finite, + trivialIntHerbrandHMinusOneFinite σ⟩ + let integerH0Finite : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) (Multiplicative ℤ)) := + hInteger.1 + let integerHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) (Multiplicative ℤ) σ) := + 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 : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S))) := + hLattice.1 + let latticeHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ) := + hLattice.2 + have hMultiplicative : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ * + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative ℤ) σ := + 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 : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative ℤ) σ = + (Fintype.card (L ≃ₐ[K] L) : ℚ) := + trivialInt_herbrandQuotient_eq_card σ + have hExtendedProduct : + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative + (extendedFullLogLattice L S)) σ = + herbrandQuotient + (G := L ≃ₐ[K] L) + (A := Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ := by + exact + 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)) + _ _ _ _ σ hLattice.1 hLattice.2 * + (Fintype.card (L ≃ₐ[K] L) : ℚ) = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S × ℤ)) + _ _ _ _ σ hProduct.1 hProduct.2 := by + rw [← hIntegerValue] + exact hMultiplicative.symm + _ = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (extendedFullLogLattice L S)) + _ _ _ _ σ hExtended.1 hExtended.2 := + hExtendedProduct.symm + _ = + ∏ ω : + MulAction.orbitRel.Quotient + (L ≃ₐ[K] L) + (SUnitGroup.LogPlace (K := L) S), + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := + hExtendedValue + +end LogLatticeHerbrand + +section ActualSUnitHerbrand + +/-- 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 _ + ∃ h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ h.1 h.2 = + (∏ ω : + 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 : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S))) := + hLattice.1 + let latticeHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) σ) := + hLattice.2 + let hTorsion : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) σ := + ⟨inferInstance, inferInstance⟩ + let torsionH0Finite : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S))) := + hTorsion.1 + let torsionHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) σ) := + 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 : + Finite + (HerbrandH0 + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S)) := + hSUnit.1 + let sUnitHMinusOneFinite : + Finite + (HerbrandHMinusOne + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) σ) := + 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) + _ _ _ _ σ hSUnit.1 hSUnit.2 = + @herbrandQuotient + (L ≃ₐ[K] L) + (CommGroup.torsion + (SUnitGroup (K := L) S)) + _ _ _ _ σ hTorsion.1 hTorsion.2 * + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ hLattice.1 hLattice.2 := + hMultiplicative + _ = + @herbrandQuotient + (L ≃ₐ[K] L) + (Multiplicative + (SUnitGroup.fullLogLattice (K := L) S)) + _ _ _ _ σ hLattice.1 hLattice.2 := 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 +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 _ + ∃ h : + HerbrandQuotientDefined + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) σ, + @herbrandQuotient + (L ≃ₐ[K] L) + (SUnitGroup (K := L) S) + _ _ _ _ σ h.1 h.2 = + (∏ ω : + 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) + _ _ _ _ σ hSUnit.1 hSUnit.2 = + (∏ ω : + 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..dd4679b7fc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -0,0 +1,1226 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank +import Mathlib.Algebra.Module.PID +import Mathlib.Algebra.Module.ZLattice.Basic +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. +-/ + +noncomputable section + +open IsDedekindDomain Module +open scoped Classical NumberField nonZeroDivisors + + +variable {K : Type*} [Field K] [NumberField K] + +namespace SUnitGroup + +variable (S : Finset (HeightOneSpectrum (𝓞 K))) + +/-- 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 → ℝ) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +@[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 + +@[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 + +/-- 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 + +/-- 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 + +/-- The reduced `S`-unit lattice. -/ +noncomputable def reducedLogLattice : + Submodule ℤ (ReducedLogSpace (K := K) S) := + LinearMap.range (reducedLogLinearMap (K := K) S) + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- The places occurring in the `S`-unit theorem: every infinite place +and the finite places belonging to `S`. -/ +abbrev LogPlace := + NumberField.InfinitePlace K ⊕ S + +/-- The ambient real coordinate space indexed by all places occurring +in the `S`-unit theorem. -/ +abbrev FullLogSpace := + LogPlace (K := K) S → ℝ + +/-- 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] + +/-- The coordinate-sum-zero hyperplane in the full logarithmic +space. -/ +abbrev LogHyperplane := + LinearMap.ker (coordinateSum (K := K) S) + +/-- 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] + +@[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 + +@[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 + +/-- 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 + +/-- 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] + +/-- 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] + +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) + +/-- 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) + +/-- 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 : ℝ) + +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)) + +/-- 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 + +/-- 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⟩ + +/-- 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] + +/-- 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⟩ + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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 + +instance instDiscreteTopology_fullLogLattice : + DiscreteTopology (fullLogLattice (K := K) S) := + by + change + DiscreteTopology + (ZLattice.comap ℝ + (reducedLogLattice (K := K) S) + (logHyperplaneContinuousEquivReduced + (K := K) S).toLinearMap) + infer_instance + +/-- 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 + +/-- The logarithmic rank: the number of places in the +`S`-unit theorem minus one. -/ +def logRank : ℕ := + Fintype.card (NumberField.InfinitePlace K) + S.card - 1 + +/-- The additive realization of the roots of unity of `K`. -/ +abbrev RootsOfUnityAdditive := + (NumberField.Units.torsion K).toAddSubgroup.toIntSubmodule + +/-- The additive torsion submodule of the `S`-unit group. -/ +abbrev TorsionAdditive := + Submodule.torsion ℤ + (Additive (SUnitGroup (K := K) S)) + +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] + +/-- The torsion-free quotient of the additive `S`-unit group. -/ +abbrev FreeQuotient := + Additive (SUnitGroup (K := K) S) ⧸ + TorsionAdditive (K := K) S + +local instance instModuleFinite_additiveSUnit : + Module.Finite ℤ (Additive (SUnitGroup (K := K) S)) := + moduleFinite (K := K) S + +local instance instModule_freeQuotient : + Module ℤ (FreeQuotient (K := K) S) := + Submodule.Quotient.module + (TorsionAdditive (K := K) S) + +local instance instModuleFinite_freeQuotient : + Module.Finite ℤ (FreeQuotient (K := K) S) := + Module.Finite.quotient ℤ + (TorsionAdditive (K := K) S) + +local instance instModuleFree_freeQuotient : + Module.Free ℤ (FreeQuotient (K := K) S) := + Module.free_of_finite_type_torsion_free' + +/-- 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 + +/-- 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]) + +/-- 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 + +/-- A linear section of the quotient by torsion. It exists because +the quotient is a free, hence projective, `ℤ`-module. -/ +private 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 + +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 + +/-- Splitting the exact sequence consisting of torsion, the `S`-unit +group, and its torsion-free quotient. -/ +private 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]) + (torsionQuotientSection_spec (K := K) S)).symm + +/-- **`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) + +/-- 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 + +/-- **`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..e1db198b13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean @@ -0,0 +1,661 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import Mathlib.Algebra.Exact.Basic +import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +import Mathlib.LinearAlgebra.StdBasis +import Mathlib.NumberTheory.NumberField.ClassNumber +import Mathlib.NumberTheory.NumberField.Units.Regulator +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. +-/ + +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..5434576ade --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.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 +-/ + +import Mathlib.FieldTheory.IsSepClosed +import Mathlib.FieldTheory.KrullTopology +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. +-/ + +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..aaf31609ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.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 +-/ + +import Mathlib.FieldTheory.LinearDisjoint +import Mathlib.LinearAlgebra.Dimension.Constructions +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. +-/ + +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..618fcd405f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +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..2e2776a40c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory +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..4061332575 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +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..a6fc10a7c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +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..34b3595d75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +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..798dd20ef1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +/-! +# Embedding into a ray class field +-/ + +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] [NumberField 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..dbefb3fb58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +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. +-/ + +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..834e3146d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.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 +-/ + +import Mathlib.Algebra.BigOperators.Finsupp.Basic +import Mathlib.NumberTheory.NumberField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.RingTheory.Ideal.GoingUp +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u v + +/-- 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) + +/-- 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] + [FiniteDimensional 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..632c19db35 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +/-! +# Conductors of finite abelian extensions +-/ + +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..f5f755bad1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +/-! +# Ray congruences +-/ + +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..73ea12da9b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +import Mathlib.RingTheory.Unramified.Locus +/-! +# Unramifiedness outside the support of a ray modulus +-/ + +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] [NumberField 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..1b97aa1f91 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +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. +-/ + +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..deed37faa6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# The narrow class-group modulus +-/ + +noncomputable section + +open scoped Classical + +namespace ClassFieldTheory + +universe u + +/-- 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..82f3bdbd5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +/-! +# The ordinary class-group modulus +-/ + +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..244cdd372c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +/-! +# The ray Artin map +-/ + +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..6a9239e4d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Ray class fields +-/ + +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..5fe2a2f79a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Ideal-theoretic ray class groups +-/ + +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..066e0e4287 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import Mathlib.Data.Finsupp.Order +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u + +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 + +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) + +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 + +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) + +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) + +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⟩ + +/-- 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 := + 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 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..67697e054f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u v + +/-- 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] + +/-- 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] + +/-- 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) + +/-- 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) + +/-- 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..6ff8cdd046 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.FiniteSupport.Defs +import Mathlib.Order.Preorder.Finsupp +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Ray class moduli + +A modulus consists of finite-prime exponents and a finite set of real places. +-/ + +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] [NumberField 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..4a353f5434 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +/-! +# Prime classes in ray class groups +-/ + +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, 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..28881c3d71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Fractional ideals prime to a ray modulus +-/ + +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..1c6fcf4ed9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +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. +-/ + +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..2481acfc19 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Class fields attached to ray class subgroups +-/ + +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..ac9ca1ed02 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.Ideal.Quotient.Operations +/-! +# Higher-unit subgroups at finite places +-/ + +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..82e3fe3834 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals +import Mathlib.RingTheory.ClassGroup.Basic +/-! +# Ray-principal ideals +-/ + +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..220fb90e3d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization +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..66e8ab2579 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +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..6f42e77c22 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.NumberTheory.RamificationInertia.Galois +import Mathlib.RingTheory.Frobenius +/-! +# Arithmetic Frobenius at a finite prime +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u v + +/-- 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..8d54fe6c40 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.DedekindDomain.Factorization +/-! +# Fractional ideal represented by a finite prime +-/ + +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..1190945f00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.NumberTheory.RamificationInertia.Galois +/-! +# Complete splitting of a finite prime +-/ + +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] [NumberField K] + [Field L] [NumberField 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..d6474bee9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Big Hilbert class fields +-/ + +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..bcb32b6283 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces +import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification +/-! +# Unramifiedness at every place +-/ + +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..c58df000d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +/-! +# Small Hilbert class fields +-/ + +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..82ea986a9a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.Unramified.Locus +/-! +# Unramifiedness at all finite places +-/ + +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] [NumberField K] + [Field L] [NumberField 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..cb9f2ef1dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup +import Mathlib.Algebra.BigOperators.Finsupp.Basic +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u + +namespace NumberFieldFractionalIdealGroup + +variable {K : Type u} [Field K] [NumberField K] + +/-- 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]) + +/-- 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)) + +@[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] + +/-- 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)) + +/-- 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) + +@[simp] +theorem countVector_apply (I : NumberFieldFractionalIdealGroup K) + (v : HeightOneSpectrum (𝓞 K)) : + countVector I v = + FractionalIdeal.count K v + (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := + rfl + +@[simp] +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 + +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) + +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 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..37d282bc7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.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 +-/ + +import Mathlib.NumberTheory.NumberField.Basic +import Mathlib.RingTheory.ClassGroup.Basic +/-! +# Fractional-ideal group of a number field +-/ + +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] [NumberField 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..004c499de5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +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..56966f5132 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +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..4891265d5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.IsSepClosed +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. +-/ + +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] [NumberField 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..8cc712fa38 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +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. +-/ + +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..da06b35f6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +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. +-/ + +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..bd16ccbcb5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.Norm.Basic +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`. +-/ + +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] [FiniteDimensional 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..1579c5110c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.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 +-/ + +import Mathlib.NumberTheory.NumberField.AdeleRing +import Mathlib.Topology.Algebra.Group.Quotient +import Mathlib.Topology.Algebra.Group.Subgroup +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. +-/ + +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..4919455b75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +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`. +-/ + +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..47d6dc1ba6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +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..bfdf658c08 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +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..e9c0a0b73d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import Mathlib.Algebra.Order.Floor.Ring +import Mathlib.Algebra.Order.Archimedean.Real.Basic +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|`. +-/ + +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..10926e98d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import Mathlib.Algebra.BigOperators.Group.Finset.Basic +import Mathlib.Algebra.Field.Rat +import Mathlib.Data.Finset.Interval +import Mathlib.SetTheory.Cardinal.Finite +/-! +# The Herbrand function at integral lower indices +-/ + +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..36be6101bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.Logic.Function.Basic +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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] + [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 : ℝ) : ℝ := + 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..0604ece19c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +/-! +# Lower ramification jumps +-/ + +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..e13e7691cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.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 +-/ + +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. +-/ + +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..b25133d0bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.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 +-/ + +import Mathlib.RingTheory.Valuation.RamificationGroup +/-! +# Lower ramification groups +-/ + +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..92a057cb8d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import Mathlib.Algebra.Order.Archimedean.Real.Basic +import Mathlib.Algebra.Order.Floor.Ring +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. +-/ + +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..33e51d9f2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +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)`. +-/ + +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..77cdb38821 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +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..b3917065ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +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..d878f5a125 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.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 +-/ + +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. +-/ + +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..e45135d3bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +/-! +# Families of finite-place Hilbert pairings +-/ + +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..138fc70e61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Finite-place factors of a global Hilbert pairing family +-/ + +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..cd54bcf6a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +/-! +# Locality and support conditions for global Hilbert pairing families +-/ + +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..ce9b8da56d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.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 +-/ + +import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic +import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Infinite-place Hilbert factors +-/ + +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] [NumberField 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..8b9c978756 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots +/-! +# Pairings on power classes +-/ + +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..23886c93cc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +/-! +# Algebraic laws for Hilbert pairings +-/ + +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..de2358bad1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +/-! +# The norm-residue criterion +-/ + +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..bb968a93f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Evaluation of a Hilbert pairing on representatives +-/ + +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..6cca95c1d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import Mathlib.RingTheory.Norm.Basic +/-! +# Norms from Kummer algebras +-/ + +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..f283d95a54 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion +/-! +# Local Hilbert pairings +-/ + +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..5a46f74f16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.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 +-/ + +import Mathlib.FieldTheory.KummerExtension +/-! +# Canonical Kummer algebras +-/ + +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..ba36f19362 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +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. +-/ + +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..6a3855a190 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +/-! +# Canonical power classes +-/ + +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..0a1d29ea86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.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 +-/ + +import Mathlib.Algebra.Field.Basic +import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# Multiplicative power-class groups +-/ + +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..979ec6c764 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +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..dce2bd4814 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +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..bd7b0f8f81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.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 +-/ + +import Mathlib.RingTheory.Norm.Basic +/-! +# The field norm on multiplicative groups +-/ + +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] [FiniteDimensional 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..071985d54e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import Mathlib.GroupTheory.QuotientGroup.Basic +/-! +# The field-norm quotient +-/ + +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..36f9584e59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom +/-! +# The subgroup of field norms +-/ + +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..edf53fb689 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.IsSepClosed +/-! +# Finite abelian local extensions +-/ + +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..37ef7d2efb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +/-! +# Predicate for field norms +-/ + +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..0fe8d759b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.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 +-/ + +import Mathlib.GroupTheory.Index +import Mathlib.Topology.Algebra.Group.Units +/-! +# Open finite-index subgroups of a field's multiplicative group +-/ + +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..53cc0a550d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +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..bbd48f9c00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +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..e4bc40b1f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.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 +-/ + +import Mathlib.Algebra.Algebra.Basic +import Mathlib.Basic.Real.Basic +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`. +-/ + +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..37b516001d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +/-! +# Everywhere local norms +-/ + +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..85b688b937 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.Norm.Basic +import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Norms at finite places +-/ + +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] [FiniteDimensional 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..14b72b953b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.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 +-/ + +import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace +import Mathlib.RingTheory.Norm.Basic +import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Norms at infinite places +-/ + +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] [NumberField K] + [Field L] [Algebra K L] [FiniteDimensional 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..43af43b454 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory +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..477390af4f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +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..a86d4673f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +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..3f4c25c46b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +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..74cf5ec122 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -0,0 +1,1192 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +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. +-/ + +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] [NumberField 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] [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] + (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] [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] : + 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. -/ +@[simp] +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] + [IsGalois K M] + [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] + [IsGalois K M] + [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 + +/-- 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⟩ := + _root_.GlobalClassFieldTheory.Cohomology.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)) + (_root_.GlobalClassFieldTheory.Cohomology.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] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois 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..19dc3456be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -0,0 +1,1377 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +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. +-/ + +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 + show + 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 + show + (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 + show 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 + show 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 + show + (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 + show 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⟩ + show + (((((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 + show Additive A + exact Additive.ofMul a.1) + rw [HomologicalComplex.cyclesIsoSc'_inv_iCycles] + show + (((ShortComplex.cyclesMap eS.inv ≫ + ((tateComplex M).sc' (-1) 0 1).iCycles).hom + (S.moduleCatCyclesIso.inv x))) = + (groupCohomology.cochainsIso₀ M).inv + (by + show Additive A + exact Additive.ofMul a.1) + rw [ShortComplex.cyclesMap_i] + show + (((S.moduleCatCyclesIso.inv ≫ S.iCycles ≫ eS.inv.τ₂).hom x)) = + (groupCohomology.cochainsIso₀ M).inv + (by + show Additive A + exact Additive.ofMul a.1) + rw [ShortComplex.moduleCatCyclesIso_inv_iCycles_assoc] + show + (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 + show + (((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 + show + (((groupCohomology.cochainsMap (.id G) φ).f 0 ≫ + (groupCohomology.cochainsIso₀ MB).hom).hom + ((groupCohomology.cochainsIso₀ MA).inv + (by + show 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 + show 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 + show + (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 + show 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] + show + (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 + show + ShortComplex.homologyMap ((eSc ≪≫ eS).hom) = + ShortComplex.homologyMap eSc.hom ≫ + ShortComplex.homologyMap eS.hom + rw [Iso.trans_hom, ShortComplex.homologyMap_comp] + rw [hIso] + show + ((((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 + show 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 + show + (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] + [FiniteDimensional 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] + [FiniteDimensional 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⟩ + show + 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] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois 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 hP : + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).hom cP = + (Additive.ofMul (HerbrandH0.mk a) : + Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))) := by + dsimp only [cP] + exact tateH0IsoHerbrandH0_fixedCycle a + have hI : + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L)).hom cI = + (Additive.ofMul (HerbrandH0.mk aI) : + Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by + dsimp only [cI] + exact tateH0IsoHerbrandH0_fixedCycle aI + have hPe : + eP cP = + (Additive.ofMul (HerbrandH0.mk a) : + Additive + (HerbrandH0 (L ≃ₐ[K] L) + (RelativeIdeleGroup.principalSubgroup K L))) := by + show + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup.principalSubgroup K L)).hom cP = _ + exact hP + have hIe : + eI cI = + (Additive.ofMul (HerbrandH0.mk aI) : + Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by + show + (tateH0IsoHerbrandH0 + (G := L ≃ₐ[K] L) + (A := RelativeIdeleGroup K L)).hom cI = _ + exact hI + have hc : + ((tateCohomologyFunctor 0).map f).hom cP = cI := by + dsimp only [cP, cI] + show + ((((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 + show + 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] [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 + 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 + show 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] [NumberField K] + [Field L] [NumberField 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] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois 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, ?_⟩ + show + 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) + show + 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⟩ + show + 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, ?_⟩ + show 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 + show + 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. -/ +@[simp] +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 + show + 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..05c29c64e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex +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. +-/ + +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..90942cb3ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +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..1336c10b46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +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..3ef76f7010 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import Mathlib.Algebra.Group.Equiv.Basic +import Mathlib.Basic.Sign.Basic +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. +-/ + +open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +/-- 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)) + +/-- 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 + +/-- 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 +/-- 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) + +/-- 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 +/-- 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 +/-- 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] + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..30de61d306 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +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. +-/ + +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..a86889393b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +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. +-/ + +open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +/-- 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⟩ := + LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + ν 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) := + LocalFieldTheory.DiscreteValuationField.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 + +/-- 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 : ℕ)) + +/-- 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 + LocalFieldTheory.DiscreteValuationField.LocalField.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] + +/-- 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..d08538d467 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +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. +-/ + +open scoped NumberField Classical NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + + +/-- 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 + +/-- 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 + LocalFieldTheory.DiscreteValuationField.WithZeroValuation.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⟩ := + LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + ν hν + have hπ : + target.valuation.IsUniformizer (π : E) := + LocalFieldTheory.DiscreteValuationField.WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + ν (π : E) hπval + obtain ⟨u, hu⟩ := + LocalFieldTheory.DiscreteValuationField.ValuedExtension.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 := + LocalFieldTheory.DiscreteValuationField.LocalField.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 + +/-- 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] + +/-- 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 + LocalFieldTheory.DiscreteValuationField.ValuedExtension.degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + base target + +/-- 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..08fe385973 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 + +/-- 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..a21ccc3763 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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] + +/-- 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] + 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 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 : + w ∈ chosenUnitFiniteSupport (K := K) nUnit := by + by_contra hwNotSupport + 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 hwNotSupport + have hnValEq : + w.valuation K ((n : ℕ) : K) = 1 := by + change w.valuation K ((n : ℕ) : K) = 1 at hnUnitVal + exact hnUnitVal + exact (ne_of_lt hnValLt) hnValEq + 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.card + (IdeleClassPowerLocalUnitQuotient + (K := K) n S' T) = + (n : ℕ) ^ r := by + exact + 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 + +/-- 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 + _root_.GlobalClassFieldTheory.Cohomology.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 + +/-- 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..9c686b8fb0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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..9c738d17ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -0,0 +1,531 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import Mathlib.Algebra.Group.Equiv.Basic +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + show + (((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 + +/-- 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) + +/-- 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 + +/-- 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 + +local instance supportedClassQuotient_isMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..3114ccb037 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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] + [FiniteDimensional 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) + +/-- 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] + +/-- 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 + +/-- 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 _ + +/-- The simultaneous local norm condition at every finite place. -/ +def allFinitePlaceLocalNormCondition + {K L : Type} + [Field K] [NumberField K] + [Field L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] : + Subgroup (IdeleGroup K) := + ⨅ v : HeightOneSpectrum (𝓞 K), + (_root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := L) v).comap + (IdeleGroup.finiteComponent v) + +/-- 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] [NumberField 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 + +/-- 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] [NumberField 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 + +/-- 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 + KummerTheory.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 = ⊤ := 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 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 + 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 + · have hle : + (powMonoidHom (n : ℕ) : + (w.adicCompletion K)ˣ →* + (w.adicCompletion K)ˣ).range ≤ + _root_.chosenFinitePlaceLocalNormSubgroup + (K := K) (L := M) w := by + simpa only [M] using + chosenSimpleKummerNthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup + (K := K) n hnK hmu b w + exact hle (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 + have hsOne : + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (IdeleGroup.principalIdele K (s : Kˣ)) = + 1 := + (QuotientGroup.eq_one_iff + (IdeleGroup.principalIdele K (s : Kˣ))).mpr + ⟨(s : Kˣ), rfl⟩ + change + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) + (u * (IdeleGroup.principalIdele K (s : Kˣ))⁻¹) = + QuotientGroup.mk' + (IdeleGroup.principalSubgroup K) a + rw [← huq, map_mul, map_inv, hsOne, map_mul, hqOne] + simp + 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 + 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 + have hbPower : + b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + 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 + 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..f3ec28d31f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean @@ -0,0 +1,204 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +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. +-/ + +open scoped NumberField Classical NNReal IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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)) + +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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..63b625feed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +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. +-/ + +open scoped NumberField Classical 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 +/-- 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 + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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] + +/-- 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 + +/-- 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..912c6c01ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean @@ -0,0 +1,204 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All +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`. +-/ + +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] [NumberField 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] [NumberField 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] [Nontrivial 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] [NumberField 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..e3c0923184 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +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..f182123de3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +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..5830573e71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Combinatorics.Hall.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +/-- 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 = ⊤} + +/-- 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⟩ + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..11e279ef84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -0,0 +1,431 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +/-- 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 + let wi := + sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i + have hwiT : wi ∈ T := by + change + wi ∈ + Finset.univ.image + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S) + exact + Finset.mem_image.mpr + ⟨i, Finset.mem_univ i, rfl⟩ + let wT : T := ⟨wi, hwiT⟩ + have hlocal : + Units.map + (algebraMap K (wi.adicCompletion K)).toMonoidHom + (x : Kˣ) ∈ + (powMonoidHom (n : ℕ) : + (wi.adicCompletion K)ˣ →* + (wi.adicCompletion K)ˣ).range := by + simpa [wT, wi] using hxLocal wT + have hfixed : + (beta : N) ∈ + IntermediateField.fixedField + (HilbertRamification.absoluteValueDecompositionGroup K + (_root_.chosenFinitePlaceExtension + (L := N) wi).1) := + (KummerTheory.finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField + (K := K) (L := N) wi n hmu (x : Kˣ) beta hbeta).mp + hlocal + rw [ + ← sUnitKummerChosenDecompositionField_eq_coordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i] + simpa only [_root_.finitePlaceDecompositionGroup] using hfixed + 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 + let Fix : Subgroup R := + MulAction.stabilizer R (beta : N) + have hgeneratorFix + (i : Fin + (sUnitKummerPrimeCount + (K := K) E n hmu r S)) : + sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i ∈ + Fix := by + have hbi := hbetaCoordinate i + change + (beta : N) ∈ + IntermediateField.fixedField + (Subgroup.zpowers + ((sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i : + R).1)) at hbi + rw [IntermediateField.mem_fixedField_iff] at hbi + have hfix := + hbi + ((sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i : + R).1) + (Subgroup.mem_zpowers + ((sUnitKummerKernelGenerator + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i : + R).1)) + rw [show Fix = MulAction.stabilizer R (beta : N) from rfl, + MulAction.mem_stabilizer_iff] + simpa only [ + MulAction.subgroup_smul_def, + AlgEquiv.smul_def] using hfix + have hspan : + (⨆ 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)) ≤ + Fix := by + refine iSup_le ?_ + intro i + exact Subgroup.zpowers_le.mpr (hgeneratorFix i) + have hFixTop : Fix = ⊤ := by + apply top_unique + rw [ + ← iSup_zpowers_sUnitKummerKernelGenerator_eq_top + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S] + exact hspan + have hbetaKernel : + (beta : N) ∈ + IntermediateField.fixedField + (enlargedSUnitKummerRestrictionHom + (K := K) (Omega := Omega) E n hmu + (galois_pow_eq_one_of_equiv_pi_zmod + (K := K) E n r eG) S).ker := by + rw [IntermediateField.mem_fixedField_iff] + intro sigma hsigma + let sigmaR : R := ⟨sigma, hsigma⟩ + have hsigmaFix : sigmaR ∈ Fix := by + rw [hFixTop] + exact Subgroup.mem_top sigmaR + have hfix : + sigmaR • (beta : N) = (beta : N) := by + exact + MulAction.mem_stabilizer_iff.mp + (show + sigmaR ∈ MulAction.stabilizer R (beta : N) by + simpa only [Fix] using hsigmaFix) + simpa only [ + MulAction.subgroup_smul_def, + AlgEquiv.smul_def] using hfix + 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⟩ := hbetaEmbedded + have hgamma_ne : gamma ≠ 0 := by + intro hgammaZero + apply beta.ne_zero + calc + (beta : N) = algebraMap E N gamma := hgamma.symm + _ = 0 := by rw [hgammaZero, map_zero] + let gammaUnit : Eˣ := + Units.mk0 gamma hgamma_ne + change + (x : Kˣ) ∈ + sUnitFiniteKummerRadical + (K := K) (L := E) n S' + apply + (mem_sUnitFiniteKummerRadical_iff + (K := K) (L := E) n S' (x : Kˣ)).mpr + refine ⟨x.property, gammaUnit, ?_⟩ + apply Units.ext + apply (algebraMap E N).injective + change + algebraMap E N (gamma ^ (n : ℕ)) = + algebraMap E N + (algebraMap K E ((x : Kˣ) : K)) + calc + algebraMap E N (gamma ^ (n : ℕ)) = + (beta : N) ^ (n : ℕ) := by + rw [map_pow, hgamma] + _ = algebraMap K N ((x : Kˣ) : K) := by + simpa using congrArg Units.val hbeta + _ = + algebraMap E N + (algebraMap K E ((x : Kˣ) : K)) := by + rw [IsScalarTower.algebraMap_apply K E N] + · 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ˣ) := by + calc + betaN ^ (n : ℕ) = + Units.map (algebraMap E N).toMonoidHom + (betaE ^ (n : ℕ)) := by + rw [map_pow] + _ = + Units.map (algebraMap E N).toMonoidHom + (Units.map (algebraMap K E).toMonoidHom + (x : Kˣ)) := by + rw [hbetaE] + _ = + Units.map (algebraMap K N).toMonoidHom + (x : Kˣ) := by + apply Units.ext + exact + (IsScalarTower.algebraMap_apply + K E N ((x : Kˣ) : K)).symm + 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 hbetaFixed : + (betaN : N) ∈ + IntermediateField.fixedField + (HilbertRamification.absoluteValueDecompositionGroup K + (_root_.chosenFinitePlaceExtension + (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i)).1) := by + have hdecomp : + (betaN : 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)) := by + rw [ + sUnitKummerChosenDecompositionField_eq_coordinateFixedField + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i] + exact hbetaCoordinate + simpa only [_root_.finitePlaceDecompositionGroup] using hdecomp + have hlocal := + (KummerTheory.finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField + (K := K) (L := N) + (sUnitKummerChosenBasePlaces + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S i) + n hmu (x : Kˣ) betaN hbetaN).mpr + hbetaFixed + rw [← hwi] + exact hlocal + +/-- 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..691897a72e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean @@ -0,0 +1,400 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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..19bc033c5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean @@ -0,0 +1,435 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..41f06b1b13 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +/-- 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] + [FiniteDimensional M 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 + (HilbertRamification.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 + +/-- An unramified chosen finite-place decomposition group is cyclic. -/ +theorem finitePlaceDecompositionGroup_isCyclic_of_chosenUnramified + {F L : Type} + [Field F] [NumberField F] + [Field L] [NumberField 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..2a828d7dd5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.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 +-/ + +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section FinitePlaces + +variable {K : Type} [Field K] + [NumberField K] + +/-- 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) + +/-- 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] + +/-- 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..e83f7e84dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.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 +-/ + +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. +-/ + +open scoped NumberField Classical IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +section GeneralKummer + +variable {K : Type*} [Field K] + [NumberField K] + +/-- 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 + +/-- 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 : ℕ)))) + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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..137594c71a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -0,0 +1,723 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import Mathlib.Algebra.Group.Subgroup.Finite +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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 + 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 + 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 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 : + H.subgroupOf SU ≃* H := + 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 : + H.subgroupOf SU ⧸ + (Npow.subgroupOf SU).subgroupOf + (H.subgroupOf SU) ≃* + H ⧸ Npow.subgroupOf H := + QuotientGroup.congr _ _ eH hmap + let eSecond : + H ⧸ Npow.subgroupOf H ≃* + (H ⊔ Npow : Subgroup Kˣ) ⧸ + Npow.subgroupOf (H ⊔ Npow) := + 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 : + D.carrier ⧸ Npow.subgroupOf D.carrier ≃* + D.RadicalQuotient := + (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 : + D.RadicalQuotient ≃* + (Gal(E/K) →* + KummerTheory.nthRootsSubgroup E (n : ℕ)) := + KummerTheory.finiteKummerCharacterEquiv + n hbase + let eDual : + (Gal(E/K) →* + KummerTheory.nthRootsSubgroup E (n : ℕ)) ≃* + Gal(E/K) := + Classical.choice <| + KummerTheory.finiteNthRootsCharacterDuality + (G := Gal(E/K)) (K := K) (L := E) + n hmu hexponentE + let eQuotient : + Delta ⧸ P.subgroupOf Delta ≃* + Gal(E/K) := + 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 + 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) : + Nat.card + ((w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range) = + (n : ℕ) := by + let F := + LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + (Valued.v : + Valuation (w.1.adicCompletion K) + (WithZero (Multiplicative ℤ))) + let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ + have hnu : Function.Surjective + (Valued.v : + Valuation (w.1.adicCompletion K) + (WithZero (Multiplicative ℤ))) := + w.1.valuedAdicCompletion_surjective K + have hw : + w.1 ∈ + sUnitKummerPrimeSet + (K := K) (Omega := Omega) E n hmu + p v hp hv hn r eG S := + w.2 + rw [sUnitKummerPrimeSet, Finset.mem_image] at hw + obtain ⟨i, _hi, hi⟩ := hw + have hnGlobal : + w.1.valuation K ((n : ℕ) : K) = 1 := by + 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 hnatCast : + (((n : ℕ) : K) : w.1.adicCompletion K) = + ((n : ℕ) : w.1.adicCompletion K) := by + change + algebraMap K (w.1.adicCompletion K) ((n : ℕ) : K) = + ((n : ℕ) : w.1.adicCompletion K) + rw [map_natCast] + have hnuN : + Valued.v ((n : ℕ) : w.1.adicCompletion K) = 1 := by + rw [← hnatCast, + HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] + exact hnGlobal + have hnuNF : + F.valuation ((n : ℕ) : w.1.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.1.adicCompletionIntegers K)ˣ := by + exact MulEquiv.refl ((w.1.adicCompletionIntegers K)ˣ) + have hindexPackaged : + Nat.card + (F.valuationSubringˣ ⧸ + (powMonoidHom (n : ℕ) : + F.valuationSubringˣ →* F.valuationSubringˣ).range) = + Nat.card + ((powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.adicCompletion K)ˣ).ker) := by + simpa only [F] using + LocalFieldTheory.DiscreteValuationField.LocalField.mixed_unitIndex_of_coprime + (Valued.v : + Valuation (w.1.adicCompletion K) + (WithZero (Multiplicative ℤ))) + hnu (n := (n : ℕ)) + have hindex : + Nat.card + ((w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range) = + Nat.card + ((powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.adicCompletion K)ˣ).ker) := by + calc + Nat.card + ((w.1.adicCompletionIntegers K)ˣ ⧸ + (powMonoidHom (n : ℕ) : + (w.1.adicCompletionIntegers K)ˣ →* + (w.1.adicCompletionIntegers K)ˣ).range) = + Nat.card + (F.valuationSubringˣ ⧸ + (powMonoidHom (n : ℕ) : + F.valuationSubringˣ →* F.valuationSubringˣ).range) := by + exact Nat.card_congr + (LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv + (w.1.adicCompletionIntegers K)ˣ + F.valuationSubringˣ + (n : ℕ) + eValuationSubringUnits.symm).toEquiv + _ = Nat.card + ((powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.adicCompletion K)ˣ).ker) := + hindexPackaged + have hroots : + Nat.card + ((powMonoidHom (n : ℕ) : + (w.1.adicCompletion K)ˣ →* + (w.1.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.1.adicCompletion K)).injective).card_rootsOfUnity + simpa only [hroots] using hindex + 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..0f80337a16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +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. +-/ + +open scoped NumberField Classical NNReal IsMulCommutative +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type*} [Field K] [NumberField K] + +private 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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..5bb1b8fbb4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +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..c7a2fde576 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition +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..2b197c35ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField +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. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Cohomology + +variable + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + +/-- 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 + +/-- 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..3b4fb436f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +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. +-/ + +open scoped NumberField Classical +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 +/-- 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 +/-- 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 + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..865a956698 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -0,0 +1,1581 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +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. +-/ + +open scoped Classical 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] + +/-- 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 +/-- 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 +/-- 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) + _ _ _ _ σ h.1 h.2 = 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 + +/-- 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) + _ _ _ _ σ h.1 h.2 = + ∏ 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) + _ _ _ _ σ hSupported.1 hSupported.2 = + 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 _ + +/-- 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) + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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⟩ + +/-- 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)) σ + +/-- 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) σ + +/-- 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)) + +/-- 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 +/-- 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 + +/-- 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 +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 +/-- 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) + _ _ _ _ σ hC.1 hC.2 = + (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 : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S))) := + hUnitDefined.1 + let hUm : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (SUnitGroup (K := L) + (finitePlacesAbove (K := K) (L := L) S)) σ) := + hUnitDefined.2 + let hS0 : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S)) := + hSupportedDefined.1 + let hSm : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (relativeIdeleLocalTensorDecompositionSupportedSubgroup + (K := K) (L := L) S) σ) := + 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) + _ _ _ _ σ hC.1 hC.2 = + q := by + rw [← hUnit, ← hmul, hSupported] + _ = + (q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) * + (Fintype.card (L ≃ₐ[K] L) : ℚ) := by + rw [div_mul_cancel₀ q hcard] + +/-- 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 + +/-- 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) + _ _ _ _ σ hC.1 hC.2 = + (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) + _ _ _ _ σ hUnit.1 hUnit.2 = + 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) + _ _ _ _ σ hSupported.1 hSupported.2 = + 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' + +/-- 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 + +/-- 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)) + +/-- 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..22a588b5e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +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..f3c99b8677 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +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. +-/ + +open scoped NumberField Classical 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] + +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 + +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 + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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] + +/-- 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 +/-- 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 +/-- 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] + +/-- 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 +/-- 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 + +/-- 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] + +/-- 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 + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent + (K := K) (L := L) v + +/-- 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 [← GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (K := K) (L := L) v] + exact + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + (K := K) (L := L) v + +/-- 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 [GlobalClassFieldTheory.GlobalClassFields.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..c238761be3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.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 +-/ + +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. +-/ + +open scoped NumberField Classical + +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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..5b548ed79c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +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. +-/ + +open scoped NumberField Classical NNReal ValuativeRel + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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 := + _root_.GlobalClassFieldTheory.Reciprocity.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 := + _root_.GlobalClassFieldTheory.Reciprocity.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] + +/-- 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_chosenFinitePlaceLocalNormSubgroup_iff_fieldPrincipalUnits_le_localNormSubgroup + (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] + +/-- 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.absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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.absoluteValueExtension_completionNontriviallyNormedField + 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_chosenFinitePlaceLocalNormSubgroup_iff_fieldPrincipalUnits_le_localNormSubgroup + (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..faf851cc36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +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. +-/ + +open scoped NumberField Classical 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 +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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..9c2573b153 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +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..938d6d2fd8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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⟩⟩ + +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 + +/-- 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 + +/-- The arithmetic norm-residue symbol of an idèle class maps to its +literal class modulo the defining subgroup. -/ +@[simp] +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 + +/-- The inverse correspondence sends a represented class modulo `H` +to its actual arithmetic global norm-residue automorphism. -/ +@[simp] +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..6045a921c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +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`. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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⟩⟩ + +/-- 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 + +/-- 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) + +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))⟩ + +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))⟩ + +/-- 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 + +/-- The arithmetic global norm-residue symbol maps to its genuine +narrow ideal class. -/ +@[simp] +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 + +/-- On an actual idèle, arithmetic big-Hilbert reciprocity is its +narrow ideal class. -/ +@[simp] +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] + +/-- 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 + +/-- The arithmetic global norm-residue symbol maps to its genuine +ordinary ideal class. -/ +@[simp] +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 + +/-- On an actual idèle, arithmetic small-Hilbert reciprocity is its +ordinary ideal class. -/ +@[simp] +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..6fe4a1a6a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- Arithmetic ray-class reciprocity sends the arithmetic global +norm-residue symbol of an idèle class to its literal ray class. -/ +@[simp] +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 + +/-- Inverse arithmetic ray reciprocity sends a represented ray class +back to the arithmetic global norm-residue symbol. -/ +@[simp] +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..7bf640eba0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +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. +-/ + +open scoped NumberField Classical + +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] + +/-- 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) + +/-- 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] + +/-- Arithmetic and geometric prime Artin elements are inverse +automorphisms. -/ +@[simp] +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] + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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..13c3c237cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +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. +-/ + +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..626ec55202 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +variable {K : Type} [Field K] [NumberField K] + +local instance bigHilbertArtinIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- 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 + (GlobalClassFieldTheory.GlobalClassFields.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⟩ + +/-- 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 = + (RelativeIdeleGroup.classNorm K E).range := + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := E) + _ = (RelativeIdeleGroup.classNorm K H).range := + (ideleClassNorm_range_algEquiv (K := K) e).symm + _ = (_root_.ideleClassNorm K H).range := + (ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := H)).symm + _ = _ := + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_ideleClassNorm_range_over_original + (K := K) + +/-- The arithmetic Artin isomorphism for an intrinsic big Hilbert class +field, with target the narrow ideal class group. -/ +noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig + (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 + +/-- 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) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig 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 := + GlobalClassFieldTheory.Reciprocity.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 + +/-- 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)) : + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig 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 + (GlobalClassFieldTheory.Reciprocity.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) + +/-- 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..fb751f040c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean @@ -0,0 +1,606 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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. +-/ + +open scoped NumberField NumberField.LiesOver Classical TensorProduct + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable + {K M : Type*} + [Field K] [NumberField K] + [Field M] [NumberField M] + +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 + +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) + +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] + +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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + +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 + +/-- 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] + +/-- 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) + +/-- The big-Hilbert quotient equivalence is induced on representatives +by the actual transport of idele classes. -/ +@[simp] +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 + +/-- 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))) + +/-- 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] + +/-- 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 + +/-- On an idele representative, canonical transport of narrow ideal +classes is represented by the transported idele itself. -/ +@[simp] +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] + +/-- 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..a5778b35db --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.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 +-/ + +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- The canonical base fixed field has degree one over the original +number field. -/ +noncomputable instance + bigHilbertClassFieldBaseFiniteDimensionalOverOriginal : + FiniteDimensional K (bigHilbertClassFieldBase K) := + (bigHilbertClassFieldBaseEquivOverOriginal K) + |>.toLinearEquiv.finiteDimensional + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..6c1006d3b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +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. +-/ + +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..813f9ef5c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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..113943e860 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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..5a9d9f8df4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +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 + +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 + +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) + +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 + +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) + +/-- 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..96e70f46ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +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..966b05f3c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +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..2944a554e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +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..09e3ca6123 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +/-- 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] + +/-- 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..4b4f4bef6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable {K : Type} [Field K] [NumberField K] + +/-- Evaluation of the direct non-topological reciprocity equivalence. -/ +@[simp] +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..92d057e8f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +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..03d9a5b9e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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..98d08acab0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +/-- 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] + +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 + +/-- Under the direct class-field reciprocity equivalence, the global +norm-residue symbol of an idèle class is its quotient class modulo +`H`. -/ +@[simp] +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..f4fce00932 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +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..c928063e2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +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..187f676bed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +/-- 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] + +/-- 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..98da499b1f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable {K : Type} [Field K] [NumberField K] + +/-- 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..a5264aa1a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.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 +-/ + +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. +-/ + +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..9900fc8354 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +/-- 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] + +/-- 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..f7eab3896e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.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 +-/ + +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. +-/ + +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..5609f79789 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.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 +-/ + +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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 + +/-- 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} + +/-- 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 + +/-- A chosen full modulus defining a conductorial subgroup. -/ +noncomputable def chosenDefiningModulus + (H : ConductorialSubgroup K) : + RayClass.Modulus K := + Classical.choose H.2 + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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) + +/-- 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) + +/-- 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⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..10b2ed8517 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -0,0 +1,584 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +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. +-/ + +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 := + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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 := + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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 + narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_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 + narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_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 + narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_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 + finitePlaceSplitsCompletely_imp_narrowFiniteConductorRayPrimeClass_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)) := + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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..70bf1424fe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -0,0 +1,298 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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⟩ + +/-- 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 _ + +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 + show 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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..910c87412d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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) + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- 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 + +/-- 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 _⟩ + +/-- 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 _⟩ + +/-- 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⟩⟩ + +/-- 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⟩⟩ + +/-- 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) + +/-- 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] + +/-- 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..241a2d0b7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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..9e52791719 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality +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. +-/ + +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..13241a942d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_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_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_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_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_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. -/ +@[simp] +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..3e099ff0f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm +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. +-/ + +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..1f738fbd60 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.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 +-/ + +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. +-/ + +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_narrowFiniteConductors_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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductors_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. -/ +@[simp] +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_narrowFiniteConductors_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..dd39956bd2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +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. +-/ + +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..27f38c0c80 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +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. +-/ + +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..b7b15b42b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +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. +-/ + +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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductorCongruenceSubgroup_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 + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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 + (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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..c24be33184 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain +open KummerTheory + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +local instance cyclotomicKummerNormDescent_neZero + (n : ℕ+) : NeZero (n : ℕ) := + ⟨n.ne_zero⟩ + +noncomputable local instance + cyclotomicKummerNormDescent_cyclotomicFiniteDimensional + (n : ℕ+) : + FiniteDimensional K (CyclotomicField (n : ℕ) K) := + IsCyclotomicExtension.finiteDimensional + {(n : ℕ)} K (CyclotomicField (n : ℕ) K) + +noncomputable local instance + cyclotomicKummerNormDescent_cyclotomicIsGalois + (n : ℕ+) : + IsGalois K (CyclotomicField (n : ℕ) K) := + IsCyclotomicExtension.isGalois + {(n : ℕ)} K (CyclotomicField (n : ℕ) K) + +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ζ⟩ + +private theorem cyclotomicKummerNormDescent_natCast_ne_zero + (n : ℕ+) : + ((n : ℕ) : CyclotomicField (n : ℕ) K) ≠ 0 := by + exact Nat.cast_ne_zero.mpr n.ne_zero + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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))) + +/-- 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))) + +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 + +/-- 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) + +/-- 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) + +@[reducible] +noncomputable local instance + cyclotomicKummerNormDescent_kummerAlgebraOverBase + (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 + +@[reducible] +private noncomputable def + cyclotomicKummerNormDescent_kummerSMulOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + SMul K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + Algebra.toSMul + (self := cyclotomicKummerNormDescent_kummerAlgebraOverBase + (K := K) n seed) + +@[reducible] +private noncomputable def + cyclotomicKummerNormDescent_kummerModuleOverBase + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + Module K + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + Algebra.toModule + +private theorem + cyclotomicKummerNormDescent_kummerScalarTower + (n : ℕ+) + (seed : Finset (HeightOneSpectrum (𝓞 K))) : + IsScalarTower K + (CyclotomicField (n : ℕ) K) + (cyclotomicFullSUnitKummerExtension (K := K) n seed) := + IsScalarTower.of_algebraMap_eq' rfl + +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) + +/-- 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⟩ + +/-- 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..a0d258308e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +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. +-/ + +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..176c4f5317 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -0,0 +1,825 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open RamificationTheory +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +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 + +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 + +/-- 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) + +/-- 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 + +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) + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +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 + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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) } + +/-- 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⟩ + +/-- 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⟩ + +/-- 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₂] + [IsAbelianGalois K L₁] [IsAbelianGalois 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₂) + +/-- 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₁ + +/-- 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⟩ + +/-- 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₂ + +/-- 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..bd0ae02c15 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +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. +-/ + +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 + finiteAbelianClassFieldCorrespondence_separableClosureAlgebra : + 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..cfbe9817d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +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`. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open Reciprocity + +/-- Use the same rational algebra structure as the ordinary correspondence +when constructing all named fixed-field carriers below. -/ +noncomputable local instance + finiteAbelianClassFieldCorrespondenceTopology_separableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + rationalSeparableClosureAlgebra + +/-- The actual fixed-field base represented by a finite abstract field. -/ +abbrev ordinaryIdeleClassNormBase + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : Type := + abstractFixedField ℚ (SeparableClosure ℚ) K.field + +/-- 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 + +noncomputable instance ordinaryIdeleClassNormBaseFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ (ordinaryIdeleClassNormBase K) := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) K.field K.finite + +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 + +noncomputable instance ordinaryIdeleClassNormScalarTower + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsScalarTower ℚ + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := + IsScalarTower.of_algebraMap_eq' rfl + +noncomputable instance ordinaryIdeleClassNormExtensionAbsoluteFiniteDimensional + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + FiniteDimensional ℚ + (ordinaryIdeleClassNormExtension K L) := + FiniteDimensional.trans ℚ + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) + +noncomputable instance ordinaryIdeleClassNormBaseNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField (ordinaryIdeleClassNormBase K) := + NumberField.of_module_finite ℚ (ordinaryIdeleClassNormBase K) + +noncomputable instance ordinaryIdeleClassNormExtensionNumberField + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + NumberField (ordinaryIdeleClassNormExtension K L) := + NumberField.of_module_finite ℚ + (ordinaryIdeleClassNormExtension K L) + +noncomputable instance ordinaryIdeleClassNormExtensionIsAbelianGalois + (K : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (L : FiniteAbelianSubextension K.field) : + IsAbelianGalois + (ordinaryIdeleClassNormBase K) + (ordinaryIdeleClassNormExtension K L) := + finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois L + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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)) + +/-- 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..fc00bd4347 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +/-- 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⟩ + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +instance closedFiniteIndexNormExponentNeZero + (H : Subgroup (IdeleClassGroup K)) + [H.FiniteIndex] : + NeZero (closedFiniteIndexNormExponent (K := K) H : ℕ) := + ⟨(closedFiniteIndexNormExponent (K := K) H).ne_zero⟩ + +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 + +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) + +noncomputable instance closedFiniteIndexNormCyclotomicFieldNumberField + (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : + NumberField + (closedFiniteIndexNormCyclotomicField (K := K) H) := + NumberField.of_module_finite K + (closedFiniteIndexNormCyclotomicField (K := K) H) + +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) + +/-- 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) + +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) + +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) + +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) + +@[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 + +@[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) + +@[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 + +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 + +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) + +/-- 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) + +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 + +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) + +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) + +/-- 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..2efbd30ec8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped NumberField Classical + +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] + +/-- 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⟩) + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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..a5c5ea83f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField + +variable {K : Type} [Field K] [NumberField K] + +/-- 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..6b0a7a4cd5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -0,0 +1,432 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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, + bigHilbertQuotientEquiv_mem_narrowClassKernel + (K := K) q⟩ + invFun c := + ⟨(bigHilbertClassFieldQuotientEquivNarrowClassGroup + (K := K)).symm c.1, + 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, + 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..150eb44f24 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean @@ -0,0 +1,894 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import Mathlib.NumberTheory.NumberField.Basic +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. +-/ + +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. -/ +@[simp] +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..3dbe843082 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean @@ -0,0 +1,562 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +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. +-/ + +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_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_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_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_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_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + (K := K) (L := L) hLunramifiedFinite).2 hLdegree + _ = (_root_.ideleClassNorm K M).range := + ((ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_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..2f819b491e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +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. +-/ + +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_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_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 + maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertClassFieldSplitsCompletely + (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 + (maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertClassFieldSplitsCompletely + (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..d787639821 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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))) + +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)) + +/-- 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 + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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))) + +/-- 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..2d02641635 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +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..8d56756279 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +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..a2bb16cc10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +local instance + bigHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +/-- 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)) + +/-- 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. -/ +private 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 + +/-- 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 + +/-- 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. -/ +@[simp] +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 + +/-- 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. -/ +@[simp] +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..3efaf1b1ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +local instance + bigHilbertClassFieldReciprocityOverOriginalIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +/-- 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 + +/-- 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 + +/-- 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 + +/-- The direct big-Hilbert reciprocity equivalence sends the genuine +global norm-residue symbol to its narrow ideal class. -/ +@[simp] +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 + +/-- On an actual idèle, direct big-Hilbert reciprocity is its narrow +ideal class. -/ +@[simp] +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..c44e615509 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +local instance + smallHilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +/-- 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)) + +/-- 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. -/ +private 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 + +/-- 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 + +/-- 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. -/ +@[simp] +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 + +/-- 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. -/ +@[simp] +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..f902d22b86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField +open Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +local instance + smallHilbertClassFieldReciprocityOverOriginalIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +/-- 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 + +/-- 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 + +/-- 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 + +/-- The direct small-Hilbert reciprocity equivalence sends the genuine +global norm-residue symbol to its ordinary ideal class. -/ +@[simp] +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 + +/-- On an actual idèle, direct small-Hilbert reciprocity is its +ordinary ideal class. -/ +@[simp] +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..de6ec2b6e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open Reciprocity + +/-- 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⟩⟩ + +local instance + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutativeLocal + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + hilbertClassFieldReciprocityIdeleClassGroupIsMulCommutative + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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..df933869f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +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. +-/ + +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 + show + (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 + show + (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..10f137b539 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +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. +-/ + +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. -/ +@[simp] +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..2b81e81c00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.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 +-/ + +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClosedSubgroup + +variable {G H : Type*} + [Group G] [TopologicalSpace G] + [Group H] [TopologicalSpace H] + +/-- 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' + +/-- 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 + +/-- 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 + +@[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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 _ + +/-- 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..a9204fcc50 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex +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. +-/ + +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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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..2254f5c793 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand +import Mathlib.NumberTheory.RamificationInertia.Unramified +import Mathlib.FieldTheory.Finite.Basic +import Mathlib.RingTheory.Frobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +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. +-/ + +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] + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (K := K) (L := L) v hunram) + _ = Ideal.inertiaDegIn v.asIdeal (𝓞 L) := + GlobalClassFieldTheory.IdealClassFieldTheory.finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) v + (chosenFinitePlaceIsUnramified_of_isUnramifiedIn + (K := K) (L := L) v hunram) + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (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τ + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.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 + +/-- 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) := + GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card + K + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.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 + +/-- 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⟩ := + GlobalClassFieldTheory.GlobalClassFields.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 + +/-- 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 + @GlobalClassFieldTheory.GlobalClassFields.finiteAbelianExtension_nonempty_algHom_to_smallHilbertClassField_of_everywhereUnramified + 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 := Classical.choice + (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⟩ + +/-- 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 := + GlobalClassFieldTheory.IdealClassFieldTheory.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..9c645cab83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -0,0 +1,300 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +/-! # Mathlib Global Reciprocity -/ +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 + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + (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) + +/-- 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 GlobalClassFieldTheory.IdealClassFieldTheory.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..adedf19e3c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean @@ -0,0 +1,739 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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⟩⟩ + +omit [NumberField L] 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⟩ + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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⟩ + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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)⟩⟩ + +/-- The narrow finite conductor of the actual idèle-class norm range. -/ +noncomputable def ideleClassNormNarrowFiniteConductor : + RayClass.FiniteModulus K := + (ideleClassNormConductorialSubgroup + (K := K) (L := L)).narrowFiniteConductor + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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) + +/-- The narrow finite conductor ray-class quotient map sends an idèle class to its +class modulo the actual norm subgroup. -/ +@[simp] +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 + +/-- 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⟩ + +/-- 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)) + +/-- 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))) + +/-- 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)] + +/-- 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)) + +/-- 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)) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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⟩ + +/-- 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..96306051bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +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`. +-/ + +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 + finiteNormalClosureMaximalAbelianSubfield_fixingSubgroup_image_eq_originalFixingSubgroup_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 [ + finiteNormalClosureMaximalAbelianSubfield_fixingSubgroup_image_eq_originalFixingSubgroup_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..35e28395a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.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 +-/ + +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. +-/ + +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_narrowFiniteConductorCongruenceSubgroup_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 + narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductors_eq_of_rayClassGroup_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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductorCongruenceSubgroup_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_narrowFiniteConductors_eq_of_rayClassGroup_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. -/ +@[simp] +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..f4443a310e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean @@ -0,0 +1,399 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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..e7b17217bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +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. +-/ + +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..8207c8c004 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom + +variable {K : Type} [Field K] [NumberField K] + +/-- 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..1e0a383f2d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +private theorem finiteAbelianReciprocity_primeArtin_eq_original + (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)) + (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 + +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 + +/-- 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] + +/-- 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..fdea9dd430 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +private theorem publicIdealNormDomain_eq_source + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional 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 + +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] + +/-- 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..5c1ceec418 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +private theorem publicIdealNormDomain_eq_source' + (K L : Type) + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional 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 + +/-- 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..3fdfdd7120 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -0,0 +1,606 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.GlobalClassFieldComparison + +universe u + +/-- 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 + +/-- 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 + +/-- 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⟩⟩ + +/-- 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 + +/-- 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⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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, + GlobalClassFieldTheory.GlobalClassFields.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, + GlobalClassFieldTheory.GlobalClassFields.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 + +/-- 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))) + +/-- 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 + +/-- 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 := + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + (K := K) (L := E) + have hinfiniteSupport := + GlobalClassFieldTheory.GlobalClassFields.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) + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 GlobalClassFieldTheory.GlobalClassFields.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, + GlobalClassFieldTheory.GlobalClassFields.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..7c330ecbde --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup + +/-- 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 } + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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 : ℤ) + +/-- 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)⟩ + +/-- 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 + +/-- The ideal residue homomorphism sends the rational prime ideal at +`q ∤ m` to the direct residue unit `q`. -/ +@[simp] +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 + +/-- The canonical normalized finite prime idèle class at `q ∤ m` has +direct residue `q` under the rational ray-class equivalence with +`(ZMod m)ˣ`. -/ +@[simp] +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..6e40483da7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -0,0 +1,691 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue +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`. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open ClassFormation +open LocalClassFieldTheory +open NumberField +open Reciprocity +open CyclicCohomology + +variable {K : Type} [Field K] [NumberField K] + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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)) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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] + +/-- 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 _⟩ + +/-- 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)) + +/-- 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⟩ + +/-- 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)) + +/-- 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 } + +/-- 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 + +/-- 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`. -/ +@[simp] +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) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- 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σ + +/-- 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⟩ + +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) + +/-- 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. -/ +private 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⁻¹ + +/-- 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)) + +/-- 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⟩) + +/-- 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] + +/-- 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 + +/-- Under ray-class reciprocity, the actual global norm-residue symbol +is the ray class of its idèle-class representative. -/ +@[simp] +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..d62b59ed5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +variable (K : Type) [Field K] [NumberField K] + +local instance ideleClassIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance rayCongruenceNormal (m : RayClass.Modulus K) : + (RayClass.Modulus.congruenceSubgroup m).Normal := + Subgroup.normal_of_isMulCommutative _ + +/-- 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) + +/-- 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⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..f4f005af89 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..dca3435379 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..647a37b949 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain IdeleGroup Reciprocity + +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)) + +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 + +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 + +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 + +/-- 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..deba601152 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory.GlobalClassFields + +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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..4553c084be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory.GlobalClassFields + +universe u v + +/-- 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..d50d8c88be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -0,0 +1,527 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient +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. +-/ + +open scoped NumberField Classical BigOperators + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom +open KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 : + 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 + 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 + KummerTheory.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 + 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 + have hbPower : + b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by + 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 + 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' ∅ + +/-- 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) + +/-- 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..8c5cb4089f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain +open GlobalClassFieldTheory.ClassFieldAxiom +open KummerTheory + +variable {K : Type} [Field K] [NumberField K] + +/-- 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..01bd0e544c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean @@ -0,0 +1,335 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import Mathlib.NumberTheory.NumberField.ClassNumber +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. +-/ + +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. -/ +@[simp] +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..6231e54f1c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory.SmallHilbertClassFieldComparison + +variable {K : Type} [Field K] [NumberField K] + +local instance smallHilbertArtinIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- 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 = + (RelativeIdeleGroup.classNorm K E).range := + ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := E) + _ = (RelativeIdeleGroup.classNorm K H).range := + (ideleClassNorm_range_algEquiv (K := K) e).symm + _ = (_root_.ideleClassNorm K H).range := + (ordinaryIdeleClassNorm_range_eq_relative + (K := K) (L := H)).symm + _ = _ := + GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_ideleClassNorm_range_over_original + (K := K) + +private 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₃ + +/-- Arithmetic reciprocity identifies the Galois group of any intrinsic +small Hilbert class field with the ordinary ideal class group. -/ +noncomputable def arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall + (E : FiniteAbelianExtension K) (hE : IsSmallHilbertClassField E) : + (E ≃ₐ[K] E) ≃* ClassGroup (𝓞 K) := + arithmeticHilbertClassGroupEquivOfNormRange E + (smallHilbertClassField_ideleClassNorm_range_of_isSmall E hE) + +/-- 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) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall 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 := + GlobalClassFieldTheory.Reciprocity.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 + +/-- 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)) : + arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall 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 + (GlobalClassFieldTheory.Reciprocity.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..df1b5bf995 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +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. +-/ + +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..a5509c52d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +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. +-/ + +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. -/ +@[simp] +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..e5206f6c68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.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 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- The canonical fixed-field copy has degree one over the original +number field. -/ +noncomputable instance + smallHilbertClassFieldBaseFiniteDimensionalOverOriginal : + FiniteDimensional K (smallHilbertClassFieldBase K) := + (smallHilbertClassFieldBaseEquivOverOriginal K) + |>.toLinearEquiv.finiteDimensional + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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..93089b0843 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean @@ -0,0 +1,455 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +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. +-/ + +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. -/ +@[simp] +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..246f1607ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +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. +-/ + +open scoped NumberField Classical + +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] + +/-- 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) + +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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..8930ae467d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +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. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace GlobalClassFields + +open NumberField IsDedekindDomain + +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] + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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..db59ce4172 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +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..532fef6f96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean @@ -0,0 +1,294 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +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. +-/ + +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..5ebc663927 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +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..658480f425 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean @@ -0,0 +1,259 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient +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. +-/ + +open scoped NumberField Classical + +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 + +/-- 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) + +/-- 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 + +/-- The arithmetic ideal Artin map is exactly the inverse of the +geometrically normalized map on every ideal. -/ +@[simp] +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] + +/-- 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) + +/-- 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 + +/-- 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 + +/-- The arithmetic ideal class-field equivalence sends a quotient +representative to its arithmetic ideal Artin symbol. -/ +@[simp] +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 + +/-- 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) + +/-- 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⟩ + +/-- 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] + +/-- 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..07c32a5cb3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +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. +-/ + +open scoped NumberField Classical + +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] + +/-- 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, + GlobalClassFields.orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + (K := K) (L := L) v hunram] + exact + finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + (K := K) (L := L) v hunram + +/-- 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] + +/-- 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..1d1ffd01ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean @@ -0,0 +1,824 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +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. +-/ + +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. -/ +@[simp] +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..b3e21ecadb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.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 +-/ + +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`. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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..81b7364931 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean @@ -0,0 +1,560 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +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. +-/ + +open scoped NumberField Classical 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 + +/-- 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) + +/-- 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⟩ + +/-- 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] + +/-- 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] + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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..5c280a2261 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.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 +-/ + +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`. +-/ + +open scoped NumberField Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open NumberField IsDedekindDomain + +variable {K : Type} [Field K] [NumberField K] + +attribute [local instance] + ideleClassSubgroupNormal idealArtinKernelNormal + +/-- 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) + +/-- 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)) + +/-- 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..f42884568c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.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 +-/ + +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. +-/ + +open scoped NumberField Classical 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 + +/-- 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] + +/-- 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] + +/-- 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⟩ + +/-- 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 +/-- The ideal-norm quotient comparison sends an ideal representative to its +class in the idèle-class norm quotient. -/ +@[simp] +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 + +/-- 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) + +/-- The descended arithmetic ideal Artin map evaluates on quotient +representatives as the original arithmetic ideal Artin map. -/ +@[simp] +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 _ _ _ + +/-- 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' _ + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- The arithmetic ideal norm-quotient equivalence sends a quotient +representative to its arithmetic ideal Artin symbol. -/ +@[simp] +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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 := + (GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (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] + +/-- 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 + (GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup + (K := K) (L := L) m hm) + +/-- 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..db9d18ff15 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.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 +-/ + +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. +-/ + +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..a52c86b924 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.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 +-/ + +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. +-/ + +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..17016edbae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +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. +-/ + +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..970d0bd5dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison +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`. +-/ + +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. -/ +@[simp] +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..2adccce267 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean @@ -0,0 +1,224 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +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. +-/ + +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..62660153f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +local instance + principalIdealTransferIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance + principalIdealTransferIdeleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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 + +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 + +/-- 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 + +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 + +/-- 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 + +private structure SmallHilbertClassFieldExplicitNormMembershipData + (K : Type) [Field K] [NumberField K] : Type where + membership : smallHilbertClassFieldExplicitNormMembershipStatement K + +private noncomputable def + smallHilbertClassFieldExplicitNormMembershipData_proof : + SmallHilbertClassFieldExplicitNormMembershipData K where + membership := 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 + +/-- 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) + +/-- 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) + +/-- 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) + +private structure SmallHilbertClassFieldSecondNormRangeContainmentData + (K : Type) [Field K] [NumberField K] : Type where + containment : smallHilbertClassFieldSecondNormRangeContainment K + +private noncomputable def + 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 + +/-- 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..0c551f2803 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation +/-! +# Rational abstract extension transport to ordinary idele classes + +Compatibility of abstract extension with ordinary idele classes. +-/ + +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..8ba90c3fb4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +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..da9d55e4d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +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..874c1819a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.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 +-/ + +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. +-/ + +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..0f032b8de6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +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. +-/ + +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..1ab054e88c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +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. +-/ + +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..f3c6061fc8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives +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. +-/ + +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) : Type 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) : Type 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) : Type 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) : Type 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) : Type 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..9a67f7d19d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.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 +-/ + +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. +-/ + +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..b5fe234999 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.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 +-/ + +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. +-/ + +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..e7ecc49fdf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes +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. +-/ + +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 noncomputable def + rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_finiteNormRepresentativeQuotientZero + (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 noncomputable def + 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 := + rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_finiteNormRepresentativeQuotientZero + (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 noncomputable def + 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 noncomputable def + 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..ecd5acdf2b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.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 +-/ + +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. +-/ + +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..44e556ea5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer +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. +-/ + +open scoped Classical IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open Reciprocity + +local instance + smallHilbertPrincipalization_ideleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance + smallHilbertPrincipalization_ideleClassSubgroupNormal + {F : Type} [Field F] [NumberField F] + (N : Subgroup (IdeleClassGroup F)) : N.Normal := + N.normal_of_isMulCommutative + +local instance + smallHilbertPrincipalization_smallHilbertQuotientGroup + {F : Type} [Field F] [NumberField F] : + Group + (IdeleClassGroup F ⧸ + smallHilbertClassFieldNormSubgroup (K := F)) := + QuotientGroup.Quotient.group + (smallHilbertClassFieldNormSubgroup (K := F)) + +local instance + smallHilbertPrincipalization_smallHilbertQuotientOne + {F : Type} [Field F] [NumberField F] : + One + (IdeleClassGroup F ⧸ + smallHilbertClassFieldNormSubgroup (K := F)) := + ⟨(smallHilbertPrincipalization_smallHilbertQuotientGroup + (F := F)).one⟩ + +variable (K : Type) [Field K] [NumberField K] + +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 + +/-- 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 + +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 + +/-- 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 + +/-- 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) + +/-- 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..3a7c0a24b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +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. +-/ + +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..ff0dfe6ef1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean @@ -0,0 +1,1228 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +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. +-/ + +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] + +private 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 + +private 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..f4aa7e6c17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -0,0 +1,880 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace IdealClassFieldTheory + +open AlgebraicNumberTheory +open ClassFormation +open CyclicCohomology +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory +open RamificationTheory +open Reciprocity + +/-- 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 + +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 + +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) + +private 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 + +private noncomputable instance + smallHilbertTowerMiddleAbstractQuotientFinite : + Finite + ((baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)).toSubgroup ⧸ + extensionSubgroup + (baseField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + L.field (le_baseField L.field)) := + (smallHilbertTowerMiddleFiniteAbstractField K L).finite + +private noncomputable instance + smallHilbertTowerMiddleFiniteDimensional : + FiniteDimensional ℚ E := + abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field inferInstance + +private noncomputable instance + smallHilbertTowerMiddleNumberField : + NumberField E := + NumberField.of_module_finite ℚ E + +/-- 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 + +/-- 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)) + +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientAlgebra : + Algebra E N := + closedFiniteIndexNormAmbientCanonicalBaseAlgebra E + (smallHilbertClassFieldNormSubgroup (K := E)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := E)) + +attribute [local instance] smallHilbertTowerNormAmbientAlgebra + +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientSMul : + SMul E N := + Algebra.toSMul + (self := smallHilbertTowerNormAmbientAlgebra K L) + +@[reducible] +private noncomputable def + smallHilbertTowerNormAmbientModule : + Module E N := + @Algebra.toModule E N _ _ + (smallHilbertTowerNormAmbientAlgebra K L) + +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))) + +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) } + +private theorem smallHilbertTowerNormAmbientAlgHom_apply + (x : E) : + smallHilbertTowerNormAmbientAlgHom K L x = + algebraMap E N x := by + rfl + +private theorem + smallHilbertTowerNormAmbientIsGalois : + IsGalois E N := by + unfold smallHilbertClassFieldNormAmbient + closedFiniteIndexClassFieldNormAmbient + exact + closedFiniteIndexNormAmbientIsGalois + (smallHilbertClassFieldNormSubgroup (K := E)) + (smallHilbertClassFieldNormSubgroup_isClosed (K := E)) + +attribute [local instance] smallHilbertTowerNormAmbientIsGalois + +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 ℚ) _) + +/-- 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 + +@[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) + +/-- 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) + +@[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 _ + +private abbrev smallHilbertNormNeighborhoodEmbeddedBase : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange + ((smallHilbertNormNeighborhoodEmbedding K L).comp + (smallHilbertTowerNormAmbientAlgHom K L))) + +private abbrev smallHilbertNormNeighborhoodEmbeddedField : + ClosedSubgroup + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := + closedFixingSubgroup ℚ (SeparableClosure ℚ) + (AlgHom.fieldRange + (smallHilbertNormNeighborhoodEmbedding K L)) + +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) + +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 + +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 ℚ) + +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 + +private noncomputable def rebaseFiniteGaloisSubextension + {G : Type} [Group G] [TopologicalSpace G] + {B B' : ClosedSubgroup G} (h : B = B') + (P : FiniteGaloisSubextension B) : + FiniteGaloisSubextension B' := + h ▸ P + +@[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 + +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 + +/-- 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) + +/-- 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 + +private noncomputable abbrev + smallHilbertFiniteGaloisNormNeighborhoodTopField : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (smallHilbertFiniteGaloisNormNeighborhood K L).below + +local notation "E₂" => + smallHilbertFiniteGaloisNormNeighborhoodTopField K L + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodQuotientFinite : + Finite + (L.field.toSubgroup ⧸ + extensionSubgroup L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below) := + (smallHilbertFiniteGaloisNormNeighborhood K L).finite + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodFiniteDimensional : + FiniteDimensional E E₂ := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below + inferInstance inferInstance + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodScalarTower : + IsScalarTower ℚ E E₂ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodAbsoluteFiniteDimensional : + FiniteDimensional ℚ E₂ := + FiniteDimensional.trans ℚ E E₂ + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodNumberField : + NumberField E₂ := + NumberField.of_module_finite ℚ E₂ + +private noncomputable instance + smallHilbertFiniteGaloisNormNeighborhoodIsGalois : + IsGalois E E₂ := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) L.field + (smallHilbertFiniteGaloisNormNeighborhood K L).field + (smallHilbertFiniteGaloisNormNeighborhood K L).below + (smallHilbertFiniteGaloisNormNeighborhood K L).normal + +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)) + +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) + +@[simp] +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 + +private noncomputable def + smallHilbertFiniteGaloisNormNeighborhoodRelativeTopEquiv : + N ≃ₐ[E] E₂ := { + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv K L with + commutes' := fun x => + smallHilbertFiniteGaloisNormNeighborhoodTopEquiv_algebraMap + K L x } + +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))) + +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 + +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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +private noncomputable abbrev secondSmallHilbertClassFieldTopField : Type := + abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (secondSmallHilbertClassFieldSubextension K L).below + +local notation "T₂" => secondSmallHilbertClassFieldTopField K L + +private noncomputable instance + secondSmallHilbertClassFieldSubextensionQuotientFinite : + Finite + (L.field.toSubgroup ⧸ + extensionSubgroup L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below) := + (secondSmallHilbertClassFieldSubextension K L).finite + +private noncomputable instance + secondSmallHilbertClassFieldTopFiniteDimensional : + FiniteDimensional E T₂ := + abstractRelativeFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below + inferInstance inferInstance + +private noncomputable instance + secondSmallHilbertClassFieldTopScalarTower : + IsScalarTower ℚ E T₂ := + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) + +private noncomputable instance + secondSmallHilbertClassFieldTopAbsoluteFiniteDimensional : + FiniteDimensional ℚ T₂ := + FiniteDimensional.trans ℚ E T₂ + +private noncomputable instance + secondSmallHilbertClassFieldTopNumberField : + NumberField T₂ := + NumberField.of_module_finite ℚ T₂ + +private noncomputable instance + secondSmallHilbertClassFieldTopIsGalois : + IsGalois E T₂ := + abstractRelativeFixedField_isGalois + ℚ (SeparableClosure ℚ) L.field + (secondSmallHilbertClassFieldSubextension K L).field + (secondSmallHilbertClassFieldSubextension K L).below + (secondSmallHilbertClassFieldSubextension K L).normal + +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 + +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 + +/-- 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) + +/-- 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] + +/-- 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) + +/-- 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) + +/-- 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..91aed72d25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +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. +-/ + +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..69fa2f35d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +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..30c5ccaa14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -0,0 +1,1666 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +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. +-/ + +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 + +/-- 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 ℚ _ + +noncomputable local instance + numberFieldEmbeddedAbstractRelativeFixedFieldRestrictScalarsAlgebra + [FiniteDimensional K L] [IsGalois K L] + (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. -/ +@[simp] +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 + [FiniteDimensional K L] [IsGalois K L] + (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. -/ +@[simp] +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. -/ +private 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 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. -/ +private 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..9c81d30494 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +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..eef50d8d3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +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. +-/ + +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 + arithmeticGlobalNormResidueAbelianization_galoisAbelianizationTopology : + TopologicalSpace (Abelianization (Gal(L / K))) := + topologicalGlobalNormResidueAbelianization_galoisAbelianizationTopology + 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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..d846afed34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +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..c86a2cf2fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +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..c3d75532a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +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. +-/ + +open scoped Classical 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] + +local instance + infinitePlaceCompatibilityIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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] + +/-- 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 +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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ˣ)) + +/-- 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ˣ) + +/-- 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 +/-- 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 + +/-- 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ˣ) + +/-- 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) + +/-- 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) + +/-- 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)) + +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 +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] + +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] + +/-- 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. -/ +@[simp] +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..1074936fdc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -0,0 +1,688 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped Classical IsMulCommutative +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +section ComplexConjugationOverextension + +variable + {K L : Type} + [Field K] + [Field L] [NumberField L] [Algebra K L] + +/-- 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] + +/-- 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 + +@[reducible] +noncomputable local instance + infinitePlaceComplexificationOverfieldRationalAlgebra + (v : InfinitePlace K) : + Algebra ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v).algebra' + +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 + +noncomputable instance + infinitePlaceComplexificationOverfield_numberField + (v : InfinitePlace K) : + NumberField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + NumberField.of_module_finite ℚ + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) + +/-- 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 +/-- 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 + +noncomputable instance + infinitePlaceComplexificationOverfield_algebra + (v : InfinitePlace K) : + Algebra L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).toRingHom.toAlgebra + +/-- The scalar action belonging to the chosen top-field embedding. -/ +noncomputable instance + infinitePlaceComplexificationOverfield_smul + (v : InfinitePlace K) : + SMul L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfield_algebra + (K := K) (L := L) v).toSMul + +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 + +noncomputable instance + infinitePlaceComplexificationOverfield_baseAlgebra + (v : InfinitePlace K) : + Algebra K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + ((infinitePlaceComplexificationOverfieldEmbedding + (K := K) (L := L) v).comp + (IsScalarTower.toAlgHom ℚ K L)).toRingHom.toAlgebra + +/-- The scalar action induced from the original base-field embedding. -/ +noncomputable instance + infinitePlaceComplexificationOverfield_baseSmul + (v : InfinitePlace K) : + SMul K + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (infinitePlaceComplexificationOverfield_baseAlgebra + (K := K) (L := L) v).toSMul + +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 + +instance + infinitePlaceComplexificationOverfield_scalarTower + (v : InfinitePlace K) : + IsScalarTower K L + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + IsScalarTower.of_algebraMap_eq' rfl + +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) + +/-- 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) + +noncomputable instance + rationalComplexification_infinitePlaceOverfield_algebra + (v : InfinitePlace K) : + Algebra rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (rationalComplexificationEmbeddingInInfinitePlaceOverfield + (K := K) (L := L) v).toRingHom.toAlgebra + +/-- 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 + rationalComplexification_infinitePlaceOverfield_smul + (v : InfinitePlace K) : + SMul rationalComplexificationCyclotomicField + (infinitePlaceComplexificationOverfield + (K := K) (L := L) v) := + (rationalComplexification_infinitePlaceOverfield_algebra + (K := K) (L := L) v).toSMul + +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 + +/-- 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 + +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 + +/-- 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} + +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 + +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 +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 +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 +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 +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 +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 +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 +/-- 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) + +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)) + +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) + +/-- 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 +/-- 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] + +/-- 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 +/-- 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 +/-- 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..73ad492e16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +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. +-/ + +open scoped Classical IsMulCommutative +open AlgebraicNumberTheory NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +attribute [local instance] + rationalComplexificationCyclotomicField_isAbelianGalois + +private def rationalComplexificationAmbientField : + IntermediateField ℚ (SeparableClosure ℚ) := by + letI : Algebra ℚ KummerTheory.rationalCyclotomicField := + DivisionRing.toRatAlgebra + exact IntermediateField.lift rationalComplexificationCyclotomicField + +private noncomputable def rationalComplexificationAmbientEquiv : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationAmbientField := by + letI : Algebra ℚ KummerTheory.rationalCyclotomicField := + DivisionRing.toRatAlgebra + exact IntermediateField.liftAlgEquiv + rationalComplexificationCyclotomicField + +variable (F : Type*) [Field F] [NumberField F] + +/-- The actual compositum of the chosen copy of `F` with the rational +complexification field inside `SeparableClosure ℚ`. -/ +def numberFieldComplexification : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure F ⊔ + rationalComplexificationAmbientField + +@[reducible] +noncomputable local instance + numberFieldComplexificationRationalAlgebra : + Algebra ℚ (numberFieldComplexification F) := + (numberFieldComplexification F).algebra' + +noncomputable instance numberFieldComplexification_finiteDimensional : + FiniteDimensional ℚ (numberFieldComplexification F) := by + let : + FiniteDimensional ℚ + rationalComplexificationAmbientField := + rationalComplexificationAmbientEquiv.toLinearEquiv.finiteDimensional + exact + IntermediateField.finiteDimensional_sup + (numberFieldInRationalSeparableClosure F) + rationalComplexificationAmbientField + +noncomputable instance numberFieldComplexification_numberField : + NumberField (numberFieldComplexification F) := + NumberField.of_module_finite ℚ (numberFieldComplexification F) + +/-- 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⟩)) + +/-- 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 + +noncomputable instance numberFieldComplexification_algebra : + Algebra F (numberFieldComplexification F) := + (numberFieldComplexificationEmbedding F).toRingHom.toAlgebra + +/-- 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 numberFieldComplexification_smul : + SMul F (numberFieldComplexification F) := + (numberFieldComplexification_algebra F).toSMul + +noncomputable instance rationalComplexificationCompositum_algebra : + Algebra rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + (rationalComplexificationCompositumEmbedding F).toRingHom.toAlgebra + +/-- 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 rationalComplexificationCompositum_smul : + SMul rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + (rationalComplexificationCompositum_algebra F).toSMul + +instance numberFieldComplexification_scalarTower : + IsScalarTower ℚ F (numberFieldComplexification F) := + IsScalarTower.of_algebraMap_eq' + (numberFieldComplexificationEmbedding F).comp_algebraMap.symm + +instance rationalComplexificationCompositum_scalarTower : + IsScalarTower ℚ rationalComplexificationCyclotomicField + (numberFieldComplexification F) := + IsScalarTower.of_algebraMap_eq' + (rationalComplexificationCompositumEmbedding F).comp_algebraMap.symm + +noncomputable instance + numberFieldComplexification_finiteDimensional_over_base : + FiniteDimensional F (numberFieldComplexification F) := + FiniteDimensional.right ℚ F (numberFieldComplexification F) + +/-- 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) + +private def numberFieldComplexificationBaseLayer : + IntermediateField ℚ (numberFieldComplexification F) := + (numberFieldInRationalSeparableClosure F).restrict + (show numberFieldInRationalSeparableClosure F ≤ + numberFieldComplexification F from + le_sup_left) + +private def numberFieldComplexificationCyclotomicLayer : + IntermediateField ℚ (numberFieldComplexification F) := + rationalComplexificationAmbientField.restrict + (show + rationalComplexificationAmbientField ≤ + numberFieldComplexification F from + le_sup_right) + +@[reducible] +noncomputable local instance + numberFieldComplexificationBaseLayerRationalAlgebra : + Algebra ℚ (numberFieldComplexificationBaseLayer F) := + (numberFieldComplexificationBaseLayer F).algebra' + +@[reducible] +noncomputable local instance + numberFieldComplexificationCyclotomicLayerRationalAlgebra : + Algebra ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer F).algebra' + +private noncomputable def numberFieldComplexificationBaseEquiv : + F ≃ₐ[ℚ] numberFieldComplexificationBaseLayer F := + (numberFieldSeparableClosureEmbedding F).equivFieldRange.trans + (IntermediateField.restrictAlgEquiv le_sup_left) + +private noncomputable def numberFieldComplexificationCyclotomicEquiv : + rationalComplexificationCyclotomicField ≃ₐ[ℚ] + numberFieldComplexificationCyclotomicLayer F := + rationalComplexificationAmbientEquiv.trans + (IntermediateField.restrictAlgEquiv le_sup_right) + +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_isAbelianGalois : + IsAbelianGalois ℚ + (numberFieldComplexificationCyclotomicLayer F) := + IsAbelianGalois.of_algHom + (numberFieldComplexificationCyclotomicEquiv F).symm.toAlgHom + +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_isGalois : + IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer_isAbelianGalois + F).toIsGalois + +private noncomputable local instance + numberFieldComplexificationCyclotomicLayer_normal : + Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := + (numberFieldComplexificationCyclotomicLayer_isGalois + F).to_normal + +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 _ _ + +private theorem numberFieldComplexificationBaseEquiv_algebraMap + (x : F) : + algebraMap F (numberFieldComplexification F) x = + algebraMap (numberFieldComplexificationBaseLayer F) + (numberFieldComplexification F) + (numberFieldComplexificationBaseEquiv F x) := by + apply Subtype.ext + rfl + +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 + +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στ + +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) + +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) + +private noncomputable def numberFieldComplexificationTransportCyclotomic : + Gal(rationalComplexificationCyclotomicField / ℚ) →* + Gal(numberFieldComplexificationCyclotomicLayer F / ℚ) := + (AlgEquiv.autCongr + (numberFieldComplexificationCyclotomicEquiv F)).toMonoidHom + +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 + +/-- 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στ] + +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..4de12823a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -0,0 +1,774 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +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. +-/ + +open scoped Classical 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 + +local instance + ramifiedInfinitePlaceOverextensionIdeleClassGroupIsMulCommutative + {F : Type} [Field F] [NumberField F] : + IsMulCommutative (IdeleClassGroup F) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +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 _ _ _ + +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) + +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 + +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 +/-- The chosen local-factor Artin product on the actual special +overextension `L(i)/K'` is trivial on principal ideles. -/ +@[simp] +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 + +/-- 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 +/-- Evaluation of the descended special-overextension Artin map on +an idele representative is the genuine product of chosen local +symbols. -/ +@[simp] +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 +/-- 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 + +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) + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 +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 +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 +/-- 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 +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 +/-- 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 +/-- 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. -/ +@[simp] +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 +/-- The canonical global norm-residue symbol of an archimedean +one-place idele class in the special overextension is the chosen +infinite local Artin symbol. -/ +@[simp] +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..8f54d99d74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -0,0 +1,644 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped Classical 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] + +/-- 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 +/-- 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) + +/-- 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 +/-- 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 + +@[reducible] +noncomputable instance + ramifiedInfinitePlaceRealFixedField_algebra + (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 + +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) + +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 +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) + +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 +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) + +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 +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 +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)) + +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 _ _ + +/-- 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 +/-- 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 +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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..239cab0465 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm +import Mathlib.NumberTheory.NumberField.CMField +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. +-/ + +open scoped BigOperators Classical IsMulCommutative NumberField +open NumberField IsDedekindDomain +open IdeleGroup + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- The rational prime used to realize the quadratic complexification +as the fourth-root cyclotomic field. -/ +def rationalComplexificationPrime : Nat.Primes := + ⟨2, Nat.prime_two⟩ + +/-- The cyclotomic level `4` used for the rational complexification. -/ +abbrev rationalComplexificationCyclotomicOrder : ℕ+ := + ⟨rationalComplexificationPrime.1 ^ 2, + pow_pos rationalComplexificationPrime.2.pos 2⟩ + +local instance rationalComplexificationPrimeFact : + Fact rationalComplexificationPrime.1.Prime := + ⟨rationalComplexificationPrime.2⟩ + +local instance rationalComplexificationPrimeSquareNeZero : + NeZero (rationalComplexificationPrime.1 ^ 2) := + ⟨pow_ne_zero 2 rationalComplexificationPrime.2.ne_zero⟩ + +/-- The actual rational cyclotomic field generated by fourth roots of +unity, inside the rational cyclotomic closure. -/ +abbrev rationalComplexificationCyclotomicField : + IntermediateField ℚ KummerTheory.rationalCyclotomicField := + KummerTheory.rationalCyclotomicLevel + rationalComplexificationCyclotomicOrder + +noncomputable instance + rationalComplexificationCyclotomicField_isCyclotomicFour : + IsCyclotomicExtension {4} ℚ + rationalComplexificationCyclotomicField := by + change + IsCyclotomicExtension + {(rationalComplexificationCyclotomicOrder : ℕ)} ℚ + rationalComplexificationCyclotomicField + exact + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + rationalComplexificationCyclotomicOrder + +noncomputable instance + rationalComplexificationCyclotomicField_isCMField : + NumberField.IsCMField rationalComplexificationCyclotomicField := by + apply IsCyclotomicExtension.Rat.isCMField + rationalComplexificationCyclotomicField + (S := {4}) + exact + ⟨4, Set.mem_singleton 4, by norm_num⟩ + +noncomputable local instance + rationalComplexificationCyclotomicField_finiteDimensional : + FiniteDimensional ℚ rationalComplexificationCyclotomicField := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + rationalComplexificationCyclotomicOrder + +noncomputable local instance + rationalComplexificationCyclotomicField_numberField : + NumberField rationalComplexificationCyclotomicField := + KummerTheory.rationalCyclotomicLevel_numberField + rationalComplexificationCyclotomicOrder + +noncomputable local instance + rationalComplexificationCyclotomicField_isAbelianGalois : + IsAbelianGalois ℚ rationalComplexificationCyclotomicField := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + rationalComplexificationCyclotomicOrder + +/-- 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 + +/-- 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} + +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⟩ + +noncomputable instance complexFourthRootField_finiteDimensional : + FiniteDimensional ℚ complexFourthRootField := + IsCyclotomicExtension.finiteDimensional + ({4} : Set ℕ) ℚ complexFourthRootField + +noncomputable instance complexFourthRootField_numberField : + NumberField complexFourthRootField := + IsCyclotomicExtension.numberField + ({4} : Set ℕ) ℚ complexFourthRootField + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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) + +private theorem rationalComplexificationCharacter_apply + (σ : rationalComplexificationCyclotomicField ≃ₐ[ℚ] + rationalComplexificationCyclotomicField) : + rationalComplexificationCharacter σ = + IsCyclotomicExtension.Rat.galEquivZMod + (rationalComplexificationPrime.1 ^ 2) + rationalComplexificationCyclotomicField + (hK := + KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension + rationalComplexificationCyclotomicOrder) σ := + rfl + +/-- 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] + +/-- 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 + +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 + +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 + +/-- The chosen global Artin product for the actual rational +complexification is trivial on every rational principal idele. -/ +@[simp] +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..4e1cf1dd7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -0,0 +1,2739 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +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. +-/ + +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 + cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra : + Algebra ℚ (SeparableClosure ℚ) := + DivisionRing.toRatAlgebra + +noncomputable local instance + cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldAlgebra : + 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 + abstractFixedFieldCyclotomicCompositum_algebra + (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. -/ +noncomputable local instance + cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal : + Normal ℚ rationalCyclotomicZHatField := + rationalCyclotomicZHatField_isNormal + +@[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 + +noncomputable instance + 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) + +noncomputable instance + abstractFixedFieldCyclotomicFiniteCompositum_numberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + NumberField.of_module_finite ℚ + (abstractFixedFieldCyclotomicFiniteCompositum H E) + +/-- 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. -/ +noncomputable local instance + 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) + +/-- 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 + abstractFixedFieldCyclotomicFiniteCompositum_baseAlgebra + (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 + abstractFixedFieldCyclotomicFiniteCompositum_layerAlgebra + (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 + abstractFixedFieldCyclotomicFiniteCompositum_layerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (abstractFixedFieldCyclotomicFiniteCompositum H E) := + Algebra.toSMul + (self := + abstractFixedFieldCyclotomicFiniteCompositum_layerAlgebra H E) + +instance + 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 + +instance + 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 + +/-- 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 + abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra + (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 + abstractFixedFieldCyclotomicFiniteLayer_baseSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + Algebra.toSMul + (self := abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra H E) + +/-- The module structure belonging to the canonical base algebra on +the finite field range. -/ +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayer_baseModule + (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) + _ _ + (abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra 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) + +noncomputable instance + abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + FiniteDimensional + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field) + (abstractFixedFieldCyclotomicFiniteLayer H E) := + (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer + H E).toLinearEquiv.finiteDimensional + +noncomputable instance + 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) + +noncomputable instance + 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)))) + +instance + 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 + +/-- 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 + abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra + (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 + abstractFixedFieldCyclotomicFiniteLayer_layerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (abstractFixedFieldCyclotomicFiniteLayer H E) := + Algebra.toSMul + (self := abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra H E) + +instance + 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 + +/-- 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) : + abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra 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. -/ +instance + 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 + +/-- 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 := + abstractFixedFieldCyclotomicCompositum_algebra H + let : IsScalarTower ℚ T U := + abstractFixedFieldCyclotomicCompositum_scalarTower H + let : Algebra E P := + abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra 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) + +private abbrev cyclotomicAbstractFixedFieldArtinCoordinateBase + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := + LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field + +private abbrev cyclotomicAbstractFixedFieldArtinCoordinateRelative + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := + LocalClassFieldTheory.abstractRelativeFixedField + ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field) + +private abbrev cyclotomicAbstractFixedFieldArtinCoordinateLayer + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IntermediateField + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomicFiniteLayer H E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + (cyclotomicAbstractFixedFieldArtinCoordinateBase H).algebra' + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + FiniteDimensional ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + LocalClassFieldTheory.abstractFixedField_finiteDimensional + ℚ (SeparableClosure ℚ) H.field H.finite + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + NumberField + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := + NumberField.of_module_finite ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateBaseSeparableAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (SeparableClosure ℚ) := + IntermediateField.toAlgebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateRelativeAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H).algebra' + +local instance + cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IsScalarTower ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomicCompositum_baseScalarTower H + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + IsAbelianGalois + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomic_isAbelianGalois H + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateAlgebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra ℚ E := + E.toIntermediateField.algebra' + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateNumberField + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField E := + NumberField.of_module_finite ℚ E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois ℚ E := + IsAbelianGalois.of_algHom E.toIntermediateField.val + +local instance + cyclotomicAbstractFixedFieldArtinCoordinateNormal + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Normal ℚ E := + E.isGalois.to_normal + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).algebra' + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra ℚ + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + DivisionRing.toRatAlgebra + +local instance + 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 + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + NumberField + (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_numberField H E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra H E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerSMul + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_layerSMul H E + +local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower ℚ E + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower H E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeAlgebra + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + IntermediateField.toAlgebra + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + +local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsScalarTower + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) + (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := + abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower H E + +noncomputable local instance + cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + IsAbelianGalois + (cyclotomicAbstractFixedFieldArtinCoordinateBase H) + (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := + abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois H E + +/-- 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 : + cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra = + 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. -/ +@[simp] +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. -/ +@[simp] +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 : + cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra = + 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..0545f790dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -0,0 +1,1179 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm +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. +-/ + +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. -/ +private 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 } + +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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 + cyclotomicIdeleClassValuation_rationalCyclotomicZHatFieldAlgebra : + 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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..cac8a5bb8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -0,0 +1,942 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +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 ∩ ℚ̃ : ℚ]`, + +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. +-/ + +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 := + rationalCyclotomicZHatFiniteLayerInCompositum_algebra K E + let : SMul E P := + rationalCyclotomicZHatFiniteLayerInCompositum_smul 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: +`[ℚ ∩ ℚ̃ : ℚ] = 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 ∩ ℚ̃`. 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 ∩ ℚ̃`. -/ +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 ∩ ℚ̃`. 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 : + V ∈ 𝓝 ((1 : F.fixingSubgroup).1) := + 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..96a1eefbbe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection +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. +-/ + +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. -/ +@[simp] +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..9c7638155b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue +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. +-/ + +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..613680c988 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -0,0 +1,903 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped BigOperators Classical 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. +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⟩ + +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⟩ + +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 + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +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 _ _ } + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- 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 K Z Ω] [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 + +/-- 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 + +/-- 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] + +/-- The archimedean part of a rational idele, with all finite +components replaced by one. -/ +def rationalIdeleArchimedeanPart + (a : IdeleGroup ℚ) : + IdeleGroup ℚ := + (a.1, 1) + +/-- The finite part of a rational idele, with its archimedean +component replaced by one. -/ +def rationalIdeleFinitePart + (a : IdeleGroup ℚ) : + IdeleGroup ℚ := + (1, a.2) + +/-- The archimedean part preserves every infinite component. -/ +@[simp] +theorem rationalIdeleArchimedeanPart_infiniteComponent + (a : IdeleGroup ℚ) + (v : InfinitePlace ℚ) : + IdeleGroup.infiniteComponent v + (rationalIdeleArchimedeanPart a) = + IdeleGroup.infiniteComponent v a := + rfl + +/-- Every finite component of the archimedean part is one. -/ +@[simp] +theorem rationalIdeleArchimedeanPart_finiteComponent + (a : IdeleGroup ℚ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalIdeleArchimedeanPart a) = + 1 := + rfl + +/-- Every infinite component of the finite part is one. -/ +@[simp] +theorem rationalIdeleFinitePart_infiniteComponent + (a : IdeleGroup ℚ) + (v : InfinitePlace ℚ) : + IdeleGroup.infiniteComponent v + (rationalIdeleFinitePart a) = + 1 := + rfl + +/-- The finite part preserves every finite component. -/ +@[simp] +theorem rationalIdeleFinitePart_finiteComponent + (a : IdeleGroup ℚ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalIdeleFinitePart a) = + IdeleGroup.finiteComponent v a := + rfl + +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] + +/-- 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] + +/-- 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 + +/-- 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) + +/-- The rational cyclotomic value kills the archimedean part of every +rational idele. -/ +@[simp] +theorem + rationalCyclotomicZHatIdeleValue_rationalIdeleArchimedeanPart + (a : IdeleGroup ℚ) : + rationalCyclotomicZHatIdeleValue + (rationalIdeleArchimedeanPart a) = + 1 := by + rw [rationalCyclotomicZHatIdeleValue_apply, + rationalCyclotomicZHatGlobalArtin_rationalIdeleArchimedeanPart, + map_one] + +/-- 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] + +/-- 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⟩) + +/-- 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) + +/-- 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) + +/-- 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] + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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] + +/-- 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..1b8c1809b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +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. +-/ + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open scoped IsMulCommutative +open KummerTheory +open ClassFormation + +private noncomputable def rationalCyclotomicTorsionRestrictionEquiv : + (rationalCyclotomicField ≃ₐ[ℚ] + rationalCyclotomicField) ⧸ + rationalCyclotomicTorsionClosure.toSubgroup ≃ₜ* + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) := by + let _ : T2Space + (rationalCyclotomicTorsionFixedField ≃ₐ[ℚ] + rationalCyclotomicTorsionFixedField) := + krullTopology_t2 + exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..db7d8655db --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.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 +-/ + +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. +-/ + +open scoped IsMulCommutative NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open GlobalClassFields +open KummerTheory +open LocalClassFieldTheory + +@[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..9d8a892c3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +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. +-/ + +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 + +@[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))ˣ) + +@[reducible] +noncomputable local instance + abstractFixedFieldIdeleGroupGroup + (H : FiniteAbstractField + (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : + Group + (IdeleGroup + (LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) H.field)) := + Prod.instGroup + +@[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..1a5bb1fd48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +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. +-/ + +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) + +/-- 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)) + (ClassFormation.ValuationData.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..50c7d49b14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -0,0 +1,2027 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.IntermediateField.Algebraic +import Mathlib.FieldTheory.Normal.Closure +import Mathlib.FieldTheory.IsSepClosed +import Mathlib.FieldTheory.SeparableClosure +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 ∩ ℚ̃ : ℚ]`. + +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. +-/ + +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 `ℚ̃` 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) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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(ℚ̄/ℚ) → 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ℚ̃` 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 ∩ ℚ̃` inside the common separable +closure. -/ +def numberFieldCyclotomicZHatIntersection : + IntermediateField ℚ (SeparableClosure ℚ) := + numberFieldInRationalSeparableClosure K ⊓ + rationalCyclotomicZHatField + +/-- The intersection `K ∩ ℚ̃`, 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 ∩ ℚ̃ : ℚ]`. -/ +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 ∩ ℚ̃` is precisely +`f_K ZHat`, where `f_K = [K ∩ ℚ̃ : ℚ]`. -/ +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 + numberFieldCyclotomicZHatFiniteCompositum_algebra + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + Algebra K + (numberFieldCyclotomicZHatFiniteCompositum K E) := + (numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).toRingHom.toAlgebra + +noncomputable instance + rationalCyclotomicZHatFiniteLayerCompositum_algebra + (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 + rationalCyclotomicZHatFiniteLayerCompositum_smul + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (numberFieldCyclotomicZHatFiniteCompositum K E) := + (rationalCyclotomicZHatFiniteLayerCompositum_algebra 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 ∩ ℚ̃`. -/ +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 + +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 = ⊤ := by + apply IntermediateField.lift_injective C + rw [IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + exact sup_comm _ _ + 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 = ⊤ := by + apply IntermediateField.lift_injective C + rw [IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + exact sup_comm _ _ + 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 := + numberFieldCyclotomicZHatFiniteCompositum_algebra K E + let : IsScalarTower ℚ K C := + numberFieldCyclotomicZHatFiniteCompositum_scalarTower K E + let : Algebra E C := + rationalCyclotomicZHatFiniteLayerCompositum_algebra 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ℚ̃` 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 rational cyclotomic `ZHat`-field embedded into its compositum +with `K`. -/ +noncomputable def rationalCyclotomicZHatCompositumEmbedding : + rationalCyclotomicZHatField →ₐ[ℚ] + numberFieldCyclotomicZHatCompositum K := + IntermediateField.inclusion le_sup_right + +noncomputable instance numberFieldCyclotomicZHatCompositum_algebra : + Algebra K (numberFieldCyclotomicZHatCompositum K) := + ((numberFieldCyclotomicZHatCompositumEmbedding K).toRingHom).toAlgebra + +noncomputable instance rationalCyclotomicZHatCompositum_algebra : + 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_eq : full = + IntermediateField.extendScalars (F := A) + (E := A ⊔ rationalCyclotomicZHatField) le_sup_left := by + dsimp only [full, hAC, C, numberFieldCyclotomicZHatCompositum] + 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 = ⊤ := by + apply IntermediateField.lift_injective C + rw [IntermediateField.lift_sup, + IntermediateField.lift_restrict, + IntermediateField.lift_restrict, + IntermediateField.lift_top] + exact sup_comm _ _ + 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)) + +/-- 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 + rationalCyclotomicZHatFiniteLayerInCompositum_algebra + (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 + rationalCyclotomicZHatFiniteLayerInCompositum_smul + (E : + FiniteGaloisIntermediateField + ℚ rationalCyclotomicZHatField) : + SMul E + (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := + Algebra.toSMul + (self := rationalCyclotomicZHatFiniteLayerInCompositum_algebra 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 := numberFieldCyclotomicZHatCompositum_algebra K + let : IsScalarTower ℚ K C := + numberFieldCyclotomicZHatCompositum_scalarTower K + let : Algebra rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositum_algebra 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 = ⊤ := 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 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) := + numberFieldCyclotomicZHatCompositum_algebra 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) := + numberFieldCyclotomicZHatCompositum_algebra 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 := rationalCyclotomicZHatCompositum_algebra K + let : IsScalarTower ℚ T C := + rationalCyclotomicZHatCompositum_scalarTower K + let : Algebra E P := + rationalCyclotomicZHatFiniteLayerInCompositum_algebra 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..17ded06d0b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient +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. +-/ + +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. -/ +@[simp] +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..e249f1407f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +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. +-/ + +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..494ba40138 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.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 +-/ + +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. +-/ + +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..3903fb026d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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..c21955bc1f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean @@ -0,0 +1,259 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +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. +-/ + +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..43fe29c295 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +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. +-/ + +open scoped Classical 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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +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 + +/-- 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) + +/-- 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 + +/-- 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 := + completionTensorDecomposition_extensionFintype + (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 := + completionTensorDecomposition_extensionFintype + (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] + +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 + +/-- 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⟩ + +/-- 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 := + completionTensorDecomposition_extensionFintype + (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] + +/-- 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) + +/-- 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..40fc1fe694 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +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. +-/ + +open scoped NumberField Classical BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K : Type*} [Field K] [NumberField K] + +/-- 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 + +/-- 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] + +local instance finiteLocalFamilyIdeleClassGroupIsMulCommutative : + IsMulCommutative (IdeleClassGroup K) := + ⟨⟨fun a b => mul_comm a b⟩⟩ + +local instance finiteLocalFamilyIdeleClassGroupCommGroup : + CommGroup (IdeleClassGroup K) := + open scoped IsMulCommutative in + inferInstance + +omit [FiniteDimensional K L] 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..854ee5735c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +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. +-/ + +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.finitePlaceHilbert_completionUnit F v a) + (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit 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.finitePlaceHilbert_completionUnit F v a + let bC : Cˣ := + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit 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.finitePlaceHilbert_completionUnit 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..76d5829ae2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.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 +-/ + +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. +-/ + +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..804f927c82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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)) + +local instance finitePlaceCompletionComparisonSourceValuativeRel : + ValuativeRel (HeightOneSpectrum.adicAbv F v).Completion := + GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v + +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..13407acf36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +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..b4ff857ef8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +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..fbf3497f0f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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. +-/ + +open scoped Classical 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] + +/-- 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 +/-- 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 +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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] + +/-- 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..1ccb5c754a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -0,0 +1,796 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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. +-/ + +open scoped Classical 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] + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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] + [NontriviallyNormedField 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 } + +/-- 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 + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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)) + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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] + +/-- 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 +/-- 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 +/-- 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 + +/-- 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) + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..ff736d63b2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +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. +-/ + +open scoped Classical 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] + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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] + +/-- 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 := + absoluteValueExtension_completionNontriviallyNormedField + 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..b0cbbb7c23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -0,0 +1,938 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction +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. +-/ + +open scoped Classical 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] + +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] + +/-- 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) + +/-- 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) + +/-- 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] [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 := AlgebraicNumberTheory.Valuations.LocalizedCompletion vF w + letI : Algebra vF.Completion E := + finitePlaceLocalArtinLocalizedAlgebra (K := F) (L := M) v w + E + +/-- 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) + +/-- 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'] + [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) : + 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 +/-- 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 +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 + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK hvK w + (AbsoluteValue.toAlgebraicLocalization + vK w.1 w.2 x)) = + FinitePlace.embedding U.1 x + rw [ + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K) (L := L) v w + (AbsoluteValue.toCompletion w.1 x) = + FinitePlace.embedding + (finitePlaceExtensionCentre + (K := K) (L := L) v w) x + exact + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion + (K := K) (L := L) 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 + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K') (L := L') W w' + (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion + vK' hvK' w' + (AbsoluteValue.toAlgebraicLocalization + vK' w'.1 w'.2 (algebraMap L L' x))) = + FinitePlace.embedding U'.1 (algebraMap L L' x) + rw [ + AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe] + change + finitePlaceExtensionAdicCompletionRingEquiv + (K := K') (L := L') W w' + (AbsoluteValue.toCompletion w'.1 (algebraMap L L' x)) = + FinitePlace.embedding + (finitePlaceExtensionCentre + (K := K') (L := L') W w') + (algebraMap L L' x) + exact + finitePlaceExtensionAdicCompletionRingEquiv_toCompletion + (K := K') (L := L') 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 + +/-- 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 + +/-- 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'] + [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) : + 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) + +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] + +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] + +/-- 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..0ce4a06c76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -0,0 +1,1186 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction +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. +-/ + +open scoped Classical 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] + +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 _ + +private abbrev finitePlaceNormCompletion + (F : Type) [Field F] [NumberField F] + (v : HeightOneSpectrum (𝓞 F)) := + (NumberField.HeightOneSpectrum.adicAbv F v).Completion + +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 + +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) + +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') + +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 + +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) + +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) + +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 + +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' + +local instance finitePlaceNormLowerExtensionAlgebra : + Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K) w.1 + +local instance finitePlaceNormLowerExtensionSMul : + SMul K w.1.Completion := + (finitePlaceNormLowerExtensionAlgebra v w).toSMul + +local instance finitePlaceNormLowerCompletionAlgebra : + Algebra Cₙ w.1.Completion := + AbsoluteValue.completionAlgebra vKₙ w.1 w.2 + +local instance finitePlaceNormLowerGlobalAlgebra : + Algebra K Eₙ := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vKₙ w + +local instance finitePlaceNormUpperExtensionAlgebra : + Algebra K' w'.1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := K') w'.1 + +local instance finitePlaceNormUpperExtensionSMul : + SMul K' w'.1.Completion := + (finitePlaceNormUpperExtensionAlgebra W w').toSMul + +local instance finitePlaceNormUpperCompletionAlgebra : + Algebra Dₙ w'.1.Completion := + AbsoluteValue.completionAlgebra vKₙ' w'.1 w'.2 + +local instance finitePlaceNormUpperGlobalAlgebra : + Algebra K' Eₙ' := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra vKₙ' w' + +local instance finitePlaceNormLowerNontriviallyNormedField : + NontriviallyNormedField Cₙ := + absoluteValueExtension_completionNontriviallyNormedField + vKₙ (RayClass.adicAbv_isNontrivial v) + +local instance finitePlaceNormLowerLocallyCompactSpace : + LocallyCompactSpace Cₙ := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry v) + +local instance finitePlaceNormUpperNontriviallyNormedField : + NontriviallyNormedField Dₙ := + absoluteValueExtension_completionNontriviallyNormedField + vKₙ' (RayClass.adicAbv_isNontrivial W) + +local instance finitePlaceNormUpperLocallyCompactSpace : + LocallyCompactSpace Dₙ := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry W) + +local instance finitePlaceNormLowerLocalizedFiniteDimensional : + FiniteDimensional Cₙ Eₙ := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vKₙ (RayClass.adicAbv_isNontrivial v) w + +local instance finitePlaceNormLowerLocalizedAbelianGalois : + IsAbelianGalois Cₙ Eₙ := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vKₙ (RayClass.adicAbv_isNontrivial v) w + +local instance finitePlaceNormUpperLocalizedFiniteDimensional : + FiniteDimensional Dₙ Eₙ' := + AlgebraicNumberTheory.Valuations.localizedCompletionModuleFinite + vKₙ' (RayClass.adicAbv_isNontrivial W) w' + +local instance finitePlaceNormUpperLocalizedAbelianGalois : + IsAbelianGalois Dₙ Eₙ' := + LocalClassFieldTheory.localizedCompletion_isAbelianGalois + vKₙ' (RayClass.adicAbv_isNontrivial W) w' + +local instance finitePlaceNormLowerUltrametric : + IsUltrametricDist Cₙ := + finitePlaceArtinCompletionIsUltrametricDist vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +local instance finitePlaceNormLowerValued : + Valued Cₙ ℝ≥0 := + finitePlaceArtinCompletionValued vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +local instance finitePlaceNormLowerValuationNontrivial : + (Valued.v : Valuation Cₙ ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation (K := Cₙ)).IsNontrivial) + +local instance finitePlaceNormLowerValuativeRel : + ValuativeRel Cₙ := + finitePlaceArtinCompletionValuativeRel vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +local instance finitePlaceNormLowerValuationCompatible : + (Valued.v : Valuation Cₙ ℝ≥0).Compatible := + Valuation.Compatible.ofValuation + (Valued.v : Valuation Cₙ ℝ≥0) + +local instance finitePlaceNormLowerValuativeRelNontrivial : + ValuativeRel.IsNontrivial Cₙ := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : Valuation Cₙ ℝ≥0)).2 inferInstance + +local instance finitePlaceNormLowerLocalField : + IsNonarchimedeanLocalField Cₙ := + finitePlaceArtinCompletionIsNonarchimedeanLocalField vKₙ + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K v) + +local instance finitePlaceNormUpperUltrametric : + IsUltrametricDist Dₙ := + finitePlaceArtinCompletionIsUltrametricDist vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +local instance finitePlaceNormUpperValued : + Valued Dₙ ℝ≥0 := + finitePlaceArtinCompletionValued vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +local instance finitePlaceNormUpperValuationNontrivial : + (Valued.v : Valuation Dₙ ℝ≥0).IsNontrivial := + (inferInstance : + (NormedField.valuation (K := Dₙ)).IsNontrivial) + +local instance finitePlaceNormUpperValuativeRel : + ValuativeRel Dₙ := + finitePlaceArtinCompletionValuativeRel vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +local instance finitePlaceNormUpperValuationCompatible : + (Valued.v : Valuation Dₙ ℝ≥0).Compatible := + Valuation.Compatible.ofValuation + (Valued.v : Valuation Dₙ ℝ≥0) + +local instance finitePlaceNormUpperValuativeRelNontrivial : + ValuativeRel.IsNontrivial Dₙ := + (ValuativeRel.isNontrivial_iff_isNontrivial + (Valued.v : Valuation Dₙ ℝ≥0)).2 inferInstance + +local instance finitePlaceNormUpperLocalField : + IsNonarchimedeanLocalField Dₙ := + finitePlaceArtinCompletionIsNonarchimedeanLocalField vKₙ' + (NumberField.HeightOneSpectrum.isNonarchimedean_adicAbv K' W) + +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)) + +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)) + +private noncomputable def finitePlaceNormUpperRawArtin + (y : Dₙˣ) : + finitePlaceNormLocalizedAut K' L' W w' := + LocalClassFieldTheory.abelianLocalArtinMonoidHom + Dₙ Eₙ' y + +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) + +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 + +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 + +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 + +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 + +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 + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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..aceefa2735 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -0,0 +1,816 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped Classical 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] + +/-- 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 +/-- 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] + +/-- 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] [IsGalois 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 +/-- 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 +/-- 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 + apply + (AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2).injective + let u : EL := + AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z + have hcommutes : + tauL (localizationEmbedding u) = + localizationEmbedding + ((AlgEquiv.restrictNormalHom EL tauL) u) := by + change + tauL (algebraMap EL LL u) = + algebraMap EL LL + ((AlgEquiv.restrictNormalHom EL tauL) u) + exact + (AlgEquiv.restrictNormal_commutes + tauL EL u).symm + calc + AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 + (algebraMap E L + ((AlgEquiv.restrictNormalHom E + (rhoL.1 : L ≃ₐ[K] L)) z)) = + AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 + ((rhoL.1 : L ≃ₐ[K] L) + (algebraMap E L z)) := by + exact congrArg + (AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2) + (AlgEquiv.restrictNormal_commutes + (rhoL.1 : L ≃ₐ[K] L) E z) + _ = eDL rhoL + (AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2 (algebraMap E L z)) := by + rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + _ = tauL + (AbsoluteValue.toAlgebraicLocalization + vK wL.1 wL.2 (algebraMap E L z)) := by + rw [eDL.apply_symm_apply] + _ = tauL + (localizationEmbedding + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z)) := by + rw [hlocalization] + _ = localizationEmbedding + ((AlgEquiv.restrictNormalHom EL tauL) + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z)) := by + exact hcommutes + _ = localizationEmbedding + (tauE + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z)) := by + rfl + _ = localizationEmbedding + (eDE rhoE + (AbsoluteValue.toAlgebraicLocalization + vK wE.1 wE.2 z)) := by + rw [eDE.apply_symm_apply] + _ = localizationEmbedding + (AbsoluteValue.toAlgebraicLocalization vK wE.1 wE.2 + ((rhoE.1 : E ≃ₐ[K] E) z)) := by + rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] + _ = AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 + (algebraMap E L + ((rhoE.1 : E ≃ₐ[K] E) z)) := by + rw [hlocalization] + +private 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 + +/-- 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) + +/-- 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 + +/-- 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) + + +/-- 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 + +/-- 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..5d2bbff148 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +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. +-/ + +open scoped Classical 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] + +/-- 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 + +/-- 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..e1b11db1f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -0,0 +1,1973 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import Mathlib.GroupTheory.Nilpotent +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`. +-/ + +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 := + numberFieldCyclotomicZHatFiniteCompositum_algebra F E + let : IsScalarTower ℚ F C := + numberFieldCyclotomicZHatFiniteCompositum_scalarTower F E + let : Algebra E C := + rationalCyclotomicZHatFiniteLayerCompositum_algebra 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 := + numberFieldCyclotomicZHatCompositum_algebra F + let : IsScalarTower ℚ F C := + numberFieldCyclotomicZHatCompositum_scalarTower F + let : Algebra rationalCyclotomicZHatField C := + rationalCyclotomicZHatCompositum_algebra 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 ∩ ℚ̃`. -/ +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..43f31a40d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension +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. +-/ + +open scoped BigOperators Classical 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] + +/-- 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) + +/-- 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)) + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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 +/-- 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)] + +/-- 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] + +/-- 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) + +/-- 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] + +/-- 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] + +/-- 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⟩ + +/-- 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..23600c9ca5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility +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. +-/ + +open scoped NumberField Classical 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] + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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) + +/-- Evaluation of the descended Artin homomorphism on an idele +representative recovers the chosen-local-factor product. -/ +@[simp] +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 _ _ _ + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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..f45b3309d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +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. +-/ + +open scoped NumberField TensorProduct Classical BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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) + +/-- The finite-support Artin approximation retains every infinite +component. -/ +@[simp] +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 + +/-- 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 + +/-- At a place in the Artin support, the finite-support approximation keeps +the original finite component. -/ +@[simp] +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] + +/-- Away from the Artin support, the finite-support approximation has trivial +finite component. -/ +@[simp] +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] + +/-- 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 [ + _root_.GlobalClassFieldTheory.ClassFieldAxiom.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 +/-- 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] + +/-- 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 + +/-- 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..8dba666700 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +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..cae42f44e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +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..3e483a4592 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +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. +-/ + +open scoped Classical 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 +/-- 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 +/-- 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] + +/-- 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] + +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 + +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 + +/-- The image of a global unit in the canonical absolute-value completion +at a finite place. -/ +noncomputable def finitePlaceHilbert_completionUnit + (v : HeightOneSpectrum (𝓞 K)) (a : Kˣ) : + (NumberField.HeightOneSpectrum.adicAbv K v).Completionˣ := + Units.map + (algebraMap K + (NumberField.HeightOneSpectrum.adicAbv K v).Completion).toMonoidHom a + +/-- 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) + (finitePlaceHilbert_completionUnit K v a) + (finitePlaceHilbert_completionUnit K v b) + +/-- 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) + +/-- 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 _ + +/-- 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)) + +/-- 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 + +/-- 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) + +/-- 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..84ba58c7bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean @@ -0,0 +1,1018 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +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. +-/ + +open scoped Classical 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] + +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) + +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] + +/-- 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 + +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 + +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 := finitePlaceHilbert_completionUnit K v a + let bC := finitePlaceHilbert_completionUnit K v b + letI : ValuativeRel C := + finitePlaceLocalArtinCompletionValuativeRel v + letI : IsNonarchimedeanLocalField C := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + exact + LocalClassFieldTheory.Kummer.chosenSimpleKummerNormResidueAutomorphism + C n hnC hmuC bC aC + +/-- 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 + +/-- 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 + +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 := finitePlaceHilbert_completionUnit 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 + +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 := finitePlaceHilbert_completionUnit K v a + let bC := finitePlaceHilbert_completionUnit 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 + +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 + +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 := finitePlaceHilbert_completionUnit 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))) + +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 := finitePlaceHilbert_completionUnit 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 + +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) + +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) + +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 + +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) + +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) + +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) + +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ˣ := finitePlaceHilbert_completionUnit 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 + +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 + +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 := finitePlaceHilbert_completionUnit 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 + +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) + +/-- 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 + +/-- 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 := finitePlaceHilbert_completionUnit 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 := finitePlaceHilbert_completionUnit 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 + +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 + +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) + (finitePlaceHilbert_completionUnit 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 := finitePlaceHilbert_completionUnit 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 + +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) + (finitePlaceHilbert_completionUnit 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 := finitePlaceHilbert_completionUnit K v a + let bC := finitePlaceHilbert_completionUnit 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 + +/-- 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) + (finitePlaceHilbert_completionUnit 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 + +/-- 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..e918505c64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.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 +-/ + +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations +open LocalClassFieldTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- The absolute-value completion used at the finite place `v`. -/ +abbrev finitePlaceKummerBaseCompletion + (v : HeightOneSpectrum (𝓞 K)) := + (NumberField.HeightOneSpectrum.adicAbv K v).Completion + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + (finitePlaceHilbert_completionUnit 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, + finitePlaceHilbert_completionUnit, 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) + +/-- 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) + +/-- 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..7050f278d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open Function + +variable (K : Type) [Field K] [NumberField K] + +/-- 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..29b90c698e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory +open AlgebraicNumberTheory.Valuations + +variable (K : Type) [Field K] [NumberField K] + +/-- 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)) + +/-- 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) + (finitePlaceHilbert_completionUnit K v b) + +/-- 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) = + finitePlaceHilbert_completionUnit 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 + (finitePlaceHilbert_completionUnit 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 + +/-- 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) + (finitePlaceHilbert_completionUnit K v b) + +/-- 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 := finitePlaceHilbert_completionUnit 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 + +/-- 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..05506d8a18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +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)`. +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- 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 +/-- 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 +/-- 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 +/-- 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..7ff5c1273f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin +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. +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- 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 +private theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_isComplex + {L : Type} [Field L] [NumberField 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 + +/-- 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] + +/-- 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..f750890f29 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit +/-! +# The negative-negative real infinite-place Hilbert factor +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- 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 + +/-- 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..a8ea59cae8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification +import Mathlib.Analysis.Complex.Order +/-! +# Complex conjugation on a negative quadratic Kummer root +-/ + +open scoped Classical ComplexConjugate ComplexOrder NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- 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..bac55e873c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot +/-! +# Negative units and the real infinite-place Artin map +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +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] + +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 +/-- 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] [NumberField 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..07c7c196bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare +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. +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +/-- 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] + +/-- 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..40966ed707 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive +/-! +# Ramification of a negative quadratic Kummer radical at a real place +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] 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..dabf65d1b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative +/-! +# Complete infinite-place Kummer root-character comparison +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] 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 +/-- 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] + +/-- 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 + +/-- 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..e886662a44 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace +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. +-/ + +open scoped Classical NumberField +open NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +omit [NumberField K] 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 +/-- 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..c6ab5248e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +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. +-/ + +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) + +/-- 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 + rationalCyclotomicIdeleClassValuationData + (rationalCyclotomicIdeleClassValuationData.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 + rationalCyclotomicIdeleClassValuationData + (rationalCyclotomicIdeleClassValuationData.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 + rationalCyclotomicIdeleClassValuationData + 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 + rationalCyclotomicIdeleClassValuationData + 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 + +/-- 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)) + (ClassFormation.ValuationData.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`. -/ +@[simp] +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..f4b32de905 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.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 +-/ + +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. +-/ + +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) + +/-- 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 + rationalCyclotomicIdeleClassValuationData + (rationalCyclotomicIdeleClassValuationData.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 + rationalCyclotomicIdeleClassValuationData + (rationalCyclotomicIdeleClassValuationData.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 + rationalCyclotomicIdeleClassValuationData + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + (numberFieldTowerReciprocityFiniteAbstractField K L) + (numberFieldTowerFiniteGaloisSubextension K L) x = + Additive.ofMul (Abelianization.of q) := + rationalCyclotomicDegreeData.normResidueSymbol_finiteReciprocityHom + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + 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`. -/ +@[simp] +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. -/ +@[simp] +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`. -/ +@[simp] +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] + +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 := + rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + rationalIdeleClassRepresentation_satisfiesClassFieldAxiom + let r := + rationalCyclotomicDegreeData.finiteReciprocityHom + rationalIdeleClassRepresentation + rationalCyclotomicIdeleClassValuationData + 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 := + rationalCyclotomicIdeleClassValuationData.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..42dc9ee176 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -0,0 +1,857 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality +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. +-/ + +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 + [FiniteDimensional K N] [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..aa5c5fab0c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -0,0 +1,3005 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +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. +-/ + +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 + [FiniteDimensional K K'] [IsGalois K K'] + (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..e03104adc0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +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. +-/ + +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))) := + (hBF (eu.symm a) (eu.symm b)).fun_comp (map_one er) + have hreindex := hsource.fun_comp_of_injective + (finitePlaceCongr e).symm.injective + 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..f77b0facc5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +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. +-/ + +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..ca934723e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison +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. +-/ + +open scoped BigOperators Classical IsMulCommutative NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open KummerTheory + +variable (K : Type) [Field K] [NumberField K] + +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] + +/-- 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 + +/-- 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 + +/-- 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..e7ae460cf1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality +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. +-/ + +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..c2b2769d3c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints +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. +-/ + +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(ℚ̄/⊥) = 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..5036d35642 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import Mathlib.Algebra.Colimit.DirectLimit +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. +-/ + +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 + +@[simp] +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 => + simp only [map_add, hx, hy] + +/-- 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 + 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 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 + refine QuotientGroup.induction_on c ?_ + intro a + exact congrArg + (QuotientGroup.mk' + (RelativeIdeleGroup.principalSubgroup ℚ H)) + (Units.ext + (rationalRelativeAdeleEmbedding_comp hEF hFH + (a : RelativeAdeleRing ℚ E))) + +private noncomputable instance : + 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 + +/-- 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..9420bf8e90 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -0,0 +1,661 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open ClassFormation +open LocalClassFieldTheory +open CyclicCohomology + +private noncomputable instance + rationalAbstractTowerClassGroupCommGroup + (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] : + 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] [NumberField E] + [Algebra F E] [FiniteDimensional 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, + DirectLimit.smul_def] + 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..e3fe55d72f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean @@ -0,0 +1,734 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 + 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)) + change + (((eAmbient.trans eFixed.symm).trans eRelative.symm).trans eTower) + (M.ρ + (QuotientGroup.mk' + (extensionSubgroup K L hLK) σ) x) = + Additive.ofMul + (τ • Additive.toMul + (eTower + (eRelative.symm + (eFixed.symm (eAmbient x))))) + apply addEquiv_trans_symm_trans_symm_trans_apply_eq + eAmbient eFixed eRelative eTower + (z := Additive.ofMul (τ₀ • Additive.toMul c)) + · exact + rationalAbstractExtensionIdeleClassEquiv_action_fixed_mk + K L hLK hnormal σ x + · simpa only [eTower, τ₀, c] using + (rationalTowerRelativeIdeleClassBaseChangeAddEquiv_smul + F E τ c) + +/-- 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..c6fd180388 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.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 +-/ + +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. +-/ + +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] [NumberField E] + [Algebra F E] [FiniteDimensional F E] [IsGalois 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] [NumberField E] + [Algebra F E] [FiniteDimensional F E] [IsGalois 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 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..8bb7070ea0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.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 +-/ + +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. +-/ + +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))).toRingHom 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..3f76f250e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +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. +-/ + +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) + +/-- 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 + simp only [rationalIntermediateIdeleClassToDirectLimit, + rationalIntermediateIdeleClassToNormalClosure] + change + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) + ((_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm + (_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K) c))) = + rationalRelativeIdeleClassToDirectLimit + (rationalNormalClosure K) + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) c) + rw [(_root_.relativeIdeleClassBaseChangeMulEquiv + (K := ℚ) (L := K)).symm_apply_apply] + +/-- 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..83fe9abcdf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +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. +-/ + +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] [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 : 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] + [FiniteDimensional K E] [FiniteDimensional 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] + [FiniteDimensional K E] [FiniteDimensional K N] + [FiniteDimensional 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..656ec3e9ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.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 +-/ + +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. +-/ + +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) + +local instance rationalFiniteTowerRationalNormalClosureLowerAlgebra : + Algebra F₀ U₀ := + (IntermediateField.inclusion + (rationalFiniteTower_lower_le_rationalNormalClosure K L hLK)).toRingHom.toAlgebra + +local instance rationalFiniteTowerRationalNormalClosureUpperAlgebra : + Algebra E₀ U₀ := + (IntermediateField.inclusion + (rationalFiniteTower_upper_le_rationalNormalClosure K L hLK)).toRingHom.toAlgebra + +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₀ + +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) = _ + rw [DirectLimit.smul_def] + 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..f36d6df659 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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..a12e52b86b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.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 +-/ + +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. +-/ + +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..5fae6b8ba2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand +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. +-/ + +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, DirectLimit.smul_def] 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..86669d89d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent +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. +-/ + +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 + exact DirectLimit.smul_def _ _ _ + 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 + +/-- 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 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 + 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 + exact DirectLimit.smul_def _ _ _ + 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 + exact DirectLimit.smul_def _ _ _ + 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..71e0ce4190 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +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. +-/ + +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] + [IsGalois 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 : + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation L →+ + KummerTheory.ambientFixedAddSubgroup + rationalIdeleClassRepresentation K := + 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 : + f (eUpper c) = eK (Additive.ofMul (g (Additive.toMul c))) := by + exact + 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' + (R := ℚ) + (S := abstractFixedField ℚ (SeparableClosure ℚ) K) + (A := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) + (RingHom.ext_rat + (algebraMap ℚ (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)) + ((algebraMap + (abstractFixedField ℚ (SeparableClosure ℚ) K) + (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).comp + (algebraMap ℚ (abstractFixedField ℚ (SeparableClosure ℚ) K)))) + 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..d90cf884a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient +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. +-/ + +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..b4d7ae92e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -0,0 +1,991 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +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. +-/ + +open scoped Classical IsMulCommutative NNReal NumberField Topology +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open CategoryTheory Opposite +open FiniteGaloisIntermediateField ProfiniteGrp + +/-- 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 + +private 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) + +private noncomputable def rationalPositiveArchimedeanInfinitePart : + ℝ≥0ˣ →* InfiniteIdeleGroup ℚ := + ContinuousMulEquiv.piUnits.symm.toMonoidHom.comp + (MonoidHom.pi rationalPositiveArchimedeanLocalComponent) + +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 + +/-- 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 } + +/-- The positive archimedean section has trivial finite component at +every finite place of `ℚ`. -/ +@[simp] +theorem rationalPositiveArchimedeanIdele_finiteComponent + (r : ℝ≥0ˣ) + (v : HeightOneSpectrum (𝓞 ℚ)) : + IdeleGroup.finiteComponent v + (rationalPositiveArchimedeanIdele r) = + 1 := + rfl + +/-- 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) + +/-- 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] + +/-- 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. +-/ + +/-- 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 } + +/-- 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 } + +/-- 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 Ω) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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)⟩ + +/-- 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)) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +private theorem + continuousMulEquivToLimit_rationalCyclotomicZHatGlobalArtin_apply + (a : IdeleGroup ℚ) : + InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField + (rationalCyclotomicZHatGlobalArtin a) = + infiniteGlobalArtinToLimit + ℚ rationalCyclotomicZHatField a := by + exact + (InfiniteGalois.continuousMulEquivToLimit + ℚ rationalCyclotomicZHatField).apply_symm_apply _ + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- The rational `ZHat` specialization has dense Artin image. -/ +theorem rationalCyclotomicZHatGlobalArtin_denseRange : + DenseRange rationalCyclotomicZHatGlobalArtin := + infiniteGlobalArtinMonoidHom_denseRange + ℚ rationalCyclotomicZHatField + +/-- 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 + +/-- 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] + +/-- 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..b9a7f91e7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable + {K Ω : Type} + [Field K] [NumberField K] + [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] + +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 _ + +/-- 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 + +/-- 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) + +/-- Evaluation of the descended infinite global Artin homomorphism on an idele +representative recovers the original infinite Artin homomorphism. -/ +@[simp] +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 _ _ _ + +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 + +/-- 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 := + infiniteGlobalIdeleClassArtinMonoidHom_continuous + (K := K) (Ω := Ω) + +/-- 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..5ad34fad10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection +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. +-/ + +open scoped Classical IsMulCommutative NNReal NumberField Topology +open NumberField IsDedekindDomain +open NumberField.Units.dirichletUnitTheorem + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable {K : Type} [Field K] [NumberField K] + +/-- Compatibility name for the positive archimedean section. -/ +noncomputable def numberFieldPositiveArchimedeanIdele + (K : Type) [Field K] [NumberField K] : + ℝ≥0ˣ →* IdeleGroup K := + IdeleGroup.positiveArchimedeanSection K + +/-- Compatibility evaluation of the finite components of the positive +archimedean section. -/ +@[simp] +theorem numberFieldPositiveArchimedeanIdele_finiteComponent + (r : ℝ≥0ˣ) + (v : HeightOneSpectrum (𝓞 K)) : + IdeleGroup.finiteComponent v + (numberFieldPositiveArchimedeanIdele K r) = + 1 := + IdeleGroup.positiveArchimedeanSection_finiteComponent r v + +/-- 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 + +/-- Compatibility form of the absolute-norm evaluation. -/ +@[simp] +theorem numberFieldPositiveArchimedeanIdele_absoluteNorm + (r : ℝ≥0ˣ) : + IdeleGroup.absoluteNorm + (numberFieldPositiveArchimedeanIdele K r) = + r⁻¹ := + IdeleGroup.positiveArchimedeanSection_absoluteNorm r + +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] + +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 _ + +/-- 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 + +/-- 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 + +/-- 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] + +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 + +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σ + +/-- 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⟩ + +/-- 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..e36e6fc5dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +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. +-/ + +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..b43cb17152 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +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. +-/ + +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. -/ +@[simp] +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..9b9092004b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -0,0 +1,1416 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import Mathlib.Algebra.BigOperators.Group.Finset.Lemmas +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. +-/ + +open scoped BigOperators Classical 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] + +private 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 +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 +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 + +/-- 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) + +/-- 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 +/-- 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 +/-- 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 +/-- Archimedean Artin homomorphisms attached to specified places commute +with restriction through an abelian tower. -/ +theorem infinitePlaceArtinMonoidHomOfPlace_restrict_tower + {E : Type} + [Field E] [NumberField 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 + +/-- 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) + +/-- 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 L] 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'] [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 : 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 := by + apply RingHom.ext + intro x + change + star + (InfinitePlace.embedding w' + (algebraMap L L' x)) = + InfinitePlace.embedding w' + (algebraMap L L' (sigmaRestricted x)) + rw [show + algebraMap L L' (sigmaRestricted x) = + sigmaUpper (algebraMap L L' x) by + dsimp [sigmaRestricted] + change + algebraMap L L' + ((AlgEquiv.restrictNormal + (AlgEquiv.restrictScalars K sigmaUpper) L) x) = + sigmaUpper (algebraMap L L' x) + rw [AlgEquiv.restrictNormal_commutes] + rfl] + exact (hSigmaUpper.eq (algebraMap L L' x)).symm + 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 := by + ext x + constructor + · rintro ⟨_, ⟨z, rfl⟩, rfl⟩ + refine ⟨eComplexUnits.symm z, ?_⟩ + simpa [completionUnitsEquivRealUnits, + eComplexUnits] using + (LocalClassFieldTheory.normUnits_map_ringEquiv + eRealField.symm eComplexField.symm + hCompletionCompatibleSymm z).symm + · rintro ⟨z, rfl⟩ + refine + ⟨normUnits ℝ ℂ (eComplexUnits z), + ⟨eComplexUnits z, rfl⟩, ?_⟩ + have hInverse : + Units.mapEquiv eComplexField.symm.toMulEquiv + (eComplexUnits z) = z := by + change + (Units.mapEquiv eComplexField.toMulEquiv).symm + (eComplexUnits z) = z + change eComplexUnits.symm (eComplexUnits z) = z + exact eComplexUnits.symm_apply_apply z + calc + completionUnitsEquivRealUnits.symm + (normUnits ℝ ℂ (eComplexUnits z)) = + normUnits v.Completion w.Completion + (Units.mapEquiv eComplexField.symm.toMulEquiv + (eComplexUnits z)) := by + simpa [completionUnitsEquivRealUnits] using + LocalClassFieldTheory.normUnits_map_ringEquiv + eRealField.symm eComplexField.symm + hCompletionCompatibleSymm + (eComplexUnits z) + _ = normUnits v.Completion w.Completion z := by + rw [hInverse] + 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] + +/-- 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 +/-- 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 +/-- 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.completionTensorDecomposition_extensionFintype + (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 +/-- 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 +/-- 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..9a1ea85ab7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +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. +-/ + +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..d08f2c2d12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +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..e59f07c293 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +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..16881509f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -0,0 +1,779 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField +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. +-/ + +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 opaque 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 opaque 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 opaque 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..1884050d49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -0,0 +1,1898 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility +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. +-/ + +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 + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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 + numberFieldTowerFinitePadicAuxiliary_topAlgebra + (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 + numberFieldTowerFinitePadicAuxiliary_originalBaseTopAlgebra + (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 _ _ + (numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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 := + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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 := + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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 opaque + 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 opaque 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 opaque 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 := + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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 := + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (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. -/ +opaque 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) τ)} := by + 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 := + numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (K := K) (L := L) p τ + letI auxiliaryOriginalTopAlgebra : Algebra L E := + numberFieldTowerFinitePadicAuxiliary_topAlgebra + (K := K) (L := L) p τ + letI auxiliaryOriginalBaseTopAlgebra : Algebra K E := + numberFieldTowerFinitePadicAuxiliary_originalBaseTopAlgebra + (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⟩ + + +/-- 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..8a7f9949ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -0,0 +1,971 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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. -/ +private 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..fa2314ff78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -0,0 +1,1491 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift +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. +-/ + +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 := + rationalCyclotomicZHatCompositum_algebra 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..7c3b020f2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +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`. +-/ + +noncomputable section + +namespace ClassFieldTheory + +open scoped BigOperators Classical NumberField +open NumberField IsDedekindDomain + +/-- 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) + +/-- **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..9e394e76eb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +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. +-/ + +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..4644024746 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +variable (K : Type) [Field K] [NumberField K] + +/-- 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) + +/-- Evaluation of the maximal abelian global Artin map on an idele +representative recovers the infinite global Artin map. -/ +@[simp] +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 + +/-- 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. -/ +@[simp] +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 + +/-- 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..c0441e276b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open GlobalClassFields + +variable (K : Type) [Field K] [NumberField K] + +/-- 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⟩ + +/-- 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⟩ + +/-- The kernel of the maximal abelian global Artin map is exactly the +identity component of the idele class group. -/ +@[simp] +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) + +/-- 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 } + +/-- Evaluation of component-quotient reciprocity on an idele class is the +maximal abelian global Artin map. -/ +@[simp] +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..3bc72472c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.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 +-/ + +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. +-/ + +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..7c835481b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +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. +-/ + +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..aed418c2a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -0,0 +1,2382 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +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. +-/ + +open scoped BigOperators Classical 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] + +/-- 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 + +/-- 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) + +/-- 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] + +/-- 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 + let ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := + 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) + +/-- 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⟩ + +/-- The finite-place integral element has the expected underlying completion +value. -/ +@[simp] +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 + +/-- 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 + +/-- 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 +@[simp] +theorem nonzeroIntegralFieldUnit_coe (x : 𝓞 K) (hx : x ≠ 0) : + ((nonzeroIntegralFieldUnit K x hx : Kˣ) : K) = (x : K) := + rfl + +/-- 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 +@[simp] +theorem primeAvoidingIntegralFieldUnit_coe + (v : HeightOneSpectrum (𝓞 K)) + (x : 𝓞 K) (hx : x ∉ v.asIdeal) : + ((primeAvoidingIntegralFieldUnit K v x hx : Kˣ) : K) = (x : K) := + rfl + +/-- 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 } + +/-- Forgetting the integral-unit structure recovers the ordinary image of +the algebraic integer in the finite-place completion. -/ +@[simp] +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 + +/-- 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 + finitePlaceHilbert_completionUnit 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 + +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- The integral principal ideal generated by the exponent. -/ +def powerResidueExponentIdeal (n : ℕ+) : Ideal (𝓞 K) := + Ideal.span {((n : ℕ) : 𝓞 K)} + +/-- 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 +private theorem ideal_span_singleton_ne_zero + {x : 𝓞 K} (hx : x ≠ 0) : Ideal.span {x} ≠ 0 := + Submodule.span_singleton_eq_bot.mp.mt hx + +/-- 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 + +/-- 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)) + +/-- 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 + +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) + +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) + +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 + +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) + +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) + +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) + +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]) + +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]) + +/-- 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, + AlgebraicNumberTheory.PowerResidueSymbols.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 + +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 + +/-- 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 (finitePlaceHilbert_completionUnit K v x)) + +/-- 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 := finitePlaceHilbert_completionUnit 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 + (finitePlaceHilbert_completionUnit 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] + +/-- 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 + +/-- 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 + +/-- 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ˣ := + finitePlaceHilbert_completionUnit 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 + +/-- 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 + +/-- 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] + +/-- 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) + (finitePlaceHilbert_completionUnit K v a) + (finitePlaceHilbert_completionUnit K v b) + +/-- 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 : + finitePlaceHilbert_completionUnit 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 : + finitePlaceHilbert_completionUnit 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) + +/-- 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] + +/-- 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 + +/-- 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) + +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 + +/-- 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] + +/-- 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 + +/-- 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) + +/-- 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)] + +/-- 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) + +/-- 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 + +/-- 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}) + (ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (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}) + (ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) * + (integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA))⁻¹ := by + rfl + +/-- 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 + +/-- 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) + +/-- 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}) + (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}) + (ideal_span_singleton_ne_zero K ha0) + n hmu b hcoprimeA hbA) := by + let symbolAB := integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {b}) + (ideal_span_singleton_ne_zero K hb0) + n hmu a hcoprimeB haB) + let symbolBA := integralRootsOfUnityToNthRoots K (n : ℕ) + (idealPowerResidueSymbol K (Ideal.span {a}) + (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 + +local instance rationalPrimeFact (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- Evaluate a quadratic integral root of unity as the corresponding integer +sign. -/ +def rationalQuadraticRootValue + (z : rootsOfUnity 2 (𝓞 ℚ)) : ℤ := + Rat.ringOfIntegersEquiv (z.1 : 𝓞 ℚ) + +/-- The identity quadratic root evaluates to the positive integer sign. -/ +@[simp] +theorem rationalQuadraticRootValue_one : + rationalQuadraticRootValue (1 : rootsOfUnity 2 (𝓞 ℚ)) = 1 := by + simp [rationalQuadraticRootValue] + +/-- 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] + +/-- The multiplicative sign evaluation has the expected underlying function. -/ +@[simp] +theorem rationalQuadraticRootValueMonoidHom_apply + (z : rootsOfUnity 2 (𝓞 ℚ)) : + rationalQuadraticRootValueMonoidHom z = + rationalQuadraticRootValue z := + rfl + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 -/ + +/-- 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 : ℤ)} + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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⟩ + +/-- 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 + +/-- Under the prime-factor reindexing, ideal multiplicity becomes the +corresponding entry of `Nat.factorization`. -/ +@[simp] +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 + +/-- 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]) + +/-- 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]) + +/-- 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 + +private theorem rationalQuadraticPrimitiveRoots_nonempty_pnat : + (primitiveRoots (((2 : ℕ+) : ℕ)) ℚ).Nonempty := by + change (primitiveRoots 2 ℚ).Nonempty + exact rationalQuadraticPrimitiveRoots_nonempty + +private def rationalQuadraticRootValuePNatMonoidHom : + rootsOfUnity (((2 : ℕ+) : ℕ)) (𝓞 ℚ) →* ℤ := by + change rootsOfUnity 2 (𝓞 ℚ) →* ℤ + exact rationalQuadraticRootValueMonoidHom + +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)) + +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 + +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 + +/-- 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 : ℕ+) 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..a577b2d8ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily +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. +-/ + +open scoped NumberField Classical BigOperators +open NumberField IsDedekindDomain +open IdeleGroup RelativeIdeleGroup + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +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] + +/-- 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]) + +/-- 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 +/-- 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)) + +/-- 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 +/-- 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 +/-- 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 +/-- 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..e1a7aa2655 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +local instance (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +section ArbitraryCyclotomicLevel + +noncomputable local instance + rationalCyclotomicArithmeticLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + IsCyclotomicExtension.finiteDimensional + {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) + +noncomputable local instance + rationalCyclotomicArithmeticLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelIsAbelianGalois m + +/-- 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] + +/-- 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] + +/-- 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 + +/-- 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)⁻¹ + +/-- 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 + +/-- Outside the ordinary rational prime-factorization support, the +arithmetic local factor is trivial. -/ +@[simp] +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] + +/-- 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) + +/-- 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] + +/-- 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] + +local instance (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 (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 (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⟩ + +/-- 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] + +/-- 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] + +/-- 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..4fab385413 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.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 +-/ + +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. +-/ + +open scoped Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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..83fa6816d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +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. +-/ + +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..57b01117ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -0,0 +1,2992 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +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. +-/ + +open scoped Classical 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. +@[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 + +open AlgebraicNumberTheory.Valuations +open HilbertRamification +open LocalClassFieldTheory +open LocalFieldTheory +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open LubinTate + +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] + +local instance (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +local instance (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +noncomputable local instance + rationalCyclotomicLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + IsCyclotomicExtension.finiteDimensional + {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) + +noncomputable local instance + 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 _ _ } + +@[reducible] +noncomputable local instance rationalFinitePlaceBaseNontriviallyNormedField + (q : Nat.Primes) : + NontriviallyNormedField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + absoluteValueExtension_completionNontriviallyNormedField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)) + (RayClass.adicAbv_isNontrivial + (RayClass.rationalPrime q)) + +noncomputable local instance rationalFinitePlaceBaseLocallyCompactSpace + (q : Nat.Primes) : + LocallyCompactSpace + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + AbsoluteValue.Completion.locallyCompactSpace + (finitePlaceCompletionBaseMap_isometry + (RayClass.rationalPrime q)) + +noncomputable local instance rationalFinitePlaceBaseIsUltrametricDist + (q : Nat.Primes) : + IsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceArtinCompletionIsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (RayClass.rationalPrime q)) + +@[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)) + +@[reducible] +noncomputable local instance rationalFinitePlaceBaseValuativeRel + (q : Nat.Primes) : + ValuativeRel + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceLocalArtinCompletionValuativeRel + (K := ℚ) (RayClass.rationalPrime q) + +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) + +noncomputable local instance rationalFinitePlaceBaseValuationCompatible + (q : Nat.Primes) : + (Valued.v : + Valuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion + ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +noncomputable local instance + 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 + +noncomputable local instance rationalFinitePlaceBaseIsValuativeTopology + (q : Nat.Primes) : + IsValuativeTopology + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + isValuativeTopology_of_valued_ofValuation + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion ℝ≥0 + +noncomputable local instance + rationalFinitePlaceBaseIsNonarchimedeanLocalField + (q : Nat.Primes) : + IsNonarchimedeanLocalField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime q)).Completion := + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField + (K := ℚ) (RayClass.rationalPrime q) + +/-! 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. -/ + +/-- Rational cyclotomic levels are finite-dimensional over `ℚ`. -/ +theorem rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelFiniteDimensional m + +/-- Rational cyclotomic levels are abelian Galois extensions of `ℚ`. -/ +theorem rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicLevelIsAbelianGalois m + +/-- 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 + +/-- The completion of `ℚ` at `p` is locally compact. -/ +theorem rationalPrimeFactorCompletionLocallyCompactSpace + (p : Nat.Primes) : + LocallyCompactSpace + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseLocallyCompactSpace p + +/-- The completion of `ℚ` at `p` carries its canonical ultrametric distance. -/ +theorem rationalPrimeFactorCompletionIsUltrametricDist + (p : Nat.Primes) : + IsUltrametricDist + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseIsUltrametricDist p + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- The completion of `ℚ` at `p` is a nonarchimedean local field. -/ +theorem rationalPrimeFactorCompletionIsNonarchimedeanLocalField + (p : Nat.Primes) : + IsNonarchimedeanLocalField + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion := + rationalFinitePlaceBaseIsNonarchimedeanLocalField p + +/-- 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)⟩ + +/-- The rational finite-place completion used at the prime `p`. -/ +abbrev RationalCyclotomicPrincipalPrimeCompletion + (p : Nat.Primes) := + (HeightOneSpectrum.adicAbv ℚ + (RayClass.rationalPrime p)).Completion + +/-- The chosen localized cyclotomic field at level `p ^ (n + 1)`. -/ +abbrev RationalCyclotomicPrincipalPrimeLocalizedLevel + (p : Nat.Primes) (n : ℕ) := + rationalCyclotomicLocalizedCompletion + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p) + +/-- The standard multiplicative Lubin--Tate field at level `n`. -/ +abbrev RationalCyclotomicPrincipalPrimePadicLevel + (p : Nat.Primes) (n : ℕ) := + standardLubinTateLevelField + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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 + ValuationTheory.DiscreteValuationField.ValuedExtension.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])) + +/-- 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]) + +/-- 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) + +/-- 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 + +/-- 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)) + +/-- 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) + +/-- 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)) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- The underlying rational number of the prime generator unit is `q`. -/ +@[simp] +theorem rationalPrimeGeneratorUnit_coe (q : Nat.Primes) : + (rationalPrimeGeneratorUnit q : ℚ) = q.1 := + rfl + +/-- 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 + +/-- 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)) + +/-- 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 : ℚ) + +/-- 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 + +/-- 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] + +/-- 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 + +private abbrev rationalCyclotomicArtinPlace (q : Nat.Primes) : + HeightOneSpectrum (𝓞 ℚ) := + RayClass.rationalPrime q + +private abbrev rationalCyclotomicArtinBaseAbv (q : Nat.Primes) : + AbsoluteValue ℚ ℝ := + HeightOneSpectrum.adicAbv ℚ (rationalCyclotomicArtinPlace q) + +private abbrev rationalCyclotomicArtinLevel (m : ℕ+) := + KummerTheory.rationalCyclotomicLevel m + +private abbrev rationalCyclotomicArtinExtension + (m : ℕ+) (q : Nat.Primes) : + AbsoluteValueExtension + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinLevel m) := + chosenFinitePlaceExtension + (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + +private abbrev rationalCyclotomicArtinLocalizedField + (m : ℕ+) (q : Nat.Primes) := + AlgebraicNumberTheory.Valuations.LocalizedCompletion + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + +@[reducible] +noncomputable local instance rationalCyclotomicArtinExtensionAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra ℚ + (rationalCyclotomicArtinExtension m q).1.Completion := + AbsoluteValue.extensionCompletionAlgebra + (K := ℚ) (rationalCyclotomicArtinExtension m q).1 + +@[reducible] +noncomputable local instance rationalCyclotomicArtinExtensionSMul + (m : ℕ+) (q : Nat.Primes) : + SMul ℚ + (rationalCyclotomicArtinExtension m q).1.Completion := + (rationalCyclotomicArtinExtensionAlgebra m q).toSMul + +@[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 + +@[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) + +noncomputable local instance + rationalCyclotomicArtinLocalizedGlobalAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra ℚ (rationalCyclotomicArtinLocalizedField m q) := + LocalClassFieldTheory.localizedCompletionGlobalAlgebra + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + +noncomputable local instance + rationalCyclotomicArtinLocalizedGlobalSMul + (m : ℕ+) (q : Nat.Primes) : + SMul ℚ (rationalCyclotomicArtinLocalizedField m q) := + (rationalCyclotomicArtinLocalizedGlobalAlgebra m q).toSMul + +noncomputable local instance + 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] + +noncomputable local instance + rationalCyclotomicArtinLocalizedFiniteDimensional + (m : ℕ+) (q : Nat.Primes) : + FiniteDimensional + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + finitePlaceLocalArtinFiniteDimensional + (K := ℚ) (L := rationalCyclotomicArtinLevel m) + (rationalCyclotomicArtinPlace q) + (rationalCyclotomicArtinExtension m q) + +noncomputable local instance + 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)) + +noncomputable local instance + rationalCyclotomicArtinLocalizedIsSeparable + (m : ℕ+) (q : Nat.Primes) : + Algebra.IsSeparable + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + (rationalCyclotomicArtinLocalizedIsAbelianGalois m q).toIsGalois.to_isSeparable + +noncomputable local instance + rationalCyclotomicArtinLocalizedIsCyclotomic + (m : ℕ+) (q : Nat.Primes) : + IsCyclotomicExtension {(m : ℕ)} + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) := + rationalCyclotomicLevel_localizedCompletion_isCyclotomicExtension + m (rationalCyclotomicArtinPlace q) + +noncomputable local instance + 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) + +noncomputable local instance + 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 + +noncomputable local instance + rationalCyclotomicArtinExtensionLocallyCompact + (m : ℕ+) (q : Nat.Primes) : + LocallyCompactSpace + (rationalCyclotomicArtinExtension m q).1.Completion := + LocallyCompactSpace.of_finiteDimensional_of_complete + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinExtension m q).1.Completion + +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 } + +noncomputable local instance + rationalCyclotomicArtinLocalizedLocallyCompact + (m : ℕ+) (q : Nat.Primes) : + LocallyCompactSpace + (rationalCyclotomicArtinLocalizedField m q) := + ((rationalCyclotomicArtinLocalizedEquivCompletion m q).toHomeomorph.locallyCompactSpace_iff).2 + inferInstance + +noncomputable local instance + rationalCyclotomicArtinLocalizedIsUltrametricDist + (m : ℕ+) (q : Nat.Primes) : + IsUltrametricDist + (rationalCyclotomicArtinLocalizedField m q) := + localizedCompletionIsUltrametricDist + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +noncomputable local instance rationalCyclotomicArtinLocalizedValued + (m : ℕ+) (q : Nat.Primes) : + Valued (rationalCyclotomicArtinLocalizedField m q) ℝ≥0 := + localizedCompletionFinitePlaceValued + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +@[reducible] +noncomputable local instance + rationalCyclotomicArtinLocalizedValuativeRel + (m : ℕ+) (q : Nat.Primes) : + ValuativeRel (rationalCyclotomicArtinLocalizedField m q) := + localizedCompletionFinitePlaceValuativeRel + (rationalCyclotomicArtinBaseAbv q) + (rationalCyclotomicArtinExtension m q) + (HeightOneSpectrum.isNonarchimedean_adicAbv + ℚ (rationalCyclotomicArtinPlace q)) + +noncomputable local instance + rationalCyclotomicArtinLocalizedValuationCompatible + (m : ℕ+) (q : Nat.Primes) : + (Valued.v : Valuation + (rationalCyclotomicArtinLocalizedField m q) ℝ≥0).Compatible := + Valuation.Compatible.ofValuation _ + +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)) + +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)) + +noncomputable local instance + rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial + (m : ℕ+) (q : Nat.Primes) : + ValuativeRel.IsNontrivial + (rationalCyclotomicArtinLocalizedField m q) := + (ValuativeRel.isNontrivial_iff_isNontrivial + (ValuativeRel.valuation + (rationalCyclotomicArtinLocalizedField m q))).2 inferInstance + +noncomputable local instance + rationalCyclotomicArtinLocalizedIsValuativeTopology + (m : ℕ+) (q : Nat.Primes) : + IsValuativeTopology + (rationalCyclotomicArtinLocalizedField m q) := + isValuativeTopology_of_valued_ofValuation + (rationalCyclotomicArtinLocalizedField m q) ℝ≥0 + +noncomputable local instance + rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField + (m : ℕ+) (q : Nat.Primes) : + IsNonarchimedeanLocalField + (rationalCyclotomicArtinLocalizedField m q) := + { toIsValuativeTopology := inferInstance + toLocallyCompactSpace := inferInstance + toIsNontrivial := inferInstance } + +noncomputable local instance + rationalCyclotomicArtinLocalizedIntegerAlgebra + (m : ℕ+) (q : Nat.Primes) : + Algebra + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + (rationalCyclotomicArtinLocalizedField m q) := + Algebra.ofSubsemiring + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + +noncomputable local instance + 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)) + +noncomputable local instance + rationalCyclotomicArtinLocalizedIntegerModuleFinite + (m : ℕ+) (q : Nat.Primes) : + Module.Finite + 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] + 𝒪[rationalCyclotomicArtinLocalizedField m q] := + integerRing_moduleFinite_of_isIntegralClosure + (rationalCyclotomicArtinBaseAbv q).Completion + (rationalCyclotomicArtinLocalizedField m q) + +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. -/ + +noncomputable local instance + 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) + +private abbrev rationalCyclotomicPrincipalPrimePlace + (p : Nat.Primes) : HeightOneSpectrum (𝓞 ℚ) := + rationalCyclotomicArtinPlace p + +private abbrev rationalCyclotomicPrincipalPrimeLevel + (m : ℕ+) := + rationalCyclotomicArtinLevel m + +private abbrev rationalCyclotomicPrincipalPrimeExtension + (m : ℕ+) (p : Nat.Primes) := + rationalCyclotomicArtinExtension m p + +/-- 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 + +@[reducible] +noncomputable local instance + rationalCyclotomicArtinLocalizedPadicAlgebra + (m : ℕ+) (p : Nat.Primes) : + Algebra ℚ_[p.1] (rationalCyclotomicArtinLocalizedField m p) := + rationalCyclotomicPrincipalPrimeLocalizedPadicAlgebra m p + +private noncomputable def rationalFinitePlaceCompletionAlgEquivPadic + (p : Nat.Primes) : + (rationalCyclotomicArtinBaseAbv p).Completion ≃ₐ[ℚ] ℚ_[p.1] := + AlgEquiv.ofRingEquiv + (f := rationalFinitePlaceCompletionRingEquivPadic p) + (rationalFinitePlaceCompletionRingEquivPadic_algebraMap p) + +noncomputable local instance + 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] + +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 + +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)) + +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 + +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 + +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)) + +/-- 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 + +noncomputable local instance + rationalCyclotomicPrincipalPrimePadicLevelIsAbelianGalois + (p : Nat.Primes) (n : ℕ) : + IsAbelianGalois ℚ_[p.1] + (RationalCyclotomicPrincipalPrimePadicLevel p n) := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField p.1) + (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n + +@[reducible] +noncomputable local instance rationalPrimeFactorCompletionPadicAlgebra + (p : Nat.Primes) : + Algebra (RationalCyclotomicPrincipalPrimeCompletion p) ℚ_[p.1] := + (rationalFinitePlaceCompletionRingEquivPadic p).toRingHom.toAlgebra + +/-- 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 + +/-- 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) + +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) + +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) + +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) + +/-- 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 -/ + +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 + +/-- 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)) + +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) + +private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action + {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) + (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 + +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 + +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 + +/-- 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] + +private noncomputable def rationalCyclotomicPrincipalPrimeLocalizedRoot + (p : Nat.Primes) (n : ℕ) : + rationalCyclotomicArtinLocalizedField + (rationalCyclotomicPrincipalPrimeModulus p n) p := + rationalCyclotomicLocalizedPrimitiveRoot + (rationalCyclotomicPrincipalPrimeModulus p n) + (RayClass.rationalPrime p) + +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)) + +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) + +/-- 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 + +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 + +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)) + +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)) + +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] + +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) + +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 + +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 + +/-- 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))) + +/-- 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 + +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) + +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) + +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) + +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) + +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) + +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 + +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) + +/-- 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) + +private noncomputable abbrev rationalCyclotomicArtinLocalInput + (q : Nat.Primes) + (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : + (rationalCyclotomicArtinBaseAbv q).Completionˣ := + finitePlaceLocalArtinInput + (K := ℚ) (rationalCyclotomicArtinPlace q) x + +/-- 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)) + +/-- 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 + +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 + +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 + +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) + +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 + +/-- 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) + +private theorem rationalCyclotomicArtinResidueFieldCard + (q : Nat.Primes) : + Nat.card 𝓀[(rationalCyclotomicArtinBaseAbv q).Completion] = q.1 := by + simpa [rationalCyclotomicArtinPlace, + rationalCyclotomicArtinBaseAbv] using + rationalFinitePlaceCompletion_residueField_card + (rationalCyclotomicArtinPlace q) + +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)) + +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)) + +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 + +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 + +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 + +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))) + +/-- 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) + +/-- 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 + +/-- 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] + +/-- 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 + +/-- 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..792c60612e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +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. +-/ + +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. -/ +@[simp] +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..06d66ac0a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +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`. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open Function + +local instance (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +local instance (m : ℕ+) : NeZero (m : ℕ) := + ⟨m.ne_zero⟩ + +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⟩ + +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⟩ + +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⟩ + +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 + +noncomputable local instance + rationalCyclotomicPrincipalLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m + +noncomputable local instance + rationalCyclotomicPrincipalLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois m + +private 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)) + +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 + +private 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) + +/-- 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] + +/-- 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) + +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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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 + +private noncomputable def rationalCyclotomicPrincipalHeightOneCharacterFinprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + (ZMod (p.1 ^ k))ˣ := + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v + +private theorem + rationalCyclotomicPrincipalHeightOneCharacterFinprod_eq_finprod + (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : + rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x = + ∏ᶠ v : HeightOneSpectrum (𝓞 ℚ), + rationalCyclotomicPrincipalHeightOneCharacter p k x v := by + rfl + +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 + +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 + +/-- 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) + +/-- 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..990cc9b9a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.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 +-/ + +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`. +-/ + +open scoped Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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..9b96b7789d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +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⟩ + +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⟩ + +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⟩ + +noncomputable local instance + rationalCyclotomicPrincipalProductLevelFiniteDimensional + (m : ℕ+) : + FiniteDimensional ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m + +noncomputable local instance + rationalCyclotomicPrincipalProductLevelIsAbelianGalois + (m : ℕ+) : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel m) := + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois m + +/-- 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)) + +/-- 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) + +/-- 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) + +/-- 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 + +/-- The rational cyclotomic value kills every rational principal idele. -/ +@[simp] +theorem rationalCyclotomicZHatIdeleValue_principalIdele_eq_one + (x : ℚˣ) : + rationalCyclotomicZHatIdeleValue + (IdeleGroup.principalIdele ℚ x) = + 1 := by + exact + (rationalCyclotomicZHatIdeleValue_principalIdele_eq_finitePart x).trans + (rationalCyclotomicZHatIdeleValue_principalFinitePart_eq_one x) + +/-- 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..5049b25eea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -0,0 +1,823 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +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. +-/ + +open scoped Classical 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 + +local instance (q : Nat.Primes) : Fact q.1.Prime := + ⟨q.2⟩ + +attribute [local instance] + rationalCyclotomicPrincipalPrimeLevelFiniteDimensional + rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois + +section FinitePlaceLocalCalculation + +attribute [local instance] + rationalFinitePlaceBaseNontriviallyNormedField + rationalFinitePlaceBaseLocallyCompactSpace + rationalFinitePlaceBaseIsUltrametricDist + rationalFinitePlaceBaseValued + rationalFinitePlaceBaseValuativeRel + rationalFinitePlaceBaseValuationIsNontrivial + rationalFinitePlaceBaseValuationCompatible + rationalFinitePlaceBaseValuativeRelIsNontrivial + rationalFinitePlaceBaseIsValuativeTopology + rationalFinitePlaceBaseIsNonarchimedeanLocalField + +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)) + +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 + +/-- 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 + +noncomputable local instance + rationalCyclotomicRayNormPadicLevelIsAbelianGalois + (q : Nat.Primes) (n : ℕ) : + IsAbelianGalois ℚ_[q.1] + (RationalCyclotomicPrincipalPrimePadicLevel q n) := + standardLubinTateLevelField_isAbelianGalois + (padicLocalField q.1) + (padicMultiplicativeLubinTateSeries_isUniformizer q.1) n + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + _root_.GlobalClassFieldTheory.GlobalClassFields.finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup + (K := ℚ) (RayClass.rationalPrime q) n x hx + +/-- 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 + +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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..1a8e0d208e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField ClassFormation + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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] +/-- 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..e44e94ce36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.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 +-/ + +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`. +-/ + +open scoped BigOperators Classical + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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 + +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⟩ + +/-- 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 + +@[simp] +theorem rationalPrimeUnit_val (x : ℚˣ) (p : Nat.Primes) : + (rationalPrimeUnit x p : ℚ) = + (p.1 : ℚ) ^ (-padicValRat p.1 (x : ℚ)) * (x : ℚ) := by + simp [rationalPrimeUnit] + +/-- Removing the `p`-power from a nonzero rational number leaves +`p`-adic valuation zero. -/ +@[simp] +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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 _ + +/-- 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 + +/-- 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) + +/-- The underlying `p`-adic number of `rationalSignPadicUnit` is the sign of +the rational numerator. -/ +@[simp] +theorem rationalSignPadicUnit_coe + (x : ℚˣ) (p : Nat.Primes) : + (((rationalSignPadicUnit x p : ℤ_[p.1]) : ℚ_[p.1])) = + (((((x : ℚ).num.sign : ℤ) : ℚ) : ℚ_[p.1])) := by + exact padicIntUnitOfRat_coe _ _ _ _ + +/-- 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] + +/-- 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 + +/-- Reduction of the rational sign unit modulo `p ^ k` has the expected +integer value. -/ +@[simp] +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 + +/-- Reduction of the rational sign unit still has square one. -/ +@[simp] +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] + +/-- 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) + +@[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 + +/-- Reducing the canonical `p`-adic unit attached to `q` modulo `p ^ k` +gives the canonical unit represented by `q` in `ZMod (p ^ k)`. -/ +@[simp] +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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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 + +/-- The distinguished prime belongs to the prime-valued support. -/ +@[simp] +theorem mem_rationalPrimeFactorizationPrimeSupport + (x : ℚˣ) (p : Nat.Primes) : + p ∈ rationalPrimeFactorizationPrimeSupport x p := + (mem_rationalPrimeFactorizationPrimeSupport_iff x p p).2 + (mem_rationalPrimeFactorizationSupport x p) + +/-- Erasing `p` commutes with passing from natural-number support to +prime-valued support. -/ +@[simp] +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⟩ + +/-- 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)⟩ + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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..cf34866078 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -0,0 +1,445 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +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. +-/ + +open scoped NumberField Classical +open NumberField IsDedekindDomain + +noncomputable section + +namespace GlobalClassFieldTheory +namespace Reciprocity + +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +local instance (p : Nat.Primes) : Fact p.1.Prime := + ⟨p.2⟩ + +/-- 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 + +/-- 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)) + +/-- 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] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits_mem_unitGroup + F.toCompleteDVF u) + have hzero : + V.zeroSubgroup = + F.valuation.valuationSubring.unitGroup := by + simpa only [V] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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] + +/-- 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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_injective + refine + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + +/-- 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 : ℚ) + +/-- 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 : ℚ) + +/-- 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] + +/-- 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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + +/-- 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] + +/-- 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..f0f4264551 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -0,0 +1,1233 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +open scoped BigOperators Classical 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. +@[reducible] noncomputable local instance + (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 + +open KummerTheory +open AlgebraicNumberTheory.PowerResidueSymbols +open LocalClassFieldTheory.Kummer +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +private def rationalQuadraticRootValuePNatMonoidHom : + rootsOfUnity (((2 : ℕ+) : ℕ)) (𝓞 ℚ) →* ℤ := by + change rootsOfUnity 2 (𝓞 ℚ) →* ℤ + exact rationalQuadraticRootValueMonoidHom + +/-! ## Dyadic correction and Gauss reciprocity -/ + +/-- The rational prime above two, used throughout the dyadic specialization. -/ +def rationalTwoPrime : Nat.Primes := ⟨2, Nat.prime_two⟩ + +private 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) + +/-- 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))) + +/-- A natural number in the rational ring of integers. -/ +noncomputable def rationalNatInteger (m : ℕ) : 𝓞 ℚ := + Rat.ringOfIntegersEquiv.symm (m : ℤ) + +@[simp] +theorem rationalNatInteger_equiv (m : ℕ) : + Rat.ringOfIntegersEquiv (rationalNatInteger m) = (m : ℤ) := + Rat.ringOfIntegersEquiv.apply_symm_apply (m : ℤ) + +@[simp] +theorem rationalNatInteger_coe (m : ℕ) : + (rationalNatInteger m : ℚ) = (m : ℚ) := by + exact Rat.ringOfIntegersEquiv_symm_apply_coe (m : ℤ) + +/-- 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) + +@[simp] +theorem rationalNaturalFieldUnit_coe + (m : ℕ) (hm : m ≠ 0) : + (rationalNaturalFieldUnit m hm : ℚ) = (m : ℚ) := by + exact rationalNatInteger_coe m + +/-- The negative quadratic integral root of unity over `ℚ`. -/ +def rationalQuadraticNegOneRoot : rootsOfUnity 2 (𝓞 ℚ) := + ⟨-1, by norm_num⟩ + +@[simp] +theorem rationalQuadraticRootValue_negOneRoot : + rationalQuadraticRootValue rationalQuadraticNegOneRoot = -1 := by + simp [rationalQuadraticRootValue, rationalQuadraticNegOneRoot] + +/-- 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 + +/-- 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 + +/-- 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))) + +@[simp] +theorem rationalTwoAdicSignedOddUnit_coe + (m : ℕ) (hm : Odd m) : + (rationalTwoAdicSignedOddUnit m hm : ℚ_[2]) = + (((-1 : ℤ) ^ (m / 2) * (m : ℤ) : ℤ) : ℚ_[2]) := + rfl + +/-- 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.padicDVR_five : + 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.padicDVR_five : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (rD : F.valuationSubringˣ) ^ 2) := + congrArg toField hrD + _ = five * r ^ 2 := by rw [map_mul, map_pow, hfive] + +/-- 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 := finitePlaceHilbert_completionUnit ℚ 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ˣ := finitePlaceHilbert_completionUnit ℚ v₂ + (rationalNaturalFieldUnit m hm0) + have haC : + (aC : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) = + (m : (HeightOneSpectrum.adicAbv ℚ v₂).Completion) := by + simp only [aC, C, finitePlaceHilbert_completionUnit, 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 + +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 + +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] + +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 + +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] + +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 + +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 + +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 + +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 + +/-- 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 + +/-- 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 + +/-- The rational global field unit represented by `-1`. -/ +def rationalQuadraticNegOneFieldUnit : ℚˣ := + nonzeroIntegralFieldUnit ℚ (-1 : 𝓞 ℚ) (by norm_num) + +@[simp] +theorem rationalQuadraticNegOneFieldUnit_coe : + (rationalQuadraticNegOneFieldUnit : ℚ) = -1 := + rfl + +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) + +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 + +/-- 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] + +/-- 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 : + finitePlaceHilbert_completionUnit ℚ + (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 + +/-- 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₂) + (finitePlaceHilbert_completionUnit ℚ v₂ + (rationalNaturalFieldUnit a (by + intro ha0 + subst a + norm_num at ha))) + (finitePlaceHilbert_completionUnit ℚ 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 := finitePlaceHilbert_completionUnit ℚ v₂ + (rationalNaturalFieldUnit a ha0) + let bC := finitePlaceHilbert_completionUnit ℚ 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 + +/-- 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) + +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 + +/-- 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] + +/-- 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 + +/-- 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] + +/-- 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..68d5168f68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue +import Mathlib.FieldTheory.KrullTopology +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. +-/ + +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..69810b4247 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization +import Mathlib.FieldTheory.KrullTopology +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. +-/ + +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 + topologicalGlobalNormResidueAbelianization_galoisAbelianizationTopology : + 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..65bb279f36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -0,0 +1,1296 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +import Mathlib.Algebra.Algebra.Shrink +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import Mathlib.FieldTheory.Fixed +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. +-/ + +/-! +# 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 (RamificationTheory.DiscreteValuationField.DVF.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 : ℚ) : ℝ) = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat, + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_zero] + | succ n ih => + rw [herbrandFunctionAtLowerIndex_succ, Rat.cast_add, Rat.cast_div] + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat, + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_succ] + rw [← RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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] + [IsNonarchimedeanLocalField 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 : ℚ) : ℝ) = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 + _ = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + F m := by + change + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F (m : ℝ) = _ + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F s + unfold ClassFieldTheory.herbrandFunction + by_cases hs : 0 ≤ s + · rw [ite_eq_left hs] + dsimp only + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_floor + F hs ⌊s⌋₊ rfl] + rw [hnat ⌊s⌋₊, hslope ⌊s⌋₊] + · rw [ite_eq_right hs] + exact + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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.galEquiv_of_equiv_equiv + (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.galEquiv_of_equiv_equiv] + +/-- 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 shrink_valuationSubringRingEquiv + (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 ↔ + shrink_valuationSubringRingEquiv L x ∈ + (IsLocalRing.maximalIdeal + (ValuativeRel.valuation L).valuationSubring) ^ n := + letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L + by + intro x + let e := shrink_valuationSubringRingEquiv 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 := shrink_valuationSubringRingEquiv 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..f975c966b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +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..2eda6917ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +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..8739cfa09c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +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. +-/ + +/-! +# 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..e67159081c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +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. +-/ + +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..c282f5a9e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.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 +-/ + +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`. +-/ + +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..676f407535 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.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 +-/ + +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. +-/ + +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..715e1f2901 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget +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`. +-/ + +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..23b4d708b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +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. +-/ + +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..00f9b04084 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +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)`. +-/ + +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..c50940a11b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +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. +-/ + +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..28ece4c475 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation +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)`. +-/ + +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..2eef58967a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.Cyclotomic.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +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 `ℚ`. +-/ + +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..65071c9bef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +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. +-/ + +open scoped Classical IsMulCommutative NumberField Cyclotomic + +noncomputable section + +namespace KroneckerWeber + +open GlobalClassFieldTheory +open GlobalClassFieldTheory.GlobalClassFields +open GlobalClassFieldTheory.Reciprocity + +/-- 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) + +/-- 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] + +/-- 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] + +local instance : NeZero (m : ℚ) := + ⟨by exact_mod_cast (NeZero.ne m)⟩ + +noncomputable local instance : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨m, NeZero.pos m⟩ + +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 _ + +noncomputable local instance + rationalCyclotomicArithmeticLevelIsAbelianGalois : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ _ + +/-- 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 + +/-- 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] + +/-- 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) + +/-- Arithmetic reciprocity sends the arithmetic norm-residue symbol +of an idèle class to its genuine rational ray class. -/ +theorem + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_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] + +/-- 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, + rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_arithmeticGlobalNormResidue] + +/-- 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..935535fef6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +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. +-/ + +open scoped Classical IsMulCommutative NumberField Cyclotomic + +noncomputable section + +namespace KroneckerWeber + +open GlobalClassFieldTheory +open GlobalClassFieldTheory.GlobalClassFields +open GlobalClassFieldTheory.Reciprocity +open NumberField IsDedekindDomain + +noncomputable local instance rationalCyclotomicLevelIsAbelianGalois + (n : ℕ+) : + IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel n) := + IsCyclotomicExtension.isAbelianGalois {(n : ℕ)} ℚ + (KummerTheory.rationalCyclotomicLevel n) + +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 } + +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 + +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 + +/-- 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] + +local instance : NeZero (m : ℚ) := + ⟨by exact_mod_cast (NeZero.ne m)⟩ + +noncomputable local instance : + NumberField + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + KummerTheory.rationalCyclotomicLevel_numberField + ⟨m, NeZero.pos m⟩ + +noncomputable local instance : + IsAbelianGalois ℚ + (KummerTheory.rationalCyclotomicLevel + ⟨m, NeZero.pos m⟩) := + rationalCyclotomicLevelIsAbelianGalois + ⟨m, NeZero.pos m⟩ + +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⟩ + +noncomputable local instance rationalCyclotomicFieldIsCyclotomicExtension : + IsCyclotomicExtension {m} ℚ (CyclotomicField m ℚ) := + CyclotomicField.isCyclotomicExtension m ℚ + +noncomputable local instance rationalCyclotomicFieldIsAbelianGalois : + IsAbelianGalois ℚ (CyclotomicField m ℚ) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ + (CyclotomicField m ℚ) + +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 + +noncomputable local instance rationalCyclotomicFieldIdeleClassNormRangeNormal : + (_root_.ideleClassNorm ℚ (CyclotomicField m ℚ)).range.Normal := by + rw [ + rationalCyclotomicField_ideleClassNorm_range_eq_rationalCongruenceSubgroup + m (NeZero.ne m)] + infer_instance + +/-- 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 ℚ) + +/-- 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)⁻¹) + +/-- 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 + +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] + +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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] + +/-- 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))) + +/-- 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] + +/-- The selected rational ray class field is the actual cyclotomic field +of the same modulus, as an equivalence of fields over `ℚ`. -/ +private 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 + +/-- 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 + +noncomputable local instance rationalRayClassFieldIsCyclotomicExtension : + IsCyclotomicExtension {m} ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) := + IsCyclotomicExtension.equiv {m} ℚ (CyclotomicField m ℚ) + (rationalRayClassFieldCyclotomicAlgEquiv m).symm + +noncomputable local instance rationalRayClassFieldIsAbelianGalois : + IsAbelianGalois ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) := + IsCyclotomicExtension.isAbelianGalois {m} ℚ + (rayClassField ℚ (RayClass.rationalModulus m)) + +/-- 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) + +/-- 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 + +/-- 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)) + +/-- 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 } + +/-- 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 + +/-- 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 + +/-- 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..18713b5476 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational +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)`. +-/ + +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..55c350d799 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import Mathlib.FieldTheory.Galois.GaloisClosure +import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding +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. +-/ + +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 ℚ + (absoluteValueExtension_algebraicCompletionClosure vK) := + @AlgebraicClosure.instAlgebra vK.Completion _ ℚ _ hBase + let : Algebra ℚ vK.Completion := hBase + let : Algebra ℚ + (absoluteValueExtension_algebraicCompletionClosure 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..7422b39798 --- /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 +-/ + +import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup +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. +-/ + +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..beb1dea50b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +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..c71d0e8047 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/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 +-/ + +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..325f85ff62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation +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..a7eeece31b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +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..35cd792f68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +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)`. +-/ + +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 : ℕ) [NeZero p] : + FiniteDimensional K (PrimeCyclotomicBase K p) := + IsCyclotomicExtension.finiteDimensional + {p} K (PrimeCyclotomicBase K p) + +noncomputable instance primeCyclotomicBaseIsGalois + (p : ℕ) [NeZero 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..eab5bd90cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -0,0 +1,314 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +import Mathlib.Algebra.Group.Hom.Basic +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. +-/ + +open scoped NumberField Classical +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 +/-- 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 +/-- 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..aabd9cd6c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +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`. +-/ + +open scoped NumberField Classical +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 +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- 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..3d43781555 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +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..ce22fa85d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +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..5db06205a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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..2d355a9b7c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -0,0 +1,615 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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)) + +/-- 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 + +/-- 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⟩) + +/-- 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) + +/-- 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))) + +/-- 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 + +/-- 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 _ + +/-- 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] + +/-- 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 + +/-- 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))) + +/-- 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 + +/-- 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) + +/-- 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..16efec73ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.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 +-/ + +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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⟩ + +/-- 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)) + +/-- 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)) + +/-- 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 +/-- 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 + +/-- 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 +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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 +/-- 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⟩ + +/-- 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] + [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))) : + 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..cacc207195 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean @@ -0,0 +1,550 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- `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) + +/-- 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 + +/-- 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..d0266df0f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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]⟩) + +/-- 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 + +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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 + +/-- 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..e365c15165 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean @@ -0,0 +1,633 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +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. +-/ + +open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open NumberField IsDedekindDomain +open LocalFieldTheory + +noncomputable section + +namespace KummerTheory + +variable {K : Type*} [Field K] + [numberFieldK : NumberField K] + +/-- The total place-set cardinal `s = #S`, with all infinite places included. -/ +def totalPlaceCard + (S : Finset (HeightOneSpectrum (𝓞 K))) : ℕ := + Fintype.card (InfinitePlace K) + S.card + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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'] + +/-- 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 : ℕ)) + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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) + +/-- `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⟩ + +/-- 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) + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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) + +/-- 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..a93ca58c25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -0,0 +1,651 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm +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. +-/ + +open scoped NumberField Classical 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] + +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)) } + +/-- 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] [NumberField 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 := + absoluteValueExtension_completionNontriviallyNormedField 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 + +/-- 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 + +/-- 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) + +/-- 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 +/-- 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 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] + 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..af34ea64f8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer +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..4296175f98 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +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..5770c7859b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +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..a252d6bfea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +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..c170cf907a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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. +-/ + +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..4fd6bc8d03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean @@ -0,0 +1,881 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock +import Mathlib.Basic.Real.Sign +import Mathlib.NumberTheory.NumberField.Completion.Ramification +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. +-/ + +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 Classical NumberField.LiesOver + +variable + {K L : Type} + [Field K] [NumberField K] + [Field L] [NumberField L] [Algebra K L] + [FiniteDimensional K L] [IsGalois K L] + +/-- 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⟩ + +/-- 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) + +/-- 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 +/-- 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 + +/-- 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 _ + +/-- 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 + +/-- 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)) + +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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) + +/-- 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) + +/-- 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) + +/-- The sign of a nonzero real number, regarded as an integral unit. -/ +def realUnitsSign : ℝˣ →* ℤˣ := + Units.map + ((SignType.castHom (α := ℤ)).comp + (signHom (α := ℝ))) + +/-- 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 + +/-- 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]⟩ + +/-- A nonzero real unit has trivial sign precisely when it is positive. -/ +@[simp] +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] + +/-- 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 + +/-- 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 + +/-- The norm quotient for `ℂ/ℝ` is the two-element sign group. -/ +def realComplexNormQuotientEquivSign : + NormQuotient ℝ ℂ ≃* ℤˣ := + normQuotientEquivOfSurjective + realUnitsSign + realUnitsSign_surjective + realUnitsSign_ker_eq_complexNormSubgroup + +/-- 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 + +/-- 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 +/-- 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 +/-- 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 +/-- 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 +/-- 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..902f622809 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -0,0 +1,492 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic + +/-! # Cohomology Bridge -/ +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. -/ +private 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`. -/ +private 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] +private 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. -/ +private 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. -/ +private 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. -/ +private 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..91c941f119 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +/-! # Field Units Herbrand -/ +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 hU.1 hU.2 = 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 hZ.1 hZ.2 = + (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 hField.1 hField.2 = (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..e2723cbcf9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct + +/-! # Filtered Lifting Sequence -/ +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..3b6ed60097 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +/-! +Provides the public declarations in the +`LocalClassFieldTheory.ClassFormation.Hilbert90` Lean module. +-/ + +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..885bdeb34c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient + +/-! # Integer Units Herbrand -/ +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 + ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g hU.1 hU.2 = 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 + ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g hU.1 hU.2 = 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..d86b1b3f26 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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..b58d6d9ccb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +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..460f65e693 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +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..cfecaad665 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +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..4ffac58a78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +/-! +# Degree-zero cohomology of finite local-block families +-/ + +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} [Fintype ι] + (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..f062a2ec4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +/-! +# Degree-minus-one cohomology of finite local-block families +-/ + +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} [Fintype ι] + (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..bd63a599a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +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. +-/ + +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..0fc55edfcb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -0,0 +1,977 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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. +-/ + +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) + +/-- The degree-zero cohomology of a finite family of local blocks is finite. -/ +theorem localBlockFamilyHerbrandH0Finite + (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 + 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 + +/-- The degree-minus-one cohomology of a finite family of local blocks is +finite. -/ +theorem localBlockFamilyHerbrandHMinusOneFinite + (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 + 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 + +/-- In degree minus one, a finite family of local blocks has +degree-minus-one cohomology of cardinality one. -/ +theorem localBlockFamilyHerbrandHMinusOne_card_eq_one + (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 + 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 : ∀ 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 _ + letI _familyH0Finite : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + localBlockFamilyHerbrandH0Finite + d σ hgen + letI _familyHMinusOneFinite : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + 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 : ∀ 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 localH0Finite : ∀ 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 + let localHMinusOneFinite : ∀ 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 blockH0Finite : ∀ i, + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension)) := + 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 : ∀ i, + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base (d i).base_isNontrivial + (d i).extension) σ) := + 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 : + Finite + (HerbrandH0 (L ≃ₐ[K] L) + (LocalBlockFamily d)) := + localBlockFamilyHerbrandH0Finite + d σ hgen + let familyHMinusOneFinite : + Finite + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalBlockFamily d) σ) := + 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 + (HerbrandH0 (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base + (d i).base_isNontrivial + (d i).extension)) = + Module.finrank + (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := by + calc + Nat.card + (HerbrandH0 (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base + (d i).base_isNontrivial + (d i).extension)) = + Nat.card + (HerbrandH0 + (absoluteValueDecompositionGroup K + (d i).extension.1) + (LocalizedCompletion + (d i).base (d i).extension)ˣ) := + Nat.card_congr + (localPlaceBlockHerbrandH0Equiv + (d i).base + (d i).base_isNontrivial + (d i).extension σ hgen).toEquiv + _ = Module.finrank + (d i).base.Completion + (LocalizedCompletion + (d i).base (d i).extension) := + localHerbrandH0_card_eq_localDegree + (d i).base + (d i).base_isNontrivial + (d i).extension σ hgen + have hHMinusOne : + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base + (d i).base_isNontrivial + (d i).extension) σ) = 1 := by + calc + Nat.card + (HerbrandHMinusOne (L ≃ₐ[K] L) + (LocalPlaceBlock + (d i).base + (d i).base_isNontrivial + (d i).extension) σ) = + 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_congr + (localPlaceBlockHerbrandHMinusOneEquiv + (d i).base + (d i).base_isNontrivial + (d i).extension σ hgen).toEquiv + _ = 1 := + 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..f7ac69d11a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +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`. +-/ + +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..000a886462 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean @@ -0,0 +1,1065 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +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. +-/ + +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 +@[simp] +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 +@[simp] +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 + (absoluteValueExtension_localizationTensorHom 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 + (completionTensorDecomposition_left (K := K) (L := L) vK hvK z + (absoluteValueExtensionConjugate vK w g)) = + absoluteValueExtension_localizationTensorHom 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) = + absoluteValueExtension_localizationTensorHom 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 +@[simp] +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) + (completionTensorDecomposition_left (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..87b1874e75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +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. +-/ + +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 _ := + completionTensorDecomposition_extensionFintype + (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 + (completionTensorDecomposition_left + (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 + (completionTensorDecomposition_left + (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 _ := + completionTensorDecomposition_extensionFintype + (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..345eef7cc2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +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..7d0ac7a2e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.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 +-/ + +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. +-/ + +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..657775b97c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +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..200159c744 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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..ae8703e4d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient +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..69c8cf2337 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite +/-! +# Degree-zero localized Herbrand cardinality +-/ + +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..08c1238ae6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 +/-! +# Degree-minus-one localized Herbrand cardinality +-/ + +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..d09d9e6186 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial +/-! +# Localized-units Herbrand quotient +-/ + +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..49bb930c77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne +/-! +# Triviality of localized degree-minus-one Herbrand cohomology +-/ + +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..9aadf07524 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +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. +-/ + +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..eaed1a9410 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv +/-! +# Finiteness of localized-completion Herbrand groups +-/ + +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..d02c48c46d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra +/-! +# A generator of a localized finite Galois group +-/ + +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..18d5859aee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator +/-! +# Low-degree Herbrand equivalences for a localized completion +-/ + +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..37e3732f83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology + +/-! # Main -/ +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 + ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g hU.1 hU.2 = 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 + (localIntegerUnitsHerbrandDefined K L g hg).1 + (localIntegerUnitsHerbrandDefined K L g hg).2 = 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..4af0b69b12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -0,0 +1,738 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import Mathlib.FieldTheory.Galois.NormalBasis +import Mathlib.LinearAlgebra.Quotient.Pi +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasis` Lean module. -/ + +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 [chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv, + chosenNormalBasisCoordinateQuotPiLinearEquiv, + chosenNormalBasisPiResidueInverseIndexAddEquiv] + 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 := + CyclicCohomology.ProfiniteCohomology.Herbrand.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 + CyclicCohomology.ProfiniteCohomology.Herbrand.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 := + CyclicCohomology.ProfiniteCohomology.Herbrand.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 + CyclicCohomology.ProfiniteCohomology.Herbrand.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..02ba94d940 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting + +/-! # Normal Basis Cohomology -/ +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..a18b9b00a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient` Lean module. -/ + +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..2d2833d8b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +import Mathlib.GroupTheory.GroupAction.Quotient +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction` Lean module. -/ + +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..ed9d771bfe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -0,0 +1,483 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting` Lean module. -/ + +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..e93e2a9929 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -0,0 +1,473 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct` Lean module. -/ + +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] [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)) : + 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] [IsUniformAddGroup 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] [IsUniformAddGroup 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..c76c873c47 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting + +/-! # Normal Basis Recursive Lifting -/ +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..037ca09d86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded` Lean module. -/ + +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..fc7aad70c0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.Valuation` Lean module. -/ + +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..f9b21b387e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +/-! # Valuation Herbrand -/ +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 + let hZ : HerbrandQuotientDefined (Gal(L / K)) (Multiplicative Int) g := + galoisGroupValueGroup_herbrandQuotientDefined K L g + ∃ hField : HerbrandQuotientDefined (Gal(L / K)) Lˣ g, + @herbrandQuotient (Gal(L / K)) Lˣ _ _ _ + (galoisGroupFieldUnitsMulDistribMulAction K L) g hField.1 hField.2 = + @herbrandQuotient (Gal(L / K)) + (ValuativeRel.valuation L).integerˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g hU.1 hU.2 * + @herbrandQuotient (Gal(L / K)) (Multiplicative Int) _ _ _ + (galoisGroupValueGroupMulDistribMulAction K L) g hZ.1 hZ.2 := 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..df9a7c1d49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Data.ZMod.QuotientGroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.ValueGroupCohomology` Lean module. -/ + +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..ff8ec74813 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified +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..0fffde5d98 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +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..41f609744d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +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. +-/ + +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..2b7d9f14a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +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..bfe6b21a83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup +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..62e4fb0668 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -0,0 +1,942 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +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. +-/ + +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 := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 + +/-- 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 + AlgebraicNumberTheory.Valuations.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 := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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]) = + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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]) = + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 padicDVR_five : + 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 `padicDVR_five` is `5`. -/ +@[simp] theorem padicDVR_five_val : + letI : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ + let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 + ((((padicDVR_five : 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ˣ) / + (padicDVR_five : 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) - + (((padicDVR_five : 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]) = + (((padicDVR_five : + 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 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 + (u : F.valuationSubringˣ) = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 + ((padicDVR_five : 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)) + ((((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring))).2 hdiff + rw [← LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ) = + (padicDVR_five : 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' := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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ˣ) / + (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2), hu⟩ + obtain ⟨r, hr⟩ := hroot w + have hr' : (r : F.valuationSubringˣ) ^ 2 = + (u : F.valuationSubringˣ) / + (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) := by + simpa [w] using hr + refine ⟨r, Or.inr ?_⟩ + calc + (u : F.valuationSubringˣ) = + (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + ((u : F.valuationSubringˣ) / + (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2)) := by + symm + rw [mul_comm] + exact div_mul_cancel _ _ + _ = (padicDVR_five : 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' := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 + ((padicDVR_five : 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ˣ) = + ((padicDVR_five : 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 + _ = (((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) * + (sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by rw [hsD] + _ = ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) ^ (2 ^ m) * + ((sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by + rw [mul_pow] + _ = ((padicDVR_five : 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 + (((padicDVR_five : 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..3b6cb5f46f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +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. +-/ + +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..ff61737f37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +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. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open LocalFieldTheory.Padic +open ValuationTheory + +open scoped NNReal ValuativeRel + +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := by + have h := + AlgebraicNumberTheory.Valuations.padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one + p f hf hζ hζgen target + change Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal base.valuationSubring) + (IsLocalRing.maximalIdeal target.valuationSubring) = 1 at h + exact h + have hiCanonical : Function.Injective iCanonical := by + intro x y hxy + apply Subtype.ext + exact (algebraMap ℚ_[p] L).injective (congrArg Subtype.val hxy) + have hiCanonicalAlg : + Function.Injective + (algebraMap base.valuationSubring target.valuationSubring) := by + simpa only [iCanonical] using hiCanonical + have hmapCanonical : + Ideal.map iCanonical (IsLocalRing.maximalIdeal base.valuationSubring) = + IsLocalRing.maximalIdeal target.valuationSubring := by + have hmap : + Ideal.map (algebraMap base.valuationSubring target.valuationSubring) + (IsLocalRing.maximalIdeal base.valuationSubring) = + IsLocalRing.maximalIdeal target.valuationSubring ^ + Ideal.ramificationIdx' + (IsLocalRing.maximalIdeal base.valuationSubring) + (IsLocalRing.maximalIdeal target.valuationSubring) := by + exact map_maximalIdeal_eq_pow_ramificationIdx hiCanonicalAlg + rw [hramCanonical, pow_one] at hmap + simpa only [iCanonical] using hmap + have hmapBase : + Ideal.map eBase (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = + IsLocalRing.maximalIdeal base.valuationSubring := + ringEquiv_map_maximalIdeal eBase + have hmapTarget : + Ideal.map eTarget (IsLocalRing.maximalIdeal target.valuationSubring) = + IsLocalRing.maximalIdeal 𝒪[L] := + ringEquiv_map_maximalIdeal eTarget + have hcommute : + eTarget.toRingHom.comp (iCanonical.comp eBase.toRingHom) = iLocal := by + ext x + rfl + have hmapLocal : + Ideal.map iLocal (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = + IsLocalRing.maximalIdeal 𝒪[L] := by + calc + Ideal.map iLocal (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = + Ideal.map (eTarget.toRingHom.comp (iCanonical.comp eBase.toRingHom)) + (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) := by rw [hcommute] + _ = Ideal.map eTarget + (Ideal.map (iCanonical.comp eBase.toRingHom) + (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]])) := + (Ideal.map_map (iCanonical.comp eBase.toRingHom) eTarget.toRingHom).symm + _ = Ideal.map eTarget + (Ideal.map iCanonical + (Ideal.map eBase (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]))) := by + congr 1 + exact (Ideal.map_map eBase.toRingHom iCanonical).symm + _ = IsLocalRing.maximalIdeal 𝒪[L] := by + rw [hmapBase, hmapCanonical, hmapTarget] + have hmapLocalAlg : + Ideal.map (algebraMap 𝒪[ℚ_[p]] 𝒪[L]) + (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = + IsLocalRing.maximalIdeal 𝒪[L] := by + simpa only [iLocal] using hmapLocal + 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 [hmapLocalAlg, pow_one] + · rw [hmapLocalAlg] + 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..1895aa8952 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +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..958c208b86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +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..9039bb0504 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +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. +-/ + +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 finiteAbelianNormSubgroupOrderIso_of_charZero : + 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 finiteAbelianNormSubgroupEquiv_of_charZero : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ + OpenFiniteIndexSubgroup K := + (finiteAbelianNormSubgroupOrderIso_of_charZero K).toEquiv + +/-- States the theorem `finiteAbelianNormSubgroupOrderIso_of_charZero_apply`. -/ +@[simp] +theorem finiteAbelianNormSubgroupOrderIso_of_charZero_apply + (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : + finiteAbelianNormSubgroupOrderIso_of_charZero 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..1dbab39fdd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +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. +-/ + +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..81c2d9ac6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.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 +-/ + +import Mathlib.NumberTheory.Cyclotomic.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +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ˣⁿ`. +-/ + +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..cd79e9923e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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ˣ`. +-/ + +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 finiteAbelianNormSubgroupOrderIso_of_charP + (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 finiteAbelianNormSubgroupEquiv_of_charP + (p : ℕ) [Fact p.Prime] [CharP K p] : + FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ + OpenFiniteIndexSubgroup K := + (finiteAbelianNormSubgroupOrderIso_of_charP 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)) : + finiteAbelianNormSubgroupOrderIso_of_charP 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..492f4d2bc9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +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. +-/ + +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..a4dc2ff68e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +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`. +-/ + +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 localFiniteUnramifiedField_nontriviallyNormedField + (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 localFiniteUnramifiedField_valuativeRel + (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..e8659f2055 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +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. +-/ + +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..d1964fd4b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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..2fb473340d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -0,0 +1,1080 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +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. +-/ + +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 := + 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 + (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..482a2edaf9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +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. +-/ + +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..8bcdf22259 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +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. +-/ + +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..4bbe102a2a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +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. +-/ + +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..a207c5c429 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +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. +-/ + +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'] + +/-- 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..77c34c0f38 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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ˣ) [H.FiniteIndex] + (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..73f8864cdf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +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. +-/ + +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..f95059972b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields +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. +-/ + +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..b4ec02d4c5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields +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. +-/ + +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..645987637d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +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. +-/ + +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..d9ba8a1cda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields +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. +-/ + +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..d43fcc6485 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +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. +-/ + +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..61a0e569bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms +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. +-/ + +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..a4d7ad53b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +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. +-/ + +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..f9366db713 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +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`. +-/ + +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..4f9162bc4b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +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. +-/ + +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..eb11cdbb83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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..703385dffc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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..9ddd385493 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.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 +-/ + +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. +-/ + +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..aad5218a6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +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. +-/ + +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 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..f407724979 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +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. +-/ + +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) [NeZero n] : + 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..61bacc1c54 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.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 +-/ + +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`. +-/ + +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..d27dd227e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +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..827de7bb87 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +import Mathlib.RepresentationTheory.Rep.Basic + +/-! # Absolute Units Fixed Field -/ +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..95feacbaac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm + +/-! # Abstract Fixed Field Norm -/ +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..f3caac92da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +/-! # Abstract Fixed Field Units -/ +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..5b09dff58f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +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..59c1a5560c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -0,0 +1,1094 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +/-! # Concrete Reciprocity Canonical -/ +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] + +private abbrev G (K : Type) [Field K] := + intrinsicAbsoluteGalois K + +private abbrev AG (K : Type) [Field K] : Rep ℤ (G K) := + intrinsicAbsoluteUnits K + +private abbrev B (K : Type) [Field K] : ClosedSubgroup (G K) := + intrinsicAbstractBase K + +/-! ## 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. -/ +private 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 -/ + +private 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 + +private 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 [extensionQuotientCongr, finiteNormQuotientCongr] + 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 + let e := finiteReciprocityNaturalityConjugation (B K) + (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) + hLK s + let c := extensionQuotientCongr + (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 + 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 [AG, B, 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 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..8dfaba8ecb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +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. +-/ + +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 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..19d8a328e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +/-! # Concrete Reciprocity Transport -/ +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] + +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 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) := + (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..1a17cd5610 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +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. +-/ + +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)) := + (topologicalAbelianization_finite_equiv K L).symm.trans + ((abelianizedGaloisConjugationOfEmbeddings K L i j).trans + (topologicalAbelianization_finite_equiv 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) : + (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (topologicalAbelianizationConjugationOfEmbeddings K L i j).toMonoidHom = + (abelianizedGaloisConjugationOfEmbeddings K L i j).toMonoidHom.comp + (topologicalAbelianization_finite_equiv 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 + (topologicalAbelianization_finite_equiv K L) + ((abelianizedGaloisConjugationOfEmbeddings K L i j) + ((topologicalAbelianization_finite_equiv K L).symm + (localArtinMap K L x))) = + localArtinMap K L x + rw [abelianizedGaloisConjugationOfEmbeddings_eq_refl] + exact (topologicalAbelianization_finite_equiv 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..28f135a2f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality +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..5d0e3b70c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +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..e6c070e681 --- /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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment +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. +-/ + +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..ef53fb3b8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +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..2827d2c10b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +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. +-/ + +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..7cc4f9a548 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.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 +-/ + +import Mathlib.Algebra.Order.Floor.Ring +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +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. +-/ + +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..e7f0770068 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +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. +-/ + +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..51650045aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +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. +-/ + +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..b74e178f2a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +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. +-/ + +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 RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 RamificationTheory.HilbertRamification.Higher.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 (RamificationTheory.HilbertRamification.ValuationSubring.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..426ebda78b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.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 +-/ + +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. +-/ + +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..31017db2d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +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. +-/ + +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..ef9432e405 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core +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. +-/ + +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..0975c53595 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.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 +-/ + +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. +-/ + +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..c13bcbfebf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.FieldTheory.IntermediateField.Algebraic +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. +-/ + +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..addafa99bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +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. +-/ + +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..e0684d9b62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +/-! # Finite Abstract Fixed Field -/ +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..ce7ecdf22c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +import Mathlib.Topology.Algebra.Module.FiniteDimension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main + +/-! # Finite Extension Class Field Axiom -/ +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..11f57592a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.SeparableClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient + +/-! # Finite Galois Realization -/ +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..99d95e72a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing + +/-! # Finite Residue Finrank Transfer -/ +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) + refine + { toFun := fun x => ⟨eFZ (x : F), ?_⟩ + invFun := fun z => ⟨eFZ.symm (z : Z), ?_⟩ + 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) } + · 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 + · 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 + +/-- 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 + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + intro x + simpa only [V, ValuationSubring.valuationSubring_valuation] using + (ValuationTheory.DiscreteValuationField.Valuation.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..f1fc4e5e18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import Mathlib.FieldTheory.Finite.Extension +import Mathlib.FieldTheory.Galois.Profinite + +/-! # Finite Residue Frobenius -/ +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. -/ +private 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, + 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, + 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. -/ +@[simp] +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. -/ +@[simp] +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..cbda6c94ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence + +/-! # Finite Residue Valuation Comparison -/ +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..ce8a432fec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField + +/-! # Finite Subgroup Residue Degree -/ +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 + +noncomputable local instance localAbstractFixedResidueIntermediateFieldSMul + (H : ClosedSubgroup (Gal(SeparableClosure K / K))) : + SMul + (decompositionResidueField K (localSeparableValuationSubring K)) + (localAbstractFixedResidueIntermediateField K H) := + @Algebra.toSMul _ _ _ _ + (localAbstractFixedResidueIntermediateFieldAlgebra K H) + +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..e35f3ec1fa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +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. +-/ + +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. -/ +private 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) + +/-- 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' + +/-- 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. -/ +@[simp] 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. -/ +@[simp] 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. -/ +@[simp] 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) := by + letI := T.lowerNormal + letI := T.upperNormal + letI := T.upperFinite + letI := upperAbsoluteFinite T + exact 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. -/ +@[simp] 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. -/ +@[simp] 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. -/ +@[simp] 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. -/ +@[simp] 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) := by + letI := T.totalNormal + letI := T.totalFinite + letI := T.baseAbsoluteFinite + exact abstractFixedFieldAbelianizedTransferMap + k (SeparableClosure k) + T.base T.intermediate T.top + T.top_le_intermediate T.intermediate_le_base + +/-- Forgetting continuity recovers algebraic abelianized transfer. -/ +@[simp] 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..b108603d4e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +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..3a776fcc72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +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..cf8832be07 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -0,0 +1,378 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +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. +-/ + +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] + [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) := + @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..696fc97ab7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison +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. +-/ + +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..eeb87c959e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -0,0 +1,691 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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] [FiniteDimensional 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..a281dc4ed0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -0,0 +1,380 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean new file mode 100644 index 0000000000..fc0b141c34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport +/-! +# Ambient prime witnesses + +This module constructs the ambient norm-residue value, a valuation-one +prime witness for each abelianized Galois element, and the corresponding +ambient Frobenius target. +-/ + +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] + +/-- 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 + + +/-- 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/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean new file mode 100644 index 0000000000..41189f81c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -0,0 +1,833 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +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. +-/ + +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 : + (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 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) + let _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 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' (by + apply RingHom.ext + intro x + exact (iH.commutes x).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 hsourceRing : + (localSeparableValuationSubring F).comap LF.val.toRingHom = + (ValuativeRel.valuation LF).valuationSubring := + localSeparableValuationSubring_comap_embedding F LF LF.val + have htargetRing : + (localSeparableValuationSubring K).comap iH.toRingHom = + (ValuativeRel.valuation LH).valuationSubring := + localSeparableValuationSubring_comap_embedding K LH iH + have hmem (x : LF) : + x ∈ (ValuativeRel.valuation LF).valuationSubring ↔ + phi x ∈ (ValuativeRel.valuation LH).valuationSubring := by + rw [← hsourceRing, ← htargetRing] + change + (x : SeparableClosure F) ∈ localSeparableValuationSubring F ↔ + ((phi x : LH) : SeparableClosure K) ∈ + localSeparableValuationSubring K + rw [hphi x] + have hvaluation := + localSeparableValuationSubring_eq_comap_finiteExtensionEquiv + K F i e + rw [hvaluation] + rfl + 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 + F E jI + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) xPrime = + Abelianization.of (qF q) := by + have hprime := + 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) + exact hprime + 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 hconcretePrimeZ : + concreteNormResidueSymbolOfEmbedding + F E jI + (localResidueDatum F) + (localHenselianValuation F) + (separableClosureUnits_isClassFormation F) xPrime = z := by + rw [hconcretePrime, ← hqz] + exact (abelianizationCongr_of qF q).symm + have hxWitness : + ambientEmbeddedPrimeWitness K F E j e z = xPrime := by + rfl + rw [hxWitness] + exact + (DFunLike.congr_fun + (localArtinMonoidHom_eq_of_embedding F E jI) xPrime).trans + hconcretePrimeZ + +/-- 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 : + (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 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₀ + 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 q₀ := + abstractExtensionQuotientEquivGaloisGroup + K (SeparableClosure K) H₀ J₀ hJH hTargetNormal + let RF := + (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField + (localResidueDatum F) + let _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 + 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 : Finite + (H₀.toSubgroup ⧸ + extensionSubgroup H₀ SH hSHH) := by + change Finite + (RH.field.toSubgroup ⧸ + extensionSubgroup RH.field SH hSHH) + exact 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) := by + exact + 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' (by + apply RingHom.ext + intro x + exact (iH.commutes x).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 := 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 + let xPrime : Fˣ := + normUnits F LF pF + let xPrime0 : F₀ˣ := + Units.mapEquiv phiF.toMulEquiv xPrime + have hxWitness : + ambientEmbeddedPrimeWitness K F E j e z = xPrime := by + rfl + 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 + have hambientPrime : + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul xPrime0) = + Additive.ofMul + (q₀.abelianizationCongr + (Abelianization.of qAmbient)) := by + 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 + have hxPrime0 : + Units.mapEquiv phiF.toMulEquiv + (ambientEmbeddedPrimeWitness K F E j e z) = + xPrime0 := by + exact congrArg + (Units.mapEquiv phiF.toMulEquiv) hxWitness + have hsymbolWitness : + 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)) := by + exact + (congrArg + (fun y : F₀ˣ => + abstractFixedFieldNormResidueSymbol + K (SeparableClosure K) + (localResidueDatum K) + (localHenselianValuation K) + (separableClosureUnits_isClassFormation K) + H₀ J₀ hJH (Additive.ofMul y)) + hxPrime0).trans hambientPrime + unfold ambientEmbeddedPrimeSymbolProperty + exact hsymbolWitness + +/-- 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 : + (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 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) + let _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 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..958f509daf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +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..eb7e11d54e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +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..c8c7e20364 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -0,0 +1,720 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..2ea3257cab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..0e18da5091 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality +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. +-/ + +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 Ω] [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))] + (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..c76dc7f4e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..4c0d0370e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -0,0 +1,646 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData +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. +-/ + +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] [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 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..a15edd12d5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -0,0 +1,1857 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +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. +-/ + +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 } + +/-- 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 : + (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, + 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 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 := 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 + 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) + 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 + 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 + 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 + 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₀, hHabsolute⟩ + let RH := + H.toFiniteResidueAbstractField (localResidueDatum K) + intro 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 + constructor + · intro hq + change + q ∈ + (closedSubgroupGenerated + (Set.range (fun _ : Unit => sigma.1) : Set + ((intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below)) : + Subgroup _) at hq + have hmap := + map_mem_closedSubgroupGenerated_image + xiHom + hq + have hgenerators : + xiHom '' + Set.range (fun _ : Unit => sigma.1) = + Set.range (fun _ : Unit => xiHom sigma.1) := by + ext y + constructor + · rintro ⟨x, ⟨u, rfl⟩, rfl⟩ + exact ⟨u, rfl⟩ + · rintro ⟨u, rfl⟩ + exact ⟨sigma.1, ⟨u, rfl⟩, rfl⟩ + rw [hgenerators] at hmap + change + xiHom q ∈ + (closedSubgroupGenerated + (Set.range (fun _ : Unit => xiHom sigma.1) : Set + (H₀.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH)) : + Subgroup _) + exact hmap + · intro hq + change + xiHom q ∈ + (closedSubgroupGenerated + (Set.range (fun _ : Unit => xiHom sigma.1) : Set + (H₀.toSubgroup ⧸ + (localResidueDatum K).extensionInertiaWithin + H₀ J₀ hJH)) : + Subgroup _) at hq + have hmap := + map_mem_closedSubgroupGenerated_image + xiInvHom + hq + have hgenerators : + xiInvHom '' + Set.range (fun _ : Unit => xiHom sigma.1) = + Set.range (fun _ : Unit => sigma.1) := by + ext y + constructor + · rintro ⟨x, ⟨u, rfl⟩, rfl⟩ + exact ⟨u, (xi.symm_apply_apply sigma.1).symm⟩ + · rintro ⟨u, rfl⟩ + exact + ⟨xiHom sigma.1, ⟨u, rfl⟩, + xi.symm_apply_apply sigma.1⟩ + rw [hgenerators] at hmap + have hvalue : xiInvHom (xiHom q) = q := + xi.symm_apply_apply q + rw [hvalue] at hmap + change + q ∈ + (closedSubgroupGenerated + (Set.range (fun _ : Unit => sigma.1) : Set + ((intrinsicAbstractBase F).toSubgroup ⧸ + (localResidueDatum F).extensionInertiaWithin + (intrinsicAbstractBase F) EI.field EI.below)) : + Subgroup _) + exact 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 + +/-- 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 + constructor + · intro hx + rw [IntermediateField.mem_fixedField_iff] + intro rho hrho + let rhoH : H₀.toSubgroup := ⟨rho, hSHH hrho⟩ + have hrhoExtension : + rhoH ∈ extensionSubgroup RH.field SH hSHH := by + exact hrho + have hrhoInternal : + rhoH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J₀ hJH sigmaH := by + rw [← (localResidueDatum K).extensionSubgroup_frobeniusFixedField + RH J₀ hJH sigmaH] + exact hrhoExtension + let tau : + (intrinsicAbstractBase F).toSubgroup := + psi.symm rhoH + have htauInternal : + tau ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below sigma := + (intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField + K F E j e sigma tau).2 (by + have hpsiApply : + intrinsicBaseEquivAmbientEmbeddedField K F i e tau = + rhoH := + psi.apply_symm_apply rhoH + rw [hpsiApply] + simpa only [ + i, jF, jI, EI, H₀, J₀, hJH, RF, hHabsolute, H, RH, + sigmaH] using hrhoInternal) + have htauExtension : + tau ∈ extensionSubgroup + RF.field SF hSFB := by + rw [(localResidueDatum F).extensionSubgroup_frobeniusFixedField + RF EI.field EI.below sigma] + exact htauInternal + have hxfix : tau.1 x = x := + (IntermediateField.mem_fixedField_iff SF.toSubgroup x).1 + hx tau.1 htauExtension + have hpsi : psi tau = rhoH := + psi.apply_symm_apply rhoH + have hrhoeq : (psi tau).1 = rho := + congrArg Subtype.val hpsi + calc + rho (e x) = (psi tau).1.1 (e x) := by + exact congrArg + (fun g : Gal(SeparableClosure K / K) => g (e x)) + hrhoeq.symm + _ = e (tau.1 x) := by + rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, + e.symm_apply_apply] + _ = e x := congrArg e hxfix + · intro hx + rw [IntermediateField.mem_fixedField_iff] + intro tau₀ htau₀ + let tau : + (intrinsicAbstractBase F).toSubgroup := + ⟨tau₀, by + rw [intrinsicAbstractBase, + closedFixingSubgroup_bot_eq_baseField] + exact Subgroup.mem_top _⟩ + have htauExtension : + tau ∈ extensionSubgroup + RF.field SF hSFB := by + exact htau₀ + have htauInternal : + tau ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin + RF EI.field EI.below sigma := by + rw [← (localResidueDatum F).extensionSubgroup_frobeniusFixedField + RF EI.field EI.below sigma] + exact htauExtension + have hrhoInternal : + psi tau ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin + RH J₀ hJH sigmaH := + (intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField + K F E j e sigma tau).1 htauInternal + have hrhoExtension : + psi tau ∈ extensionSubgroup RH.field SH hSHH := by + rw [(localResidueDatum K).extensionSubgroup_frobeniusFixedField + RH J₀ hJH sigmaH] + exact hrhoInternal + have hxfix : (psi tau).1.1 (e x) = e x := + (IntermediateField.mem_fixedField_iff SH.toSubgroup (e x)).1 + hx (psi tau).1 hrhoExtension + apply e.injective + calc + e (tau₀ x) = e (tau.1 x) := rfl + _ = (psi tau).1.1 (e x) := by + rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, + e.symm_apply_apply] + _ = e x := hxfix + 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. -/ +@[simp] +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/IntrinsicFrobeniusArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean new file mode 100644 index 0000000000..32b339bf57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..a5d6ae4120 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..7fff1ae318 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean @@ -0,0 +1,936 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..0eff578a10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..db380e8c49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +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. +-/ + +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'] [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)] + (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 := by + intro x hx + rcases hx with ⟨y, rfl⟩ + exact ⟨algebraMap L L' y, rfl⟩ + 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 : + (extensionSubgroup H J hJH).Normal := + lower.extension.normal + let hJfinite : Finite + (H.toSubgroup ⧸ extensionSubgroup H J hJH) := + lower.extension.finite + let hJ'normal : + (extensionSubgroup H' J' hJ'H').Normal := + upper.extension.normal + let hJ'finite : Finite + (H'.toSubgroup ⧸ extensionSubgroup H' J' hJ'H') := + upper.extension.finite + let hHabsolute : Finite + ((baseField + Gal(SeparableClosure K / K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K / K)) + H (le_baseField H)) := + lower.base.finite + let hH'absolute : Finite + ((baseField + Gal(SeparableClosure K / K)).toSubgroup ⧸ + extensionSubgroup + (baseField Gal(SeparableClosure K / K)) + H' (le_baseField H')) := + 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 : K ≃ₐ[K] FLower := + lower.baseEquiv + let FUpper := + abstractFixedField K (SeparableClosure K) H' + let phiUpper : K' ≃ₐ[K] FUpper := + 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 := by + intro x + rfl + let aUpper : FUpperˣ := + Units.mapEquiv phiUpper.toMulEquiv a + let aNorm : Kˣ := + 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 + refine + lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm_apply_eq.mpr ?_ + calc + normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + (upper.extension.extensionQuotientMulEquiv.abelianizationCongr + upperQuotientValue) = + normResidueNaturalityAbelianizedRestriction + H H' J J' hJH hJ'H' hH'H hJ'J + ((upper.extension.extensionQuotientMulEquiv.symm.trans + upper.fixedFieldQuotientEquiv).abelianizationCongr.symm + upperSymbolValue) := by + simp only [← abelianizationCongr_trans, + ← abelianizationCongr_symm, MulEquiv.symm_trans_apply, + MulEquiv.symm_symm, upperQuotientValue] + _ = (lower.extension.extensionQuotientMulEquiv.symm.trans + lower.fixedFieldQuotientEquiv).abelianizationCongr.symm + lowerSymbolValue := hraw + _ = lower.extension.extensionQuotientMulEquiv.abelianizationCongr + lowerQuotientValue := by + simp only [← abelianizationCongr_trans, + ← abelianizationCongr_symm, MulEquiv.symm_trans_apply, + MulEquiv.symm_symm, lowerQuotientValue] + have hupperEval : + upper.normResidueAbelianElement a = + upper.quotientEquiv.abelianizationCongr + upperQuotientValue := by + exact upper.normResidueAbelianElement_apply a + have hlowerEval : + lower.normResidueAbelianElement aNorm = + lower.quotientEquiv.abelianizationCongr + lowerQuotientValue := by + exact 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] + calc + restrictActual + ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + (upper.quotientEquiv.abelianizationCongr + upperQuotientValue)) = + (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 + upperQuotientValue)))) := + htarget upperQuotientValue + _ = (Abelianization.equivOfComm (H := Gal(L / K))).symm + (lower.quotientEquiv.abelianizationCongr + lowerQuotientValue) := + 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 : Kˣ := + 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..8c6a91c7a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -0,0 +1,1257 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison +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. +-/ + +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 + +local instance intrinsicPrimeComparison_separableClosureAlgebra : + 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 + +local instance intrinsicPrimeComparison_fixedFieldNormed : + NontriviallyNormedField F := + finiteExtensionSpectralNormedField K F + +local instance intrinsicPrimeComparison_fixedFieldValuative : + 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 σ) + +local instance intrinsicPrimeComparison_frobeniusSourceAlgebra + (σ : 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 σ) + _ _ + (intrinsicPrimeComparison_frobeniusSourceAlgebra + K H J hJH e σ)) := by + let : Algebra F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + intrinsicPrimeComparison_frobeniusSourceAlgebra + 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 σ) + +local instance intrinsicPrimeComparison_frobeniusSourceNormed + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + NontriviallyNormedField + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) := + finiteExtensionSpectralNormedField F + (intrinsicFixedFieldFrobeniusSourceField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusSourceValuative + (σ : 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 σ) + +local instance intrinsicPrimeComparison_frobeniusAmbientAlgebraK + (σ : 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 + +local instance intrinsicPrimeComparison_frobeniusAmbientAlgebraF + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + Algebra F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ).algebra + +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 σ) + _ _ + (intrinsicPrimeComparison_frobeniusAmbientAlgebraK + K H J hJH e σ)) := by + let : Algebra K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + intrinsicPrimeComparison_frobeniusAmbientAlgebraK + 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 σ)) + +local instance intrinsicPrimeComparison_frobeniusAmbientNormed + (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : + NontriviallyNormedField + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + finiteExtensionSpectralNormedField K + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) + +local instance intrinsicPrimeComparison_frobeniusAmbientValuative + (σ : 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 σ) + _ _ + (intrinsicPrimeComparison_frobeniusAmbientAlgebraF + K H J hJH e σ)) := by + let : Algebra F + (intrinsicFixedFieldFrobeniusAmbientField + K H J hJH e σ) := + intrinsicPrimeComparison_frobeniusAmbientAlgebraF + 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 := + intrinsicPrimeComparison_frobeniusAmbientNormed + K H J hJH e σ) + (_hLHVal := + intrinsicPrimeComparison_frobeniusAmbientValuative + 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..603140c4bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -0,0 +1,1393 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +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. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open scoped NNReal Pointwise ValuativeRel +open ClassFormation LocalFieldTheory RamificationTheory CyclicCohomology +open RamificationTheory.HilbertRamification.ValuationSubring + +private abbrev finiteFixedField + (K : Type) [Field K] + (H : FiniteAbstractField (Gal(SeparableClosure K / K))) : + Type := + abstractFixedField K (SeparableClosure K) H.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 + ValuationTheory.DiscreteValuationField.Valuation.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] +private 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 + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + intro x + simpa only [V, ValuationSubring.valuationSubring_valuation] using + (ValuationTheory.DiscreteValuationField.Valuation.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) + rw [localAbstractFixedResidueAction_apply K H.field sigmaH] + rw [hsigmaH] + 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 + rw [hlocal] + exact + residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEquiv + K H e sigma htop tau hTau + +/-- 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 + 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)) + 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 + (sigma.toRingEquiv.trans e.toRingEquiv) with + commutes' := fun x => by + change e (sigma (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, sigma.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] } + 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₀)) := by + 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)) + 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₀) := + { 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 hc' : + 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 [hc', sigma.commutes, hc, phi.apply_symm_apply] } + let rho : Gal(SeparableClosure K / F₀) := + { e.symm.toRingEquiv.trans + (sigma.toRingEquiv.trans e.toRingEquiv) with + commutes' := fun x => by + change e (sigma (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, sigma.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₀ 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₀] 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..24931cb768 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -0,0 +1,747 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main +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. +-/ + +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) := by + letI := T.lowerNormal + letI := T.lowerFinite + letI := T.lowerAbsoluteFinite + exact + 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) := by + letI := T.upperNormal + letI := T.upperFinite + letI := upperAbsoluteFinite T + exact + 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) := by + letI := T.lowerNormal + letI := T.upperNormal + exact + 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) := by + letI := T.totalNormal + letI := T.totalFinite + letI := T.baseAbsoluteFinite + exact + 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) := by + letI := intermediateNormal T + letI := intermediateFinite T + letI := intermediateAbsoluteFinite T + exact + 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) := by + letI := T.totalNormal + letI := T.totalFinite + exact + 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..a127704c1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.FieldTheory.PrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +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. +-/ + +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 Ω] + +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) + [FiniteDimensional (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)] : + 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) + [FiniteDimensional (abstractFixedField k Ω K) + (abstractRelativeFixedField k Ω hLK)] : + (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ + (abstractRelativeFixedField k Ω hLK →ₐ[ + abstractFixedField k Ω K] Ω) := + Equiv.ofBijective (abstractFixedFieldCosetToAlgHom k Ω K L hLK) + ⟨abstractFixedFieldCosetToAlgHom_injective k Ω K L hLK, + 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..619d2b83cb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation + +/-! # Galois Extension Quotient -/ +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..bd22aeb114 --- /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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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)`. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation LocalClassFieldTheory +open scoped IsMulCommutative + +private abbrev towerAbsoluteGalois (K : Type) [Field K] := + intrinsicAbsoluteGalois K + +private abbrev towerAbsoluteUnits (K : Type) [Field K] : + Rep ℤ (towerAbsoluteGalois K) := + intrinsicAbsoluteUnits K + +private abbrev towerAbstractBase (K : Type) [Field K] : + ClosedSubgroup (towerAbsoluteGalois K) := + intrinsicAbstractBase K + +private 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..2a7feff0ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation + +/-! # Henselian Valuation Base -/ +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] + +private abbrev G := Gal(SeparableClosure K / K) + +private abbrev A : Rep ℤ (G K) := + galoisAmbientUnitsRep K (SeparableClosure K) + +/-- `Kˣ` is the coefficient group fixed by the distinguished base subgroup +of the absolute separable Galois group. -/ +def baseFieldUnitsEquiv : + Additive Kˣ ≃+ ambientFixedAddSubgroup (A K) (baseField (G K)) := + (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).trans + (AddEquiv.addSubgroupCongr + (congrArg (ambientFixedAddSubgroup (A 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 (A K) (baseField (G 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..cd7d5da156 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +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`. +-/ + +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] + +private abbrev absoluteGalois (K : Type) [Field K] := + intrinsicAbsoluteGalois K + +private abbrev absoluteUnits (K : Type) [Field K] : + Rep ℤ (absoluteGalois K) := + intrinsicAbsoluteUnits K + +private abbrev abstractBase (K : Type) [Field K] : + ClosedSubgroup (absoluteGalois K) := + intrinsicAbstractBase K + +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. -/ +private 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..266cfa8d8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.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 +-/ + +import Mathlib.FieldTheory.IsSepClosed +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. +-/ + +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 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..a3ce963b76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Local Class Field Axiom -/ +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..b19a000420 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom + +/-! # Local Henselian Valuation -/ +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 := + ValuationTheory.DiscreteValuationField.Valuation.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..11ff38aeb0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -0,0 +1,437 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF + +/-! # Local Residue Datum -/ +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] + +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. -/ +private 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 := + ValuationTheory.DiscreteValuationField.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 := + ValuationTheory.DiscreteValuationField.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⟩ := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target Ares + have hB : target.valuation.valuationSubring = Bres := + ValuationTheory.DiscreteValuationField.ValuedExtension.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. -/ +private 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) + refine + { toFun := fun x => ⟨eKZ (x : K), ?_⟩ + invFun := fun z => ⟨eKZ.symm (z : Z), ?_⟩ + 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) } + · 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 + · 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 + +/-- 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 := 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..fde4187719 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation + +/-! # Main -/ +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..ca27b00e0b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +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. +-/ + +noncomputable section + +namespace ClassFieldTheory.LocalCFT + +open ClassFormation + +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 + +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..16a2ca9296 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +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. +-/ + +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) := + (topologicalAbelianization_finite_equiv 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 + ((topologicalAbelianization_finite_equiv 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..321f707c49 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +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. +-/ + +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 E] [FiniteDimensional K F] + [IsGalois K E] [IsGalois K F] : + 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..f6e96a11fe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius +import Mathlib.FieldTheory.AbsoluteGaloisGroup +import Mathlib.FieldTheory.Galois.Infinite +import Mathlib.FieldTheory.IsSepClosed + +/-! # Residue Absolute Degree -/ +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] + +private instance finiteFieldRingCharPrime : Fact (ringChar k).Prime := + ⟨CharP.char_is_prime k (ringChar k)⟩ + +private 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̄/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̄/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..a6f9e07e6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius + +/-! # Residue Absolute Frobenius -/ +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. -/ +private 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`. -/ +@[simp] +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..07484c9f39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence + +/-! # Residue Action Index -/ +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..24369a73be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +/-! # Residue Algebraic Closure Degree -/ +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] + +private instance finiteResidueBaseRingCharPrime : Fact (ringChar k).Prime := + ⟨CharP.char_is_prime k (ringChar k)⟩ + +private instance residueAlgebraicClosureIsAlgClosure : IsAlgClosure k Omega := + ⟨inferInstance, inferInstance⟩ + +private instance residueAlgebraicClosureIsGalois : IsGalois k Omega := by + infer_instance + +private 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..536c6e803c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree +import Mathlib.FieldTheory.PurelyInseparable.Basic +import Mathlib.RingTheory.Valuation.Integral +import Mathlib.RingTheory.Valuation.ValuationSubring + +/-! # Residue Algebraically Closed -/ +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..2a04d47ac3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup + +/-! # Residue Datum -/ +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..c59605fb1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.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 +-/ + +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. +-/ + +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..eecbbc57c9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.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 +-/ + +import Mathlib.FieldTheory.PrimitiveElement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +/-! # Separable Fixed Field Norm -/ +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 + [FiniteDimensional K E] [Algebra.IsSeparable K E] : + 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 + [FiniteDimensional K E] [Algebra.IsSeparable K E] : + ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ + extensionSubgroup + (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) + (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃ + (E →ₐ[K] Ω) := + Equiv.ofBijective (baseFixingCosetToAlgHom K Ω E) + ⟨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 + +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..b38bbfa045 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.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 +-/ + +import Mathlib.FieldTheory.PrimitiveElement +import Mathlib.FieldTheory.IsSepClosed +import Mathlib.RingTheory.Norm.Transitivity +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. +-/ + +noncomputable section + +open scoped BigOperators + +namespace LocalClassFieldTheory + +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] + [FiniteDimensional k L] [Algebra.IsSeparable k L] + [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..d1f042c796 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -0,0 +1,447 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.RingTheory.Norm.Transitivity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +/-! # Separable Units Norm -/ +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..3678891b85 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +/-! # Tate Transport -/ +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 _ + refine ShortComplex.isoMk i i i ?_ ?_ + · simpa [Ares, i] using (res_norm_eq e A).symm + · 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 _ + refine ShortComplex.isoMk i i i ?_ ?_ + · rfl + · 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..5ea12136dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +import Mathlib.FieldTheory.KrullTopology +import Mathlib.Topology.Algebra.Group.Quotient +import Mathlib.Topology.Algebra.Group.TopologicalAbelianization +import Mathlib.Topology.Algebra.Group.Units +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. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open scoped NNReal ValuativeRel +open LocalFieldTheory +open LocalFieldTheory.IsNonarchimedeanLocalField + +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 := + ValuationTheory.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 + + 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 topologicalAbelianization_finite_equiv : + Abelianization (Gal(L / K)) ≃* TopologicalAbelianization (Gal(L / K)) := by + let h : Subgroup.topologicalClosure (commutator (Gal(L / K))) = + commutator (Gal(L / K)) := + commutator_topologicalClosure_eq (Gal(L / K)) + exact QuotientGroup.quotientMulEquivOfEq h.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 + (topologicalAbelianization_finite_equiv 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 + (topologicalAbelianization_finite_equiv 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 : + (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (localArtinMap K L).toMonoidHom = + localArtinMonoidHom K L := by + ext x + change + (topologicalAbelianization_finite_equiv 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) = + topologicalAbelianization_finite_equiv 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 (topologicalAbelianization_finite_equiv 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) : + (topologicalAbelianization_finite_equiv 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 localArtinMap_quotientKerEquiv : + 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. -/ +@[simp] +theorem localArtinMap_quotientKerEquiv_mk (x : Kˣ) : + localArtinMap_quotientKerEquiv 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..1778d3d840 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -0,0 +1,419 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer +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. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open scoped ValuativeRel +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open RamificationTheory.HilbertRamification.ValuationSubring + + +private abbrev absoluteGalois (K : Type) [Field K] := + intrinsicAbsoluteGalois K + +private abbrev abstractBase (K : Type) [Field K] : + ClosedSubgroup (absoluteGalois K) := + intrinsicAbstractBase K + +private 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 + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.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⟩ := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + (localCompleteDVF K) target B + have hC : target.valuation.valuationSubring = C := + ValuationTheory.DiscreteValuationField.ValuedExtension.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) = + 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..b93d3ca34a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -0,0 +1,186 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +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. +-/ + +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..a13e36dfbd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -0,0 +1,596 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +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. +-/ + +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 = + (topologicalAbelianization_finite_equiv K L + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L))) ^ + LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K + (Additive.ofMul x) := by + apply (topologicalAbelianization_finite_equiv K L).symm.injective + rw [map_zpow, + (topologicalAbelianization_finite_equiv K L).symm_apply_apply] + change + (((topologicalAbelianization_finite_equiv 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) = + topologicalAbelianization_finite_equiv K L + (Abelianization.of + (arithmeticFrobeniusOfUnramifiedValuation K L)) := by + apply (topologicalAbelianization_finite_equiv K L).symm.injective + rw [(topologicalAbelianization_finite_equiv K L).symm_apply_apply] + change + (((topologicalAbelianization_finite_equiv 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) = + topologicalAbelianization_finite_equiv 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..47acf8ce02 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +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. +-/ +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] [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 ≃* 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 + 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..007174e73a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +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. +-/ + +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 + +/-- 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 LocalFieldTheory.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..133af1b822 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.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 +-/ + +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. +-/ + +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 ValuationTheory.DiscreteValuationField.Valuation.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..840ba0d994 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +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..07e63f4c18 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +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..3f60ba9ec6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -0,0 +1,447 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +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. +-/ + +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 + ∃ hU : HerbrandQuotientDefined Gal(L / K) 𝒪[L]ˣ g, + @herbrandQuotient Gal(L / K) 𝒪[L]ˣ _ _ _ + (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) + g hU.1 hU.2 = 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..a90859bb5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.Norm` Lean module. -/ + +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..ec161dd83e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +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..8cbaf748a2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +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..41fa53cfcf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic` Lean module. -/ + +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 + principalUnitsNormExtensionSideOfIsIntegralClosure_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..ce96b46972 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -0,0 +1,536 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift` Lean module. -/ + +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] [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) (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..77518e552e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide` Lean module. -/ + +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] [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] + (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] [IsNonarchimedeanLocalField K] + [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField 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 principalUnitsNormExtensionSideOfIsIntegralClosure_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..ac92698921 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace` Lean module. -/ + +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 principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_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 := + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_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`. -/ +@[simp] +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..6587c4abe2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.ResidueNorm` Lean module. -/ + +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 integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_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 [integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_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..c3f3f722b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +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. +-/ + +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..123b91dcd3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.GroupTheory.Abelianization.Defs +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor +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. +-/ + +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 + chosenNormQuotientEquivZModResidueFinrank_of_fieldPrincipalUnits_zero_le + (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) := + 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 := + chosenNormQuotientEquivZModResidueFinrank_of_fieldPrincipalUnits_zero_le + 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..dfb25a6a10 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +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..83724e7dd6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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..d72036c148 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.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 +-/ + +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. +-/ + +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..bf52d4083f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +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. +-/ + +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..55fac1eb86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -0,0 +1,224 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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)) + +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..91cba2c2c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +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. +-/ + +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..a9a1168222 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.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 +-/ + +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. +-/ + +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. -/ +private 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 topologicalProfiniteCompletion_compare_abstract + (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..c07f91ac2f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity +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..d44bf2c7ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification +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. +-/ + +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..06a82169ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +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. +-/ + +noncomputable section + +open CategoryTheory + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory + +variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] + [IsNonarchimedeanLocalField K] +private abbrev AbsoluteFiniteIndex := + OpenNormalSubgroup (localAbsoluteAbelianProfinite K) + +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..1ff9c51f84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +import Mathlib.Data.ZMod.Basic +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. +-/ + +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] [IsTopologicalGroup 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))] + [DiscreteTopology (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.localUnits_profinite K := + localUnitFactorContinuousMonoidHom K + let ux : LocalFieldTheory.localUnits_profinite 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.localUnits_profinite K) ∈ + ({ux}ᶜ : Set (LocalFieldTheory.localUnits_profinite K)) := by + simpa using hux.symm + obtain ⟨N, hN⟩ := + ProfiniteGrp.exist_openNormalSubgroup_sub_open_nhds_of_one + (isOpen_compl_singleton : IsOpen + ({ux}ᶜ : Set (LocalFieldTheory.localUnits_profinite K))) hone + let H : OpenFiniteIndexNormalSubgroup Kˣ := + topologicalProfiniteCompletionPreimageIndex + (LocalFieldTheory.localUnits_profinite K) unitFactor N + refine ⟨H, ?_⟩ + intro hmem + have hunit : unitFactor x ∈ N := hmem + have hnot : unitFactor x ∈ + ({ux}ᶜ : Set (LocalFieldTheory.localUnits_profinite 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..6ef165bcfd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean @@ -0,0 +1,590 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits +import Mathlib.Topology.Algebra.Group.Quotient +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. +-/ + +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. -/ +private 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`. -/ +@[simp] +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..cec594bf27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.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 +-/ + +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. +-/ + +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..6f9a78cb34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -0,0 +1,399 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData +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. +-/ + +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×`. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..31425ec10f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.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 +-/ + +import Mathlib.Topology.Algebra.ContinuousMonoidHom +import Mathlib.Topology.Algebra.Group.Quotient +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. +-/ + +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 + +private def topologicalAbelianizationMap (e : G ≃ₜ* H) : + TopologicalAbelianization G →* TopologicalAbelianization H := + QuotientGroup.map + (commutator G).topologicalClosure + (commutator H).topologicalClosure + e.toMulEquiv.toMonoidHom + (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 + +private 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 := topologicalAbelianizationMap_continuous e + continuous_invFun := 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..1bfa5a627f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +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..eab382097f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula +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..b452fb340e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import Mathlib.FieldTheory.KummerExtension +import Mathlib.FieldTheory.Separable +import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +import Mathlib.RingTheory.Ideal.Quotient.Operations +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. +-/ + +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..3f18281b4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +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. +-/ + +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..49375d91f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..06767b7cb4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +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. +-/ + +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..c90ca581f1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +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. +-/ + +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..0e3b74a7b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -0,0 +1,383 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +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. +-/ + +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] + +private 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) + +@[simp] +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 + +private 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) + (powMonoidHom_range_le_localHilbertPowerClassLeftHom_ker + K n hnK hmu) + +/-- Evaluation of the descended pairing agrees with the original local +Hilbert symbol on representatives. -/ +@[simp] +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..3912189441 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +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)`. +-/ + +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..1778255d8d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.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 +-/ + +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. +-/ + +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..d3d6a8aa1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +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. +-/ + +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..492b4d2777 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.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 +-/ + +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. +-/ + +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 + +private 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 + +@[simp] +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..163f79f1e4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -0,0 +1,1008 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +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. +-/ + +open scoped Classical 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] + +/-- 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) + +/-- 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) + +@[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) + +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] + +/-- 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 + +@[simp] +theorem localNthRootsReduction_apply + (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : + (localNthRootsReduction K n z).1 = + integerUnitsToResidueUnits K (nthRootIntegerUnit K n z) := + rfl + +/-- 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 +/-- 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 +/-- 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 + +/-- 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 + +/-- 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 + +/-- 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⟩ + +/-- 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 + +/-- 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] + +/-- 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)) + +/-- 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 _ + +/-- 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 +/-- 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) + +/-- 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 + +/-- 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) + +/-- 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] + +/-- 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 + +/-- 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..bd78a90e82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +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. +-/ + +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..75fa5b760a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +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..59650aec8f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +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..140d52e8bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean @@ -0,0 +1,420 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +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. +-/ + +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..fab88c3067 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact +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. +-/ + +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 + equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + (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..b330cb26e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic +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. +-/ + +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 := + equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + 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..3a1efc2b72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +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. +-/ + +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..4d5f67b860 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -0,0 +1,674 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +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. +-/ + +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 + (equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + 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 + equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_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 + equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + (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 + (equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + 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 + (equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_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..ed87b37589 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +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. +-/ + +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..44ee9b3e78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +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. +-/ + +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..8133007f5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +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`. +-/ + +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..1ba0c7672f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.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 +-/ + +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. +-/ + +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..ae3da65f70 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -0,0 +1,834 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.CharP.Subring +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +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. +-/ + +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] + +/-- 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 := + CompleteDVF.higherPrincipalUnitGroup.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⟩ + +theorem equalCharacteristicResidueCard + {L : Type} [Field L] (F : LocalField L) : + Nat.card F.residueField = + F.residueCharacteristic ^ + (equalCharacteristicResidueRank F : ℕ) := by + simpa [equalCharacteristicResidueRank] using + CompleteDVF.higherPrincipalUnitGroup.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) + (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..7183c0e4fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +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. +-/ + +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..a41913a963 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +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. +-/ + +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..5a5e28d91c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -0,0 +1,989 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +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. +-/ + +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 + +/-- 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])) + (CompleteDVF.higherPrincipalUnitGroup.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) + +/-- 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])) + (CompleteDVF.higherPrincipalUnitGroup.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..ccb173accb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +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. +-/ + +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] [Finite G] [Finite 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..395550095c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean @@ -0,0 +1,643 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +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. +-/ + +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..6197430318 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate +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. +-/ + +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..ac93ac45e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +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`. +-/ + +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..3e34687304 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex +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. +-/ + +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..99fd11cf03 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.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 +-/ + +import Mathlib.GroupTheory.Index +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +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. +-/ + +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..a576ef2cf2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.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 +-/ + +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. +-/ + +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..f95cebd7db --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +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..30ca2323d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.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 +-/ + +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..4dd244bc66 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All +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..9584ef7714 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.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 +-/ + +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..6e299faa6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All +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..6cc1b7e44a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/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 +-/ + +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..3836504e3c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All +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..1208477628 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/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 +-/ + +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..4ea7b966a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -0,0 +1,901 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +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`. +-/ + +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 padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod + (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 + (padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod 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 := padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod 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 normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 := finiteNormExtension_nonarchimedean_finite_extension + (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 padicCyclotomicUnramified_padicExponentialValuationSubringEquivCompleteDVF + (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 padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv + (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 + have hT : T.toSubring = + (integralClosure + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring + L).toSubring := + by + let : IsIntegralClosure T + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring L := by + change IsIntegralClosure target.valuationSubring + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L + infer_instance + exact padicCyclotomicUnramified_valuationSubring_eq_integralClosure + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring T + exact + { toFun := fun x => ⟨x, by + change (x : L) ∈ T.toSubring + rw [hT, ← hW] + exact x.property⟩ + invFun := fun x => ⟨x, by + change (x : L) ∈ W.toSubring + rw [hW, ← hT] + 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 := + padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv 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 := padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod 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 := + padicCyclotomicUnramified_padicExponentialValuationSubringEquivCompleteDVF p + let eTarget : W ≃+* target.valuationSubring := + padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv 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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + base target + let : FiniteDimensional base.residueField target.residueField := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 + ((LocalFieldTheory.DiscreteValuationField.ValuedExtension.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⟩ := + ValuationTheory.DiscreteValuationField.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 + 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..4309ef1ad0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule +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..7d78fc961b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +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..41f8cd5ca7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +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..525f968ed9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +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..bb20899bb6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +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..23c42ea894 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +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..556c19bb21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +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. +-/ + +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] + +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 K F.residueCharacteristic] : + 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 + +noncomputable local instance equalCharacteristicChangedCompletedBaseValuationRankOne + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne k + +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 equalCharacteristicChangedCompletedLevelField_field + (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 equalCharacteristicChangedCompletedLevelField_algebra + (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 + +local instance equalCharacteristicChangedCompletedLevelField_module + (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) _ _ + (equalCharacteristicChangedCompletedLevelField_algebra 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) _ _ _ + (equalCharacteristicChangedCompletedLevelField_algebra 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)) + (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) + +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) + +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) + [CharP K F.residueCharacteristic] + (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..89f1730dc0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -0,0 +1,769 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +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`. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +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) + [CharP K F.residueCharacteristic] + (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..8794d12f84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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) + [CharP K F.residueCharacteristic] + (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..cea8846401 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean @@ -0,0 +1,678 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +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. +-/ + +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⟧ˣ) + [CharP K F.residueCharacteristic] (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..9d90f365bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +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. +-/ + +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..12afaec63d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.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 +-/ + +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. +-/ + +noncomputable section + +open scoped LaurentSeries PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance equalCharacteristicCompletedFrobeniusBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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..b45d8a22ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.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 +-/ + +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. +-/ + +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] + +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 + +noncomputable local instance + equalCharacteristicFrobeniusContinuityBaseValuationRankOne + (k : Type v) [Field k] : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne k + +@[reducible] +noncomputable local instance equalCharacteristicFrobeniusContinuityBaseNormedField + (k : Type v) [Field k] : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField k) := + equalCharacteristicCompletedBaseNormedField k + +@[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..efd31b8377 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +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`. +-/ + +noncomputable section + +open scoped LaurentSeries PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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..26a45457ed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.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 +-/ + +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. +-/ + +noncomputable section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +noncomputable local instance equalCharacteristicFixedFieldAlgebraBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra F + +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..b0f3dbd555 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.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 +-/ + +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldCoefficientDescentBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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..ee491e5e9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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`. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldDegreeBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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 + +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 + +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) + +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..8c9ba0c19a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.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 +-/ + +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance + equalCharacteristicCompletedFrobeniusFixedFieldGenerationBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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..6c0a4a5c0f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.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 +-/ + +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +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..b44d5f453d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +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 := + charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +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..249ae6f545 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.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 +-/ + +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`. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance equalCharacteristicCompletedFrobeniusFixedNormBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra (LaurentSeries F.residueField) + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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 + +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 + +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) + +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..fdab725042 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.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 +-/ + +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +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..a09f34287d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -0,0 +1,718 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +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. +-/ + +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 + +private instance equalCharacteristicCompletedLevelBaseCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] : + 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) ℤᵐ⁰) + +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) (Γ₀ := ℤᵐ⁰) + +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 equalCharacteristicCompletedLevelField_field + (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 equalCharacteristicCompletedLevelField_algebra + (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 + +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 + +private 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 + +local instance equalCharacteristicCompletedLevelField_module + (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) _ _ + (equalCharacteristicCompletedLevelField_algebra 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) _ _ _ + (equalCharacteristicCompletedLevelField_algebra 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)) + (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) + +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) + +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..6fc485a2c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +/-- 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..75b5579376 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +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..315eef4826 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +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. +-/ + +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 := + charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +noncomputable local instance equalCharacteristicDirectBracketBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +noncomputable local instance equalCharacteristicDirectBracketBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +noncomputable local instance equalCharacteristicDirectBracketBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +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 + +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..a0dce58a23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..4418613715 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..4a73b0f736 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +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. +-/ + +noncomputable section + +open scoped LaurentSeries Polynomial PowerSeries + + +universe u v + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type u} [Field K] + +noncomputable local instance equalCharacteristicDirectTargetBaseAlgebra + (F : LocalField.{u, v} K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + laurentSeriesCoefficientAlgebra + +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 := + charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +/-- 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..b686115202 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -0,0 +1,763 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +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. +-/ + +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 K F.residueCharacteristic] : + CharP (equalCharacteristicCompletedUnramifiedField F.residueField) + F.residueCharacteristic := + charP_of_injective_algebraMap + (algebraMap F.residueField + (equalCharacteristicCompletedUnramifiedField F.residueField)).injective + F.residueCharacteristic + +private instance equalCharacteristicDirectThetaCompletedLevelCharP + (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 + +noncomputable local instance + equalCharacteristicDirectThetaBaseValuationIsNontrivial + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).IsNontrivial := + equalCharacteristicCompletedBaseValuationIsNontrivial F.residueField + +noncomputable local instance equalCharacteristicDirectThetaBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +noncomputable local instance equalCharacteristicDirectThetaBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +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 + +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..ba7af64dc5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +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. +-/ + +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, + mul_comm] using 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..26b08f4a9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -0,0 +1,616 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +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. +-/ + +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 := + charP_of_injective_algebraMap + (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) + (equalCharacteristicCompletedLevelField F n)).injective + F.residueCharacteristic + +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 + +noncomputable local instance + equalCharacteristicDirectThetaFixedBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +noncomputable local instance equalCharacteristicDirectThetaFixedBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +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 + +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..84d5985ccf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +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`. +-/ + +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..6cc49a1329 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean @@ -0,0 +1,314 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..2774f0110d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +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. +-/ + +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 + +noncomputable local instance equalCharacteristicThetaAtLevelBaseValuationRankOne + (F : LocalField.{u, v} K) : + (Valued.v : Valuation + (equalCharacteristicCompletedUnramifiedField F.residueField) ℤᵐ⁰).RankOne := + equalCharacteristicCompletedBaseValuationRankOne F.residueField + +noncomputable local instance equalCharacteristicThetaAtLevelBaseNormedField + (F : LocalField.{u, v} K) : + NontriviallyNormedField + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedBaseNormedField F.residueField + +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 + +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 + +private 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_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..792139c4a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +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. +-/ + +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] + +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 + +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..613de128d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +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..0b082ce7d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +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..fcb718e450 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +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. +-/ + +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 Γ] [MulArchimedean Γ] + [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 + show 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..e9595a26b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.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 +-/ + +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. +-/ + +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⟧) + +/-- 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 + CompleteDVF.higherPrincipalUnitGroup.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 + CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi⟩ + +/-- 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 + CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi x := by + rfl + +/-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_C`. -/ +@[simp] +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 + CompleteDVF.higherPrincipalUnitGroup.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 + CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + pi hpi a + +/-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_X`. -/ +@[simp] +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 + CompleteDVF.higherPrincipalUnitGroup.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..076ba04fc8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +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`. +-/ + +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..97fcb8b0aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +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..16b0990ea4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion +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..226d3e85c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.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 +-/ + +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. +-/ + +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..736252c252 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +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. +-/ + +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 K F.residueCharacteristic] : + 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) + [CharP K F.residueCharacteristic] + {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) + [CharP K F.residueCharacteristic] + (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..ba3ef678f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..5b083f39a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -0,0 +1,622 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import Mathlib.Algebra.Module.RingHom +import Mathlib.Data.Fintype.EquivFin +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`. +-/ + +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 equalCharacteristicLubinTateParameter_coeFun + (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 equalCharacteristicLubinTateTruncatedRing_commRing + (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 := (· * ·) + +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..43ee98c1b1 --- /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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +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. +-/ + +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..12b57a705a --- /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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +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. +-/ + +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..c4fa9a41b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +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`. +-/ + +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..5b3405ff47 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.SplittingField.IsSplittingField +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. +-/ + +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..d3635bddf9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +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`. +-/ + +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..9f24cb1c47 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +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. +-/ + +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..7ab3d6ee14 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +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))`. +-/ + +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..46e21f981c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..d64c24dcac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible +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. +-/ + +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..c28d069134 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +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..4934e18162 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +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..6ae0c83fe4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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 + +/-- 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 [CompleteDVF.higherPrincipalUnitGroup.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. -/ +@[simp] +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..e18ac13e4e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne +import Mathlib.LinearAlgebra.GeneralLinearGroup.Basic +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. +-/ + +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)) + fun _ ha => 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..114ed8d9ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean @@ -0,0 +1,437 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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`. -/ +@[simp] +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..a06934cd3a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel +import Mathlib.Algebra.CharP.Algebra +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] + +private instance equalCharacteristicLaurentCharP + (F : LocalField.{u, v} K) + [CharP K F.residueCharacteristic] : + 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 + +/-- 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 [CompleteDVF.higherPrincipalUnitGroup.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..131624fd5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.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 +-/ + +import Mathlib.RingTheory.PowerSeries.Basic +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. +-/ + +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..23284222da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +import Mathlib.FieldTheory.Finite.Extension +import Mathlib.FieldTheory.Galois.Profinite +import Mathlib.LinearAlgebra.Basis.Basic +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. +-/ + +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. -/ +@[simp] +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 ι] + +private theorem laurentSeriesCoefficientBasis_linearIndependent + (b : Module.Basis ι k l) : + LinearIndependent k⸨X⸩ + (fun i : ι ↦ (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩)) := by + 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 + +private theorem laurentSeriesCoefficientBasis_span + (b : Module.Basis ι k l) : + Submodule.span k⸨X⸩ + (Set.range (fun i : ι ↦ + (HahnSeries.C (Γ := ℤ) (b i) : l⸨X⸩))) = ⊤ := by + 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 + (laurentSeriesCoefficientBasis_linearIndependent b) + (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 equalCharacteristicFiniteUnramifiedExtension_field : + 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 + +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..9f2b3874a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +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..8a2e76d1e3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard +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..478698f64b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership +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. +-/ + +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..836998c76d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.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 +-/ + +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`. +-/ + +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..5b400dde69 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed +/-! +# LubinTate the explicit norm-subgroup computation: the standard level lies in the higher-unit fixed field +-/ + +noncomputable section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +noncomputable local instance equalCharacteristicHigherUnitMembershipBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedFrobeniusFixedBaseAlgebra F + +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..451dbdcd16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding +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. +-/ + +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..84e32de05b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +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. +-/ + +noncomputable section + + +open scoped LaurentSeries PowerSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +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..8a5e1f072b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms +/-! +# LubinTate the explicit norm-subgroup computation: higher-unit Frobenius fixes the standard level map +-/ + +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 + +@[reducible] noncomputable local instance equalCharacteristicHigherUnitMapBaseAlgebra + (F : LocalField K) : + Algebra F.residueField⸨X⸩ + (equalCharacteristicCompletedUnramifiedField F.residueField) := + equalCharacteristicCompletedLevelBaseAlgebra F + +@[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 := + higherUnitLevelMapRingHom F n + +/-- 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..1f0e25710a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +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)`. +-/ + +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..186372ab4d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv +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. +-/ + +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..8e664b4b51 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +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. +-/ + +noncomputable section + + +open scoped LaurentSeries + +namespace LubinTate +namespace EqualCharacteristic + +open LocalFieldTheory.DiscreteValuationField + +variable {K : Type} [Field K] + +noncomputable local instance equalCharacteristicLaurentSeriesField + (F : LocalField K) : Field F.residueField⸨X⸩ := + @HahnSeries.instField ℤ F.residueField Int.instAddCommGroup + Int.instLinearOrder Int.instIsOrderedAddMonoid inferInstance + +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..f985f27ab3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm +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)`. +-/ + +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..23b2548cc9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra +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. +-/ + +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] + [FiniteDimensional 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..bae03b322f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +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))`. +-/ + +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) := + 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)) := + 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..d625da3e16 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +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. +-/ + +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..f9a1fc61ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +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..86b34e9c2f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +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..422c61710f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +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. +-/ + +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) : + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + (equalCharacteristicLubinTateLowerRamificationFiltration F n) i = + (Nat.card F.residueField ^ (n + 1 - k) : ℕ) / + ((Nat.card F.residueField - 1) * + Nat.card F.residueField ^ n : ℕ) := by + rw [ + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, + RamificationTheory.DiscreteValuationField.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), + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + filtration i) = ((k + 1 : ℕ) : ℝ) + rw [hdecomp, Finset.sum_range_add] + change + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + filtration a + + (∑ x ∈ Finset.range b, + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..5f0ea2062b --- /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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +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. +-/ + +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₀) + [CharP K₀ F.residueCharacteristic] + (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..3e566e21af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian +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. +-/ + +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..252a79c387 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +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. +-/ + +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..c04dcd0bb7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import Mathlib.RingTheory.Discriminant +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. +-/ + +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. -/ +private 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 + ValuationTheory.DiscreteValuationField.ValuedExtension.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 + (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₀) + [CharP K₀ F.residueCharacteristic] + (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 + (ValuationTheory.DiscreteValuationField.ValuedExtension.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₁] [IsGalois 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_zero + 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..9f773d82ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core +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. +-/ + +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..579d9b7141 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +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..d02e73d719 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries +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..4e638507f8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +import Mathlib.FieldTheory.IsAlgClosed.Basic +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`. +-/ + +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 => + Classical.choose + (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))) +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..58d7d40559 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField +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. +-/ + +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 +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..b501b02235 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -0,0 +1,759 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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`. +-/ + +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, + mul_comm] using 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..e900000ef9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients +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. +-/ + +noncomputable section + +open scoped PowerSeries + + +universe u v w + +namespace LubinTate +namespace EqualCharacteristic + +local instance (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..1e783f88a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +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. +-/ + +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..f7ccccccf1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +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..bff12acad2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +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..d3cddad7ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -0,0 +1,985 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +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. +-/ + +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 + (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. -/ +@[simp] +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. -/ +@[simp] +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..8df211a599 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +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. +-/ + +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..b821a1eb8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +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. +-/ + +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..e5b3c0dbe9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +import Mathlib.RingTheory.AdicCompletion.Topology +import Mathlib.RingTheory.PowerSeries.Evaluation +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. +-/ + +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] + +private noncomputable local instance (priority := 50) + standardLubinTateLevelCoefficientUniformSpace + (F : LocalField.{u, v} K) : + UniformSpace F.valuationSubring := + ⊥ + +private 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 + +private 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 + +private 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..96d3c6e675 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.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 +-/ + +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`. +-/ + +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..af898fb4e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +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. +-/ + +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. -/ +@[simp] +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..9fcc077b12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.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 +-/ + +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)`. +-/ + +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..75522b4f00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean @@ -0,0 +1,224 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +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. +-/ + +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 standardLubinTateUnitParameter_commGroup + (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..a72f320c70 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration +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)`. +-/ + +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..adfc349435 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +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)`. +-/ + +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..733a912e32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -0,0 +1,1413 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +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. +-/ + +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)) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) + have heq : changedLevel = oldLevel := by + exact + standardLubinTateHigherUnit_restrict_changedLevel_eq_originalLevel + hπ u n hu + exact + changedEquiv.trans + ((IntermediateField.equivOfEq heq).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..8ac0e5925a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +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. +-/ + +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. -/ +@[simp] +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..6e1429dbca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -0,0 +1,665 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..7794907469 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +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. +-/ + +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..c6d36884a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +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. +-/ + +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..4ea42d193f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula +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`. +-/ + +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..c8ab580651 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +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. +-/ + +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..d4805ea4d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration +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)`. +-/ + +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..046ad04882 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer +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. +-/ + +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..173ee34892 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +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`. +-/ + +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..917879ff91 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +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. +-/ + +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..a2fe0bea34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -0,0 +1,895 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +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. +-/ + +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 [LubinTateSeries.standardLubinTateSeries_toPowerSeries, + standardLubinTatePowerSeries, linearForm] + 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} + +private noncomputable local instance + standardLubinTatePrimitiveActionCoefficientUniformSpace : + UniformSpace F.valuationSubring := + ⊥ + +private noncomputable local instance + standardLubinTatePrimitiveActionTargetWithIdeal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +private 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 + +private 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 + +private 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..c46d7d3cf0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -0,0 +1,985 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation +import Mathlib.RingTheory.MvPowerSeries.Inverse +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. +-/ + +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 + +private noncomputable local instance + standardLubinTatePrimitiveDisplacementCoefficientUniformSpace : + UniformSpace F.valuationSubring := + ⊥ + +private noncomputable local instance + standardLubinTatePrimitiveDisplacementTargetWithIdeal + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where + i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal + +private 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 + +private 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 + +private 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 + +private noncomputable local instance + standardLubinTateLevelField_finiteDimensional_forPrimitiveDisplacement + (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : + FiniteDimensional K (standardLubinTateLevelField hπ n) := + standardLubinTateLevelField_finiteDimensional hπ n + +private 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 + standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_chosenRepresentative_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..7cd478dc39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +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`. +-/ + +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..84ec87c18c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein +import Mathlib.FieldTheory.IsSepClosed +import Mathlib.RingTheory.Polynomial.GaussLemma +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. +-/ + +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..ba89445fea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.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 +-/ + +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. +-/ + +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..e2f4892a3d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean @@ -0,0 +1,937 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import Mathlib.RingTheory.Finiteness.Cardinality +import Mathlib.RingTheory.Discriminant +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. +-/ + +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 (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 + 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 π := by + exact + (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) + have hdcoe : (d : ℕ∞) ≠ 0 := by + exact_mod_cast hdne + have hmul_le : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring lambda ≤ + (d : ℕ∞) * 1 := by + rw [hmul] + 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 hlambdaVal : + IsDiscreteValuationRing.addVal target.valuationSubring lambda = 1 := + le_antisymm hvle honele + have hed : e = d := by + rw [hlambdaVal, mul_one] at hmul + exact_mod_cast hmul.symm + 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..67d9de5812 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +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. +-/ + +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..8dc948b13e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification +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. +-/ + +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..d2a6c6baf7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +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..77bc51e339 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +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..c6df142ff2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.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 +-/ + +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. +-/ + +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..fe66b3b7fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean @@ -0,0 +1,925 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +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. +-/ + +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 σ] + +private theorem truncTotal_powerSeries_subst_eq_of_truncTotal_eq + (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 + 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 + +private theorem truncTotal_inVariables_subst_eq_of_truncTotal_eq + (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 + 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 + +/-- 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 + (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 + 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] + +private theorem linearInVariableStabilization_hasSubst + (π : F.valuationSubring) : + MvPowerSeries.HasSubst + (linearInVariableStabilization (σ := σ) π) := + 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] + +private theorem degree_add_one_le_order_subst_monomial_sub_linear_stabilization + (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 + 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] + +private theorem coeff_subst_inVariables_monomial_of_degree_le + (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 + 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] + +private theorem coeff_subst_inVariables_add_monomial_of_degree_le + (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 + 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] + +private theorem coeff_defect_add_monomial_eq_of_degree_le_constantCoeff + (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 + 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 + +private theorem coeff_defect_sum_linear_monomials_eq_zero + (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 + 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..b9551f330b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm +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. +-/ + +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..16e0f804e1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.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 +-/ + +import Mathlib.RingTheory.MvPowerSeries.Order +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. +-/ + +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..8f7fba9f41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.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 +-/ + +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. +-/ + +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..3804c57c8c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean @@ -0,0 +1,659 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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] + +private theorem linearInVariable_hasSubst + (π : F.valuationSubring) : + MvPowerSeries.HasSubst (linearInVariable (σ := σ) π) := + 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] + +private theorem degree_add_one_le_order_subst_monomial_sub_linear + (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 + 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] + +private theorem coeff_subst_inVariables_monomial + (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 + 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] + +private theorem coeff_subst_inVariables_add_monomial + (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 + 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..5fa763bd4f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean @@ -0,0 +1,1034 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +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. +-/ + +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] + +private 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. -/ +private 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. -/ +private 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. -/ +private 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. -/ +private 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`. -/ +private 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..e95658a50a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner +import Mathlib.FieldTheory.Finite.Basic +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. +-/ + +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} [Finite σ] (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] + +/-- The reduced right side `H(ebar(X_i))` is the expansion +`Hbar(X_i ^ q)`. -/ +theorem map_subst_inVariables + (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 + 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..b7c489b4e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +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. +-/ + +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..758aa497c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +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. +-/ + +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 + [Fintype σ] [Fintype τ] + {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 + 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 + [Fintype σ] [Fintype τ] + {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 + 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 + [Fintype τ] + {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 + exact hH.subst hHsubst hGsubst.const (fun _ => hG) + +end Intertwines + +/-- Zero intertwines any two series with zero constant coefficient. -/ +theorem intertwines_zero + [Fintype σ] + (e ebar : LubinTateSeries F π) : + Intertwines e ebar + (0 : MvPowerSeries σ F.valuationSubring) := by + 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)) + +private 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)) + +private 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} [Fintype σ] + (a : F.valuationSubring) (i : σ) : + Intertwines (standardSeries' hπ) (standardSeries' hπ) + (standardLubinTateEndomorphismInVariable hπ a i) := by + 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..116977a799 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.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 +-/ + +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. +-/ + +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..86130c5f96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +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..2fa5337f44 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +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..176d74775b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import Mathlib.RingTheory.WittVector.Compare +import Mathlib.RingTheory.WittVector.Complete +import Mathlib.RingTheory.WittVector.FrobeniusFractionField +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`. +-/ + +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. -/ +@[simp] +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 + (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 + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + (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 + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u)) := + Classical.choose_spec + (WittVector.isUnit_of_coeff_zero_ne_zero + (WittVector.frobeniusRotation p + (show + ((1 : padicCompletedUnramifiedWittRing p).coeff 0) ≠ 0 by + simp) + (completedUnramifiedWittUnit_coeff_zero_ne_zero p + (padicValuationUnitToCompletedUnramifiedWittUnit p u))) + (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..3e02b38766 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +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..bc96e5c1f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +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..db5c930c45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +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. +-/ + +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..5efbe69cf6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -0,0 +1,694 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import Mathlib.RingTheory.PowerSeries.Expand +import Mathlib.RingTheory.PowerSeries.Order +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. +-/ + +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⟩ + +private 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 + (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..3a71219863 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.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 +-/ + +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. +-/ + +noncomputable section + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open SameUniformizer + +private structure PadicChangedUniformizerApproximation + (p : ℕ) [Fact p.Prime] + (u : (padicLocalField p).valuationSubringˣ) where + series : PowerSeries (padicCompletedUnramifiedWittRing p) + constantCoeff_eq_zero : + PowerSeries.constantCoeff series = 0 + coeff_one_eq : + PowerSeries.coeff 1 series = + (padicChangedUniformizerLinearCoefficient p u : + padicCompletedUnramifiedWittRing p) + +private 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 + +@[simp] +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..d59dc8887a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.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 +-/ + +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. +-/ + +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..b71059a938 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean @@ -0,0 +1,569 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +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. +-/ + +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..a7fbb098fb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean @@ -0,0 +1,389 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField +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. +-/ + +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 + padicCompletedStandardChangedCompositum_changedFieldAlgebra + (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..3620d655c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.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 +-/ + +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. +-/ + +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..73ac00e865 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +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. +-/ + +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..cb7f60d1e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -0,0 +1,697 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +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. +-/ + +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 := by + ext x + exact 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 := by + ext x + exact 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 + padicCompletedChangedUniformizerFixedField_nontriviallyNormedField + (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 + padicCompletedStandardChangedCompositum_nontriviallyNormedField + (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 + padicCompletedChangedUniformizerFixedField_valuativeRel + (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 + padicCompletedStandardChangedCompositum_valuativeRel + (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 := by + ext x + exact 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..ae99d70c75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +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. +-/ + +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 + LocalFieldTheory.DiscreteValuationField.ValuedExtension.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 + ValuationTheory.DiscreteValuationField.ValuedExtension.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 + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.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..c6963d24f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed +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. +-/ + +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 (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 + +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 + +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) + +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..005c58a817 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.RingTheory.Polynomial.Eisenstein.Basic +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. +-/ + +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..e36e5d153f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.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 +-/ + +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. +-/ + +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..edcbefcc6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +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. +-/ + +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) := + ⊥ + +private 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..430260fd78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.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 +-/ + +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. +-/ + +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..f1451210a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries +import Mathlib.FieldTheory.SplittingField.Construction +import Mathlib.RingTheory.AdicCompletion.Topology +import Mathlib.RingTheory.PowerSeries.Evaluation +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. +-/ + +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 padicCompletedLevelField_field + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Field (padicCompletedLevelField p n) := by + change Field (padicCompletedPrimitivePolynomial p n).SplittingField + infer_instance + +@[reducible] +noncomputable instance padicCompletedLevelField_algebra + (p : ℕ) [Fact p.Prime] (n : ℕ) : + Algebra (padicCompletedUnramifiedField p) + (padicCompletedLevelField p n) := by + change Algebra (padicCompletedUnramifiedField p) + (padicCompletedPrimitivePolynomial p n).SplittingField + infer_instance + +section + +local instance padicCompletedLevelField_module + (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) + _ _ (padicCompletedLevelField_algebra 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)) + (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 (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' + +private noncomputable local instance (priority := 50) + padicCompletedLevelWittUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicCompletedUnramifiedWittRing p) := + ⊥ + +private noncomputable local instance + padicCompletedLevelTargetWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (padicCompletedLevelCompleteDVF p n).valuationSubring where + i := (padicCompletedLevelCompleteDVF p n).maximalIdeal + +private 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 + +private 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 + +private 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..92658601aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean @@ -0,0 +1,760 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +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. +-/ + +noncomputable section + +open scoped Polynomial PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp + +private 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..3cdd3052df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +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. +-/ + +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..bd0c57fa01 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean @@ -0,0 +1,701 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +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. +-/ + +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 + 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 ∈ 𝔭 := by + rcases lt_trichotomy i d with hi | hi | hi + · have hQi : Q.coeff i ∈ 𝔭 := by + apply hQeisenstein.mem + rwa [hQnatDegree] + change (Q - Polynomial.X ^ d).coeff 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 ∈ 𝔭 + rw [Polynomial.coeff_sub, hQd, Polynomial.coeff_X_pow, + ite_eq_left rfl, sub_self] + exact 𝔭.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 ∈ 𝔭 + rw [Polynomial.coeff_sub, hQi, Polynomial.coeff_X_pow, + ite_eq_right (ne_of_gt hi), sub_zero] + exact 𝔭.zero_mem + 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 hR_eval : + R.eval₂ j root = j (R.coeff 0) + root * tail := by + have h := + congrArg (Polynomial.eval₂ j root) + (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 root = root * tail + j (R.coeff 0) := by + simpa only [tail] using h.symm + _ = j (R.coeff 0) + root * tail := add_comm _ _ + have htailVal : + ((e + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (root * tail) := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (root * tail) (e + 1)).1 hrootTailMem + have heCastLt : + (e : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring + (root * 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 + (root * tail) := by + rw [hconst] + exact ne_of_lt heCastLt + have hRval : + IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j root) = (e : ℕ∞) := by + rw [hR_eval, + (IsDiscreteValuationRing.addVal + target.valuationSubring).map_add_of_distinct_val hdistinct, + hconst, min_eq_left] + exact heCastLt.le + have hpowEq : root ^ d = -(R.eval₂ j root) := + eq_neg_of_add_eq_zero_left hrootDecomp + have hmul : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring root = + (e : ℕ∞) := by + calc + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring root = + d • IsDiscreteValuationRing.addVal + target.valuationSubring root := by rw [nsmul_eq_mul] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (root ^ d) := by + symm + exact IsDiscreteValuationRing.addVal_pow root d + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (-(R.eval₂ j root)) := by rw [hpowEq] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j root) := + (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg _ + _ = (e : ℕ∞) := hRval + 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 ∈ 𝔭 := by + rcases lt_trichotomy i d with hi | hi | hi + · have hQi : Q.coeff i ∈ 𝔭 := by + apply hQeisenstein.mem + rwa [hQnatDegree] + change (Q - Polynomial.X ^ d).coeff 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 ∈ 𝔭 + rw [Polynomial.coeff_sub, hQd, Polynomial.coeff_X_pow, + ite_eq_left rfl, sub_self] + exact 𝔭.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 ∈ 𝔭 + rw [Polynomial.coeff_sub, hQi, Polynomial.coeff_X_pow, + ite_eq_right (ne_of_gt hi), sub_zero] + exact 𝔭.zero_mem + 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 hR_eval : + R.eval₂ j θ = j (R.coeff 0) + θ * tail := by + have h := + congrArg (Polynomial.eval₂ j θ) + (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 θ = θ * tail + j (R.coeff 0) := by + simpa only [tail] using h.symm + _ = j (R.coeff 0) + θ * tail := add_comm _ _ + have htailVal : + ((e + 1 : ℕ) : ℕ∞) ≤ + IsDiscreteValuationRing.addVal target.valuationSubring + (θ * tail) := + (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge + (θ * tail) (e + 1)).1 hθtail_mem + have heCastLt : + (e : ℕ∞) < + IsDiscreteValuationRing.addVal target.valuationSubring + (θ * 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 + (θ * tail) := by + rw [hconst] + exact ne_of_lt heCastLt + have hRval : + IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j θ) = (e : ℕ∞) := by + rw [hR_eval, + (IsDiscreteValuationRing.addVal + target.valuationSubring).map_add_of_distinct_val hdistinct, + hconst, min_eq_left] + exact heCastLt.le + have hpowEq : θ ^ d = -(R.eval₂ j θ) := + eq_neg_of_add_eq_zero_left hrootDecomp + have hmul : + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring θ = + (e : ℕ∞) := by + calc + (d : ℕ∞) * + IsDiscreteValuationRing.addVal target.valuationSubring θ = + d • IsDiscreteValuationRing.addVal + target.valuationSubring θ := by rw [nsmul_eq_mul] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (θ ^ d) := by + symm + exact IsDiscreteValuationRing.addVal_pow θ d + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (-(R.eval₂ j θ)) := by rw [hpowEq] + _ = IsDiscreteValuationRing.addVal target.valuationSubring + (R.eval₂ j θ) := + (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg _ + _ = (e : ℕ∞) := hRval + 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..63d12e516c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer +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. +-/ + +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. -/ +@[simp] +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..494f0bad0c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +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. +-/ + +noncomputable section + +open scoped PowerSeries + +namespace LubinTate + +open LocalFieldTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField.Examples.Qp +open ValuationTheory.DiscreteValuationField +open SameUniformizer + +private noncomputable local instance + padicStandardLevelTransportCoefficientUniformSpace + (p : ℕ) [Fact p.Prime] : + UniformSpace (padicLocalField p).valuationSubring := + ⊥ + +private 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) := + ⊥ + +private noncomputable local instance + padicStandardLevelTransportSourceWithIdeal + (p : ℕ) [Fact p.Prime] (n : ℕ) : + WithIdeal + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + ).valuationSubring where + i := + (standardLubinTateLevelCompleteDVF + (padicMultiplicativeLubinTateSeries_isUniformizer p) n + ).maximalIdeal + +private 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..03aa5fe867 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -0,0 +1,538 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +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. +-/ + +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) + have hg : Function.Injective g := + (IsFractionRing.injective + (padicCompletedUnramifiedWittRing p) + (padicCompletedUnramifiedField p)).comp + (padicIntToCompletedUnramifiedWittRing_injective p) + exact (IsFractionRing.lift hg).toAlgebra + +/-- The canonical field embedding agrees with the original Witt-ring map +on p-adic integers. -/ +@[simp] +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 + ValuationTheory.DiscreteValuationField.ValuedExtension.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..8d6bbe6b71 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.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 +-/ + +import Mathlib.FieldTheory.Finite.Basic +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. +-/ + +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..e38c9d9446 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +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..5d0713c136 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +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..d033b560ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +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. +-/ + +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 padicCompletedLevelField_padicAlgebra + (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..3fc95a166e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +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. +-/ + +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..86efb1d344 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean @@ -0,0 +1,691 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms +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. +-/ + +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..6aabda18e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean @@ -0,0 +1,705 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility +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. +-/ + +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..1de84b3d58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner +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. +-/ + +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..4c1416f044 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -0,0 +1,1047 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +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. +-/ + +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..f8415b3bfc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup +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. +-/ + +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..bd91276edc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series +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`. +-/ + +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..bbf2e02549 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification +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..70336ae036 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +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..9a2ee2ba7d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +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..33b975ba81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +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..3b3894f543 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +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..0dac7c13b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration +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..ee424d2215 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.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 +-/ + +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +import Mathlib.NumberTheory.NumberField.Ideal.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +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. +-/ + +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..a475c0abc5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +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. +-/ + +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..97bd112768 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -0,0 +1,623 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.NumberTheory.Padics.HeightOneSpectrum +import Mathlib.RingTheory.DedekindDomain.Dvr +import Mathlib.RingTheory.Localization.AsSubring +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +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. +-/ + +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 + (ValuationTheory.DiscreteValuationField.Valuation.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 + refine ⟨(sigma : M ≃ₐ[ℚ] M), ?_⟩ + 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, + 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..e47c9c282e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound +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. +-/ + +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⟩ := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + base target + let : FiniteDimensional + (base.valuationSubring ⧸ base.maximalIdeal) + (target.valuationSubring ⧸ target.maximalIdeal) := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + RamificationTheory.HilbertRamification.CompleteDVF.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..a291770ec3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +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. +-/ + +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..116ac0c395 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +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. +-/ + +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..284add77bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +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. +-/ + +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] [FiniteDimensional 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..35c5b4bf47 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory +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..c6918fcdaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +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..dba3c0edc3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +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..b2b377a165 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +import Mathlib.RingTheory.Norm.Basic +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`. +-/ + +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..4223ba38aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 + (GlobalClassFieldTheory.GlobalClassFields.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..56fd93b390 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +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. +-/ + +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..655ec8ee95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +/-! +# Zero finite exponent and unramifiedness +-/ + +open scoped NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + (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..215d804a92 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +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. +-/ + +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..9f3bacf4bf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +/-! +# Real places in the public abelian conductor +-/ + +open scoped NumberField + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 [GlobalClassFieldTheory.GlobalClassFields.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..38d87e8471 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import Mathlib.NumberTheory.RamificationInertia.Galois +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. +-/ + +open scoped NumberField ValuativeRel +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 = + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormChosenFinitePlaceLocalConductorExponent + (K := K) (L := L) v := by + rw [hcd] + simpa only [d] using + (abelianFullConductor_finiteExponent_eq_localConductorExponent + (K := K) (L := L) v) + have hChosen : + GlobalClassFieldTheory.GlobalClassFields.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..91861e4b6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +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..40676a0bbb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone +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. +-/ + +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..4e6b02b24d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..870b13623e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +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. +-/ + +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..afa3eae86a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +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 + +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 + +/-- 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..757e41731f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique +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. +-/ + +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..9ad651bcfb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.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 +-/ + +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u v + +/-- 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..db140f6408 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.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 +-/ + +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. +-/ + +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..008ec1a0ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +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. +-/ + +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..deafa0b1f9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +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. +-/ + +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..9ba4b394b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +/-! +# Ordinary and narrow moduli without real places +-/ + +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..2692c6dfe6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison +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. +-/ + +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..3d24660ad5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +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' } + +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 + +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)) + +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 + +/-- 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..f29ef82127 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +universe u + +/-- 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..6533fd8f1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +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. +-/ + +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..5ee785b8e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +/-- 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..5f05025b41 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..c6e94fe4ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +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. +-/ + +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..b1b1aabf72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +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. +-/ + +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..5cea3da720 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..e2bee92299 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +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. +-/ + +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..190bfede8f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +universe u + +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' } + +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 + +/-- 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..c07f9dc1da --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison +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. +-/ + +open scoped Classical NumberField IsMulCommutative +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 := + GlobalClassFieldTheory.IdealClassFieldTheory.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..625d4e9fea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +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. +-/ + +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..4370179e1e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.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 +-/ + +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. +-/ + +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..aeab4ad266 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +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 + +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] + +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)) + +/-- 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..ea15e8c65a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..35842bdd07 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +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. +-/ + +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..2467cd7b1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk +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. +-/ + +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..20329f5e5a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +/-- 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..7f3a73aaa6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.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 +-/ + +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. +-/ + +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..bb42b8bb4d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv +/-! +# Evaluation of a ray-class subgroup quotient isomorphism + +The quotient isomorphism retains the prescribed Artin normalization. +-/ + +open scoped NumberField + +noncomputable section + +namespace ClassFieldTheory + +universe u + +/-- A ray class maps to its original Artin value under the induced quotient isomorphism. -/ +@[simp] +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..9b4735c11c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +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. +-/ + +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..6ec2e61b6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding +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. +-/ + +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..bfdc7a709e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +/-! +# Monotonicity of local higher-unit groups +-/ + +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..8231fecb6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +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. +-/ + +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..6a1d37dbbc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership +import Mathlib.RingTheory.Ideal.Operations +import Mathlib.RingTheory.LocalRing.Basic +import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic +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. +-/ + +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..242280fc46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +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. +-/ + +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..536ff53a9c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic +/-! +# The zeroth local higher-unit group +-/ + +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..7ec2e53ba4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +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. +-/ + +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..2a6b719c81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +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. +-/ + +open scoped Classical NumberField + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +universe u + +/-- 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..67037bab33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique +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..b08571059c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv +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..1c4e5498b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime +import Mathlib.NumberTheory.NumberField.Basic +import Mathlib.NumberTheory.RamificationInertia.Unramified +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. +-/ + +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..e2e0376510 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +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. +-/ + +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..86ca2a6169 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import Mathlib.NumberTheory.RamificationInertia.Unramified +import Mathlib.RingTheory.DedekindDomain.Factorization +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. +-/ + +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..55ae2e6d74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.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 +-/ + +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. +-/ + +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..df26703304 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import Mathlib.FieldTheory.Finite.Basic +import Mathlib.NumberTheory.RamificationInertia.Unramified +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`. +-/ + +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..a5f1a65baa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison +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. +-/ + +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..0c320500df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +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.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig 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..54efc06f95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +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. +-/ + +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..35d96ac14e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +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..d2c838d42c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +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. +-/ + +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..f6e1539536 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..b55e411b36 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership +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. +-/ + +open scoped Classical NumberField +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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..5ff48c9b4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.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 +-/ + +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. +-/ + +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..afcee2037f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists +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. +-/ + +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..ded04be8ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists +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. +-/ + +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..9ed217a9ca --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField +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. +-/ + +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..fbdef73b57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +open scoped NumberField + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- 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 := + SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall 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 (SmallHilbertClassFieldComparison.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..889c3c19c4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +import Mathlib.NumberTheory.NumberField.ClassNumber +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. +-/ + +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..3a306581a8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +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. +-/ + +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..024e4f506a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +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..0df873ba17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +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. +-/ + +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..2a8b4b01f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +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. +-/ + +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..53d2ef1de3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +open scoped NumberField + +noncomputable section + +namespace ClassFieldTheory + +open NumberField IsDedekindDomain + +/-- 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 GlobalClassFieldComparison.finitePrime_splitsCompletelyInSmallHilbertClassField_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..3129a4322f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension +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. +-/ + +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..d099de2bac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.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 +-/ + +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. +-/ + +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..6abfaa067f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +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. +-/ + +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..87a4bfe81a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin +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..50a22d6496 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity +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..ba538d4536 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity +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. +-/ + +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..019f0a0da1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +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`. +-/ + +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..7c5f53e9ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.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 +-/ + +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. +-/ + +open scoped NumberField + +noncomputable section + +namespace ClassFieldTheory + +universe u v + +/-- The quotient isomorphism evaluates to the original Artin map. -/ +@[simp] +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..6d0bb33f34 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import Mathlib.Algebra.Algebra.Equiv +import Mathlib.FieldTheory.KrullTopology +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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] [NumberField 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 := + GlobalClassFieldTheory.Reciprocity.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..cb92089cec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.NumberField.AdeleRing +import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 [GlobalClassFieldTheory.Reciprocity.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..2710bcc25a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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) := + GlobalClassFieldTheory.GlobalClassFields.rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + m a hprime (IdeleGroup.finitePlaceIdeleClass v x) + _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + exact DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.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..1c7e747cc4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +import Mathlib.Algebra.Algebra.Equiv +import Mathlib.FieldTheory.KrullTopology +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 : + ∀ (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 ι : (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) := + GlobalClassFieldTheory.GlobalClassFields.rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + m a hprime (IdeleGroup.finitePlaceIdeleClass v x) + _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom + K L v x := by + exact DFunLike.congr_fun + (GlobalClassFieldTheory.Reciprocity.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 := by + intro σ τ hστ + have hD : eD.symm (eAut.symm σ) = eD.symm (eAut.symm τ) := by + apply Subtype.coe_injective + exact hστ + exact eAut.symm.injective (eD.symm.injective hD) + 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 := by + constructor + · intro hx + rw [hx, map_one] + · intro hx + apply hTransportInj + simpa only [map_one] using hx + _ ↔ 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..80f875da5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity +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. +-/ + +open scoped NumberField TensorProduct +open NumberField IsDedekindDomain + +noncomputable section + +namespace ClassFieldTheory + +/-- 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 [GlobalClassFieldTheory.Reciprocity.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..38841cf306 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +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. +-/ + +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..542af22afb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity +import Mathlib.FieldTheory.AbsoluteGaloisGroup + +/-! # Topological Global Reciprocity -/ +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..4fffc59d26 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +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..af4077a0fe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter +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..1c825c9e20 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..c97d60e09d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +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. +-/ + +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..8be526db82 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf +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. +-/ + +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..c47df794c7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import Mathlib.Order.Monotone.Basic +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. +-/ + +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..d589fa1e67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +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. +-/ + +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..f067326cf1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import Mathlib.NumberTheory.LocalField.Basic +/-! # The Herbrand function is a right inverse -/ + +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..6b1410bd29 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +/-! # Herbrand values at natural lower indices -/ + +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..7a82001424 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import Mathlib.NumberTheory.LocalField.Basic +/-! # The inverse Herbrand function is a left inverse -/ + +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..c7ecf270b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf +import Mathlib.Algebra.Group.Subgroup.Ker +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. +-/ + +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..1a19d5eca4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.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 +-/ + +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. +-/ + +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..05e61d62a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone +import Mathlib.FieldTheory.Fixed +import Mathlib.RingTheory.Filtration +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. +-/ + +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..518a737473 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.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 +-/ + +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. +-/ + +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..4e545ebe90 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.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 +-/ + +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. +-/ + +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..2c1ccacb6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +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. +-/ + +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..754a7e485e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.Valuation.Extension +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. +-/ + +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] + [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 (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..9a2dabe770 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +/-! # Real lower groups at natural indices -/ + +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..eae17ccefa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.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 +-/ + +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. +-/ + +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..1372268966 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +/-! +# The right-limit upper ramification group +-/ + +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..3b1c869f78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical +/-! # Antitonicity of the canonical upper filtration -/ + +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..068cfd11aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +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`. +-/ + +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..a0d2f39652 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical +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. +-/ + +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..d38c51a432 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +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..f87ecb24b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective +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..c672a39692 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +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. +-/ + +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..bfa3f00036 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +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. +-/ + +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..b74a4cca67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity +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. +-/ + +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..c7974404fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import Mathlib.GroupTheory.FiniteAbelian.Duality +import Mathlib.RingTheory.RootsOfUnity.EnoughRootsOfUnity +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. +-/ + +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..1b1e325b46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.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 +-/ + +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ˣ`. +-/ + +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..fcbe4b1d05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +/-! +# Hilbert-pairing symbol multiplication in the second argument + +The symbol is multiplicative in its second representative. +-/ + +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..e43bb304a9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula +import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv +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. +-/ + +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..95088fe388 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +import Mathlib.Algebra.Algebra.Pi +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. +-/ + +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..959f89103f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree +import Mathlib.RingTheory.Etale.StandardEtale +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. +-/ + +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..c87993cc23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +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. +-/ + +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..19ac685385 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +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. +-/ + +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..24adbd230c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +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. +-/ + +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..e6ff9cd5cd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree +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`. +-/ + +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..6ac3f6a4d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +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. +-/ + +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..8575eeda32 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +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. +-/ + +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..49c2e67bcc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra +import Mathlib.RingTheory.AdjoinRoot +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`. +-/ + +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..7d3ffbfa45 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale +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`. +-/ + +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..6bf2796a8b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition +import Mathlib.FieldTheory.KummerExtension +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. +-/ + +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..a3fd12ac79 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic +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`. +-/ + +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..4692217fe8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue +import Mathlib.FieldTheory.Galois.Basic +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)`. +-/ + +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..407934d983 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +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. +-/ + +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..8560e1bbc0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..c4142baacc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +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. +-/ + +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..e50ddef249 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm +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. +-/ + +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..f5afe8690f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite +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. +-/ + +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..9875975786 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.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 +-/ + +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. +-/ + +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..e09db7f597 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.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 +-/ + +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. +-/ + +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..af106f4107 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +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. +-/ + +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..8a5e5cd8b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Inversion of power classes + +The quotient map to power classes preserves inverses. +-/ + +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..fa4cafacda --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Multiplication of power classes + +The quotient map to power classes preserves multiplication. +-/ + +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..9573e753aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass +/-! +# Powers of power classes + +The quotient map to power classes preserves powers. +-/ + +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..dbed9da73a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..3c534286fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.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 +-/ + +import Mathlib.NumberTheory.Cyclotomic.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel +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. +-/ + +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..16724ce9d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +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..b3520769c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower +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..36119ef010 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..b89b94657b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..cf5796aaa4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv +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. +-/ + +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..6f9f775fbc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +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. +-/ + +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..f5b914d772 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +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. +-/ + +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..97c4aa9a4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..e43bc5b1e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..c6ef379769 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +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. +-/ + +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..df8fedd6e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.RingTheory.Valuation.Discrete.Basic +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. +-/ + +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..0fec1c14f7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.RingTheory.Valuation.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +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. +-/ + +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 := + LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension.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..7f95f29c62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.RingTheory.Valuation.Discrete.Basic +import Mathlib.RingTheory.Valuation.Extension +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. +-/ + +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..53f72b6def --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +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. +-/ + +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..a9fc4f4d58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.Topology.Algebra.ContinuousMonoidHom +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. +-/ + +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..656c647e74 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin +import Mathlib.FieldTheory.KrullTopology +import Mathlib.Topology.Algebra.Constructions +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. +-/ + +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..a54d2cbc04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.FieldTheory.KrullTopology +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.Valuation.ValuativeRel.Basic +import Mathlib.Topology.Algebra.Constructions +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. +-/ + +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] [IsAbelianGalois 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..411089ebb9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +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. +-/ + +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..53cde6ad83 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +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. +-/ + +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..c53b9cfc0a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.Topology.Algebra.ContinuousMonoidHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +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. +-/ + +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..809e11a63f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization +import Mathlib.FieldTheory.Galois.Abelian +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import Mathlib.Topology.Algebra.ContinuousMonoidHom +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. +-/ + +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..9e48073c5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.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 +-/ + +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. +-/ + +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..91924676f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange +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..c872f92aff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm +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..b4efca9d22 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +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.completionTensorDecomposition_extensionFintype + (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.completionTensorDecomposition_left + (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..b940ad8ae3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +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.completionTensorDecomposition_extensionFintype + (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.completionTensorDecomposition_left + (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..e6afae61c1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +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. +-/ + +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] [NumberField 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..c478d01e48 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +import Mathlib.Algebra.Group.DivInvMonoid +import Mathlib.FieldTheory.Galois.Basic +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`. +-/ + +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..92a34e0764 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm +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`. +-/ + +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] [NumberField 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..474c43b8a3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +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. +-/ + +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..40c65f80e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm +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. +-/ + +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..a712c12461 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.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 +-/ + +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +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] [Nontrivial 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..cb1e156d80 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +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. +-/ + +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..85ba1611e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers +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..5c89ba88a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +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..267e139537 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.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 +-/ + +import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Galois Cohomology -/ +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 cyclic_H1_iso_HminusOne {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 := 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) := + cyclic_H1_iso_HminusOne (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..99d6643924 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits +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..7d79eb25f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +import Mathlib.RepresentationTheory.Homological.GroupHomology.FiniteCyclic + +/-! # Herbrand Finiteness -/ +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 σ)] : + ∃ hB : HerbrandQuotientDefined G B σ, + @herbrandQuotient G B _ _ _ _ σ hB.1 hB.2 = + 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 σ)] : + ∃ hC : HerbrandQuotientDefined G C σ, + herbrandQuotient (G := G) (A := B) σ = + herbrandQuotient (G := G) (A := A) σ * + @herbrandQuotient G C _ _ _ _ σ hC.1 hC.2 := 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 σ)] : + ∃ hA : HerbrandQuotientDefined G A σ, + herbrandQuotient (G := G) (A := B) σ = + @herbrandQuotient G A _ _ _ _ σ hA.1 hA.2 * + 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..5496812b8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +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..74a4ce074e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean @@ -0,0 +1,1719 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Algebra.BigOperators.Group.Finset.Basic +import Mathlib.Data.Set.Finite.Range +import Mathlib.GroupTheory.Coset.Card +import Mathlib.GroupTheory.GroupAction.Basic +import Mathlib.GroupTheory.Index +import Mathlib.GroupTheory.OrderOfElement +import Mathlib.GroupTheory.QuotientGroup.Basic +import Mathlib.GroupTheory.SpecificGroups.Cyclic + +/-! # Basic -/ +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] [Finite X] (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] [Finite 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 := 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) := 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..9ef41c8a43 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +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. +-/ + +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 + +private 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 + +private noncomputable instance + (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 + +private 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 + +private 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 + [Finite (HerbrandH0 G A)] + [Finite (HerbrandH0 G B)] : + letI : Finite (HerbrandH0 G (A × B)) := + herbrandH0ProdFinite A B + 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) + [Finite (HerbrandHMinusOne G A σ)] + [Finite (HerbrandHMinusOne G B σ)] : + letI : Finite (HerbrandHMinusOne G (A × B) σ) := + herbrandHMinusOneProdFinite A B σ + 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..22bddf9656 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -0,0 +1,535 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic + +/-! # Cardinality -/ +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 [Rep.FiniteCyclicGroup.moduleCatChainComplex, + HomologicalComplex.alternatingConst, hj] + exact (subCompNormMap σ f hf).comm₂₃ + · simp [Rep.FiniteCyclicGroup.moduleCatChainComplex, + HomologicalComplex.alternatingConst, 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..56dfb81dfa --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality + +/-! # Core -/ +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] + +/-- Herbrand-quotient theory the Herbrand-quotient definition: the Herbrand quotient of the actual +low-degree multiplicative Tate quotients. The finiteness assumptions prevent +`Nat.card` from silently taking the value `0` on infinite quotients. -/ +noncomputable def herbrandQuotient (σ : G) + [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] : ℚ := + (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..8b705f5a56 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +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. +-/ + +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..6802df26d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.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 +-/ + +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`. +-/ + +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..26bf74b145 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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)] + +local instance : + 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..2bc0bc2b21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +/-! Comparisons between arithmetic Herbrand quotient presentations and mathlib Tate cohomology. -/ + +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 _ _ + +private 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 + +/-- 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 (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 + +private 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 (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 noncomputable def tateHMinusOneIsoHerbrandHMinusOne_of_commGroup + {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 (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] + 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 tateHMinusOneIsoHerbrandHMinusOne_of_commGroup σ 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..eb4f903493 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -0,0 +1,1189 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions +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. +-/ + +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 σ + +/-- In a cyclic group, `σ^[G:H]` generates `H`. -/ +theorem zpowers_pow_index_eq (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + Subgroup.zpowers (σ ^ H.index) = H := by + 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 + +/-- The canonical element `σ^[G:H]` generates `H`. -/ +theorem subgroupGenerator_generates (H : Subgroup G) (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + ∀ h : H, h ∈ Subgroup.zpowers (subgroupGenerator H σ) := by + 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. -/ +@[simp] +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] + +local instance : 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] + +local instance : Fintype H := Fintype.ofFinite H + +local instance : 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 + +/-- The derived element `σ^[G:H]` generates `H`. -/ +theorem subgroupGeneratorOfGenerator_generates (σ : G) + (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) : + ∀ h : H, + h ∈ Subgroup.zpowers + (subgroupGeneratorOfGenerator H σ hgen) := by + 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..ff6fc07418 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -0,0 +1,2276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.NormalBasis +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +/-! Provides the public normal-basis lattice declarations used in Herbrand computations. -/ + +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 chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule + {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, + chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule + (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..830a198a27 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand +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..60009e8dec --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean @@ -0,0 +1,891 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.Module.ZLattice.Basic +import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient +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. +-/ + +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 + +/-- 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 + (ρ : 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 + 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 +theorem basisEquivFunL_symm_coordinatePermutation + (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 + 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 + +/-- 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 + (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 + 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..e0c0edff8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -0,0 +1,1004 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice +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. +-/ + +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 +/-- Coordinates in a basis permuted by `G` transform by the +contragredient coordinate permutation. -/ +theorem basisEquivFun_symm_intCoordinatePermutation + (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 + 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] + [IsZLattice ℝ 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 ι] [DecidableEq ι] + (ρ : 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 _ + ∃ h : + HerbrandQuotientDefined + G (Multiplicative L) σ, + @herbrandQuotient + G (Multiplicative L) _ _ _ _ + σ h.1 h.2 = + ∏ ω : MulAction.orbitRel.Quotient G ι, + (Fintype.card + (permutationOrbitStabilizer ω) : ℚ) := by + 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) _ _ _ _ + σ hA.1 hA.2 = + @herbrandQuotient + G B _ _ _ _ + σ hB.1 hB.2 := 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..943dfdcc88 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -0,0 +1,1463 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness +import Mathlib.Data.ZMod.QuotientGroup +import Mathlib.GroupTheory.GroupAction.Quotient +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. +-/ + +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] + +/-- Degree-zero Tate cohomology of a finite integral permutation module +is finite for a cyclic generator. -/ +theorem permutationFunctionHerbrandH0Finite + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + Finite + (HerbrandH0 G (ι → Multiplicative ℤ)) := by + 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) + +/-- Degree-minus-one Tate cohomology of a finite integral permutation +module is finite for a cyclic generator. -/ +theorem permutationFunctionHerbrandHMinusOneFinite + (σ : G) + (hgen : ∀ g : G, + g ∈ Subgroup.zpowers σ) : + letI _functionAction : + MulDistribMulAction G (ι → Multiplicative ℤ) := + permutationFunctionMulDistribMulAction + Finite + (HerbrandHMinusOne G + (ι → Multiplicative ℤ) σ) := by + 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) σ + +/-- 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 + (σ : 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 + 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 + +@[simp] +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 + let hA := + finiteIndexStableSubgroup_ambientHerbrandQuotientDefined + B hstable σ hgen hB + @herbrandQuotient G A _ _ _ _ + σ hA.1 hA.2 = + @herbrandQuotient G B _ _ _ _ + σ hB.1 hB.2 := 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 _ _ _ _ + σ hA.1 hA.2 = + @herbrandQuotient G B _ _ _ _ + σ hB.1 hB.2 + calc + @herbrandQuotient G A _ _ _ _ + σ hA.1 hA.2 = + @herbrandQuotient G B _ _ _ _ + σ hB.1 hB.2 * + @herbrandQuotient G (A ⧸ B) + _ _ _ _ σ hQ.1 hQ.2 := + hmult + _ = @herbrandQuotient G B _ _ _ _ + σ hB.1 hB.2 := 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..d090c2066d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +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..e1b8cde177 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +/-! Provides the public declarations in the `CyclicCohomology.Herbrand.PrincipalUnits.QuotientReps` Lean module. -/ + +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..c6fda048ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +/-! Provides the public declarations in the `CyclicCohomology.Herbrand.PrincipalUnits.QuotientTower` Lean module. -/ + +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..b413abf909 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.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 +-/ + +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. +-/ + +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)] + +local instance : + 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..7a8831d0dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.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 +-/ + +/-! +# 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. +-/ +/-- 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..8770ee999d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.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 +-/ + +import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic +import Mathlib.RepresentationTheory.Invariants +import Mathlib.Topology.Algebra.Group.ClosedSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +/-! # Norm Kernel Vanishing -/ +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..8c7313998c --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.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 +-/ + +import Mathlib.RepresentationTheory.Homological.FiniteCyclic +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. +-/ + +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..443300f836 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main +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..8d535c41a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.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 +-/ + +import Mathlib.RepresentationTheory.Invariants +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. +-/ + +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 + +private 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 + +private 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 := 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..08bdd09274 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.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 +-/ + +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. +-/ + +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..cf956f7099 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants +/-! Provides the public declarations in the `CyclicCohomology.TateH0.NormImage` Lean module. -/ + +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..25f82f72dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel +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..8fbc30289b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -0,0 +1,490 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.MonoidAlgebra.Lift +import Mathlib.Algebra.Module.BigOperators +import Mathlib.GroupTheory.Abelianization.Defs +import Mathlib.RingTheory.TwoSidedIdeal.Kernel +import Mathlib.RingTheory.TwoSidedIdeal.Operations +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. +-/ + +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 + show + (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 + show + Multiplicative.toAdd + (deltaAbelianization G (deltaPreimage G x)) = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + rw [deltaPreimage, map_prod] + simp_rw [map_zpow, deltaAbelianization_of] + show + ∑ g ∈ x.coeff.support, + x.coeff g • deltaClass G g = + QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ + show + ∑ 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] + show + 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] + +@[simp] +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..b29b734b6c --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.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 +-/ + +import Mathlib.GroupTheory.DoubleCoset +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. +-/ + +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..7d607c7eb9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.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 +-/ + +import Mathlib.GroupTheory.Abelianization.Defs +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. +-/ + +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) + +@[simp] +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 [subgroupQuotientEquivQuotientOfSupEqTop, + QuotientGroup.quotientInfEquivProdNormalQuotient, + QuotientGroup.quotientInfEquivProdNormalizerQuotient, + QuotientGroup.quotientKerEquivOfSurjective, + QuotientGroup.quotientKerEquivOfRightInverse, + QuotientGroup.kerLift_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) + +@[simp] +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..28cc9230b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.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 +-/ + +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. +-/ + +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..f9cf0d218d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.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 +-/ + +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. +-/ + +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..fdb764da78 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +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..b5595ee8da --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -0,0 +1,1025 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +import Mathlib.Algebra.MonoidAlgebra.MapDomain +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. +-/ + +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] + show 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] + show + 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 + show + (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. -/ +@[simp] +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 + show + 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] + show + 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] + +@[simp] +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] + show + 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..9377d3b597 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -0,0 +1,1291 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation +import Mathlib.GroupTheory.Finiteness +import Mathlib.GroupTheory.Transfer +import Mathlib.GroupTheory.Torsion +import Mathlib.GroupTheory.FreeGroup.GeneratorEquiv +import Mathlib.LinearAlgebra.Dimension.Localization +import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +import Mathlib.LinearAlgebra.FreeModule.Finite.CardQuotient +import Mathlib.LinearAlgebra.FreeModule.PID +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. +-/ + +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 + show + 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 + show + 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] [DecidableEq 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 + 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*} [Fintype X] + (φ : FreeGroup X →* G) + [FiniteIndex (commutator G)] : + Module.finrank ℤ (presentationLinearMap φ).ker = + Module.finrank ℤ (FreeAbelianGroup X) := by + 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) + +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]) + +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 + +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 + +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*) [Group Q] [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] [Fintype Q] + (z : IntegralGroupRing Q) + (hz : ∀ q : Q, + MonoidAlgebra.single q 1 * z = z) : + z = z.coeff 1 • groupNormElement Q := by + 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 + show + 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 +theorem generator_mul_section_norm_mem_mixed + (k : X) : + groupRingDelta (φ (FreeGroup.of k)) * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + 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 +theorem word_mul_section_norm_mem_mixed + (w : FreeGroup X) : + groupRingDelta (φ w) * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + 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 +theorem delta_mul_section_norm_mem_mixed + (g : G) : + groupRingDelta g * + abelianizationRingSection + (groupNormElement (Abelianization G)) ∈ + mixedAugmentationProduct (commutator G) := by + obtain ⟨w, rfl⟩ := hφ g + exact word_mul_section_norm_mem_mixed φ hφ w + +include hφ in +theorem delta_mul_transversalNormElement_mem_mixed + (T : (commutator G).LeftTransversal) (g : G) : + groupRingDelta g * + transversalNormElement (commutator G) T ∈ + mixedAugmentationProduct (commutator G) := by + 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..5cf1caaf07 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +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..0975983ea5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField +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..242c274d3f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField + +/-! # Kummer Abelian Assembly -/ +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`. -/ +@[simp] +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 + [IsTopologicalGroup G] + (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..fbb19936dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -0,0 +1,314 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.GroupTheory.FiniteAbelian.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator + +/-! # Kummer Abelian Cyclic Factors -/ +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 [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..e22ef897d2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Cyclic Operator -/ +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..2c5dd54163 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Delta -/ +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..dad5cc05ab --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +/-! # Kummer Fixed Field -/ +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..5b8ce7f5e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator + +/-! # Kummer Global Operator -/ +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..6d095fe824 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +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..7714f337d3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +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..d1b8d3218f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +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..4c52ba055e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition +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. +-/ + +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..edb9f1955f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk +/-! +# The cyclotomic profinite-unit torsion quotient +-/ + +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..316578178b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +/-! +# The profinite-unit product decomposition +-/ + +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..73c8979c7e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition +/-! +# Density of torsion in the finite profinite-unit factor +-/ + +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..8105329903 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local +/-! +# Compiled finite/free collection stage of the profinite-unit decomposition +-/ + +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..c64a9c6b37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate +/-! +# Finite-order local coordinates of profinite units +-/ + +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..0041c3ea52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient +/-! +# Local coordinates of the profinite-unit decomposition +-/ + +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..af8f42387d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree +/-! +# Compiled free-coordinate gathering stage of the profinite-unit decomposition +-/ + +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..fc2580b895 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic +/-! +# Compiled local stage of the profinite-unit decomposition +-/ + +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..ab2eabf98e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather +/-! +# Compiled final swap stage of the profinite-unit decomposition +-/ + +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 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..99ab73867d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion +/-! +# Torsion quotients of a profinite-integer product decomposition +-/ + +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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..4310d90d7e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv +/-! +# Evaluation of the torsion-quotient equivalence +-/ + +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..bbc7d345a0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +import Mathlib.NumberTheory.Cyclotomic.CyclotomicCharacter +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. +-/ + +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..49a65417db --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +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. +-/ + +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..dd02552732 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.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 +-/ + +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. +-/ + +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..b421c0a4b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField +import Mathlib.FieldTheory.Galois.Profinite +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. +-/ + +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..fe6c0f90b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.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 +-/ + +import Mathlib.FieldTheory.Galois.Abelian +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. +-/ + +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..5b378edc0c --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +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. +-/ + +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..57265c4633 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.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 +-/ + +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. +-/ + +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..5901a32250 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.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 +-/ + +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. +-/ + +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..2bdf001d65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.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 +-/ + +import Mathlib.GroupTheory.FiniteAbelian.Duality +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. +-/ + +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..2ac8c8761b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.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 +-/ + +import Mathlib.GroupTheory.FiniteAbelian.Basic +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. +-/ + +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 finiteSupportKummerQuotient_commGroupInstance + (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..d1fc56ef2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.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 +-/ + +import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 +/-! +# Galois cohomology for Kummer theory + +Hilbert 90 and multiplicative cocycle statements used by the concrete Kummer correspondence. +-/ + +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..098b78d913 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.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 +-/ + +import Mathlib.Topology.Algebra.ContinuousMonoidHom +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. +-/ + +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. -/ +@[simp] 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..c8e72f43b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.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 +-/ + +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. +-/ + +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..d7609d998e --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +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 `Δ`. +-/ + +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..658d5c7fee --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean @@ -0,0 +1,508 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Profinite +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse +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. +-/ + +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..ab50051794 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup +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. +-/ + +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..6327614166 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +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. +-/ + +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 := + RamificationTheory.DiscreteValuationField.ValuedExtension.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..629fd86f21 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +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. +-/ + +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..3726d38ab6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.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 +-/ + +import Mathlib.FieldTheory.IsSepClosed +import Mathlib.FieldTheory.Galois.Abelian +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`. +-/ + +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 + [IsSepClosure K Omega] + (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 + [IsSepClosure K Omega] + (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..b3bb1a6502 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.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 +-/ + +import Mathlib.FieldTheory.Galois.Infinite +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`. +-/ + +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 radicalQuotient_commGroupInstance : 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..121512a436 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +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. +-/ + +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 restrictedRadicalQuotient_commGroupInstance + (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..3641a30ae7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology +/-! +# Root characters for Kummer theory + +Support API for root-quotient constructions in concrete Kummer extensions. +-/ + +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. -/ +@[simp] 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. -/ +@[simp] 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..56a494af7d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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..36b4369b8f --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.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 +-/ + +import Mathlib.Algebra.Group.Equiv.TypeTags +import Mathlib.Algebra.Module.ZMod +import Mathlib.Data.Finsupp.Fintype +import Mathlib.Data.ZMod.Basic +import Mathlib.FieldTheory.IntermediateField.Basic +import Mathlib.RingTheory.LocalRing.Module +/-! +# Prime-power kernel coordinates + +Linear-algebraic coordinates for kernels of surjections between finite free modules over `ZMod (p ^ v)`. +-/ + +open scoped Classical IsMulCommutative + +noncomputable section + +namespace KummerTheory + +/-- 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 + +/-- 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 + +/-- 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] + +/-- 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 } + +/-- 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) + +/-- 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 } + +/-- 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 + +/-- 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 _)⟩ + +/-- 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..498b1a85c3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.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 +-/ + +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. +-/ + +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..7ac6e55b64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import Mathlib.GroupTheory.Coset.Card +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. +-/ + +noncomputable section + +namespace KummerTheory + +open scoped BigOperators + +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 indexMap : Q × Gal(E / K) → mu := fun p => + Quotient.out p.1 * chi p.2 + have indexMap_injective : Function.Injective indexMap := by + rintro ⟨q, sigma⟩ ⟨r, tau⟩ h + have hchi_sigma : chi sigma ∈ H := ⟨sigma, rfl⟩ + have hchi_tau : chi tau ∈ H := ⟨tau, rfl⟩ + have hq : q = r := by + have hm := congrArg + (fun z : mu => (QuotientGroup.mk z : Q)) h + rw [QuotientGroup.mk_mul_of_mem _ hchi_sigma, + QuotientGroup.mk_mul_of_mem _ hchi_tau] at hm + simpa only [Quotient.out_eq'] using hm + subst r + have hsigma : sigma = tau := by + apply hchi + exact mul_left_cancel h + subst tau + rfl + have indexMap_surjective : Function.Surjective indexMap := by + intro z + let q : Q := QuotientGroup.mk z + have hrel : (Quotient.out q) ⁻¹ * z ∈ H := by + apply QuotientGroup.leftRel_apply.mp + exact @Quotient.exact' mu (QuotientGroup.leftRel H) _ _ + (by simpa only [q] using Quotient.out_eq' q) + change (Quotient.out q) ⁻¹ * z ∈ chi.range at hrel + rcases hrel with ⟨sigma, hsigma⟩ + refine ⟨(q, sigma), ?_⟩ + change Quotient.out q * chi sigma = z + rw [hsigma] + simp + let indexEquiv : Q × Gal(E / K) ≃ mu := + Equiv.ofBijective indexMap ⟨indexMap_injective, indexMap_surjective⟩ + 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..f452acfbde --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits +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..a086ebf447 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +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. +-/ + +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..c5fa3ce5cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Topology.Neighborhoods +import Mathlib.Algebra.Group.Subgroup.Ker +import Mathlib.GroupTheory.Index +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +/-! # Profinite Integer -/ +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)`. +-/ +@[simp] +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`. -/ +@[simp] +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`. -/ +@[simp] +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..618deb46ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.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 +-/ + +import Mathlib.Data.ZMod.Basic +import Mathlib.Topology.Instances.ZMod +import Mathlib.Topology.Algebra.Ring.Basic +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration + +/-! # Profinite Integer Core -/ +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 + +private structure ZHatIndex where + modulus : ℕ + positive : 0 < modulus + +private instance (i : ZHatIndex) : NeZero i.modulus := + ⟨Nat.ne_of_gt i.positive⟩ + +private def zHatIndex (n : ℕ) (hn : 0 < n) : ZHatIndex := + ⟨n, hn⟩ + +private abbrev ZHatAmbient : Type 0 := + ∀ i : ZHatIndex, ZMod i.modulus + +private 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 + +private def zHatIntegerSubring : Subring ZHatAmbient := + zHatDiagonal.range + +private 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..333fd925ea --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +import Mathlib.Data.ZMod.QuotientRing +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. +-/ + +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..6f36fb7ad1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.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 +-/ + +import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +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. +-/ + +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..778f5e266b --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.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 +-/ + +import Mathlib.Topology.Algebra.ClopenNhdofOne +import Mathlib.Topology.Algebra.ContinuousMonoidHom + +/-! # Topological Generation -/ +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..5112a62f6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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..19ae48cd63 --- /dev/null +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.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 +-/ + +import Mathlib.Topology.Algebra.ClopenNhdofOne +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. +-/ + +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] [T2Space 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] [IsTopologicalGroup 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..42d121ea9d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ProCGroups.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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..9285975b17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.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 +-/ + +import Mathlib.Algebra.Group.Action.Basic +import Mathlib.Algebra.Group.Pi.Basic +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. +-/ + +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..df48174de2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification +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..27fe852345 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic +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..d3aa7bb05f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries +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..a3d825138a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean @@ -0,0 +1,743 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Data.Nat.Factorization.Basic +import Mathlib.Data.Nat.Prime.Basic +import Mathlib.Algebra.EuclideanDomain.Basic +import Mathlib.Algebra.Order.Field.Power +import Mathlib.Analysis.SpecialFunctions.Log.Base +import Mathlib.NumberTheory.Padics.PadicVal.Basic +import Mathlib.Topology.Algebra.Order.Field +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. +-/ + +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 + [Fact p.Prime] (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 + [Fact p.Prime] (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..68159ffe81 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -0,0 +1,521 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension +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`. +-/ + +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 := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + +/-- 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, + ψ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u) + (hψa : ψ a = 1) : + ψ = fieldUnitLogHomWithUniformizerValue F + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ + (uniformizerLogValueKilling F + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ a) := by + let d := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 [CompleteDVF.higherPrincipalUnitGroup.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 [CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + rw [L.map_mul, L.map_mul, L.map_zpow] + rw [toAdd_mul, toAdd_mul, toAdd_zpow] + have hLprincipal : + L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) + · intro y + exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + (F := F) ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + y + · exact (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ϖ + +/-- 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 + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 + CompleteDVF.higherPrincipalUnitGroup.continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRestrict + 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) + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm + rw [hdom, hcod] + exact hcontinuousRestricted + +/-- 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 (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 = + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 + (ψ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..0b11ed91d0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +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. +-/ + +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)] [CharZero K] : ℕ := + 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..6a3db64c5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.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 +-/ + +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. +-/ + +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`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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 + +/-- 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 + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ c + (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u := by + apply fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition + (F := F) + (d := + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) + (φ := φ) (c := c) (u := u) + simp [CompleteDVF.higherPrincipalUnitGroup.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] [CharZero K] + (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..5614210f39 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.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 +-/ + +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. +-/ + +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..44b1470771 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -0,0 +1,747 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms + +/-! # Log Exp Additivity -/ +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 + [Algebra ℚ K] (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_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_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 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_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_ofWithZeroValuation_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..165c1cdfe2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean @@ -0,0 +1,785 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity + +/-! # Log Exp Composition -/ +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..2bba84ce2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -0,0 +1,504 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 + [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 + 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 principalUnitExpLogContinuousMulEquivOfExact_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 : ℚ)) + (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 + { __ := + principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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..692951e947 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +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..a3b423e3e9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.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 +-/ + +import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms +/-! +Establishes convergence and summability of the exponential series on sufficiently deep +nonarchimedean ideals. +-/ + +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_expSeriesTermField_cauchyProduct_expSeriesField_mul_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 + 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_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_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..924c15595e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean @@ -0,0 +1,431 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts + +/-! # Formal Core -/ +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..0f03d935bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +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..44966f17a7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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..d22841b82a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.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 +-/ + +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`. +-/ + +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..6dd1802abb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.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 +-/ + +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. +-/ + +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..6ba7a74254 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean @@ -0,0 +1,267 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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..fb4943751a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.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 +-/ + +import Mathlib.RingTheory.PowerSeries.Log +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. +-/ + +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 [ih] 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..5a5b4069d6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean @@ -0,0 +1,386 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition +import Mathlib.Algebra.BigOperators.Ring.Finset +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. +-/ + +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..5c6a784183 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -0,0 +1,1587 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore +/-! +Proves the formal combinatorial identities behind additivity of the logarithm on products of +principal units. +-/ + +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 formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_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 [formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_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..8e9efcca63 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -0,0 +1,1404 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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] [ContinuousNeg 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 principalUnitLogSeriesHomOfTendstoFieldDefect_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))) : + (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 +(principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation (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 + (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : + fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ z = φ z.1.2 := + rfl + +/-- +Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ ((ζ, 1), (1 : +Multiplicative ℤ)) = 1`. +-/ +@[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_root + (F : CompleteDVF K) [Finite F.residueField] + {A : Type*} [AddCommGroup A] + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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`. +-/ +@[simp] 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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x : Kˣ} + (hx : + e (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + u), (1 : Multiplicative ℤ)) = x) : + fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ u := by + simpa using + fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq + (F := F) e φ + (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (m : ℤ) {x : Kˣ} + (hx : + e (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) + (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + fieldUnitLogHomOfPrincipalUnitHom + (F := F) + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (ζ : F.valuationSubringˣ)) = 1 := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition + (F := F) + (e := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) + (φ := φ) (ζ := ζ) + simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (u : F.valuationSubringˣ)) = φ u := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition + (F := F) + (e := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) + (φ := φ) (u := u) + simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) φ + (Units.mk0 (π : K) hπ.ne_zero) = 1 := by + apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition + (F := F) + (e := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ) + (φ := φ) (m := 1) + simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) + [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] + {p : ℕ} [Fact p.Prime] + [Finite (completeDVFOfWithZeroValuation v).residueField] + (e : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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 `fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation`, +with the decomposition chosen canonically from a uniformizer. -/ +noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (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 := + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (v := v) (p := p) + (e := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (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) : + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (u : _)) = + principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (v := v) (p := p) hnK hnval hcomplete hdefect u := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_of_completeDVF_principal + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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 + (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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))) + (ζ : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup + (completeDVFOfWithZeroValuation v)) : + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (completeDVFOfWithZeroValuation v) (ζ : _)) = 1 := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_root + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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))) + (ζ : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup + (completeDVFOfWithZeroValuation v)) : + Multiplicative.toAdd + (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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))) : + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (v := v) (p := p) hπ hnK hnval hcomplete hdefect + (Units.mk0 (π : K) hπ.ne_zero) = 1 := by + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer + (F := completeDVFOfWithZeroValuation v) hπ + (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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 + (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (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..47a9b05283 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -0,0 +1,1199 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 + (ValuationTheory.DiscreteValuationField.Valuation.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 := + (ValuationTheory.DiscreteValuationField.Valuation.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..c332c0f2ce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean @@ -0,0 +1,1151 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence +/-! +Establishes convergence and summability of the logarithm series on the nonarchimedean open unit +ball. +-/ + +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..1b0a6ed214 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.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 +-/ + +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. +-/ + +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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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. +-/ +@[simp] 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`. +-/ +@[simp] 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..ee838b07d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -0,0 +1,1276 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +/-! +Restricts the logarithm series to principal units and places its values in the corresponding +additive ideal. +-/ + +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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F n w = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow + F n hn ⟨w0, hw0⟩ := by + intro w w0 hw0eq hw0 + subst w0 + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply] + congr 1 + dsimp + apply Subtype.ext + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val] + apply Units.ext + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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_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) : + (((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_ofWithZeroValuationScaled + (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) + +/-- 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 principalUnitExpLogEquivOfExact_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) + (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 principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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 principalUnitExpLogEquivOfIdealQuotient_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) + (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 := + principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled + (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 principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuationScaled + (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 := + principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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 principalUnitExpLogEquivOfSubMem_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) + (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 := + principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled + (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 principalUnitExpLogMulEquivOfSubMem_ge_ofWithZeroValuationScaled + (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 := + principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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..55fc597fac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.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 +-/ + +import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean +import Mathlib.Topology.Algebra.Valued.WithZeroMulInt +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +/-! +Defines the logarithm and exponential series terms and proves the valuation estimates used in +their convergence arguments. +-/ + +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 [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 [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..33441ada02 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +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. +-/ + +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 + principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuationScaled + (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..fa2acb4958 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +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..2bb1196a79 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import Mathlib.Algebra.CharP.Algebra +import Mathlib.Algebra.CharP.Lemmas +import Mathlib.Data.Rat.Cast.CharZero +import Mathlib.Data.Rat.Lemmas +import Mathlib.FieldTheory.Perfect +import Mathlib.NumberTheory.LocalField.Basic +import Mathlib.NumberTheory.Padics.PadicNumbers +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. +-/ + +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..4b12df3531 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -0,0 +1,1153 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +import Mathlib.Analysis.Normed.Module.FiniteDimension +import Mathlib.RingTheory.LaurentSeries +import Mathlib.RingTheory.Localization.Away.Basic +import Mathlib.RingTheory.PowerSeries.Evaluation +import Mathlib.Topology.Algebra.LinearTopology +import Mathlib.Topology.Algebra.Valued.WithZeroMulInt +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⁻¹]`. +-/ + +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 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + haveI : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + haveI : T2Space F.valuationSubring := + 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := + 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + haveI : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + haveI : T2Space F.valuationSubring := + 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`. +-/ +@[simp] 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := + 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)`. +-/ +@[simp] 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := + 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 := + valuationSubring_isLinearTopology_withIdeal (F := F) + have : CompleteSpace F.valuationSubring := + valuationSubring_completeSpace_withIdeal (F := F) + have : T2Space F.valuationSubring := + 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) + +/-- 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 := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ).fieldRange + +/-- +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⸩) : + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ x ∈ + F.laurentImageSubfield p hcard π hπ := + RingHom.mem_fieldRange_self + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ) x + +/-- 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 _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_surjective + (F := F.toCompleteDVF) p hcard π hπ x with + ⟨y, hy⟩ + exact (RingHom.mem_fieldRange).2 ⟨y, hy⟩ + +/-- 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 + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ) + +/-- +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) = + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (F := F.toCompleteDVF) p hcard π hπ x := by + rfl + +/-- +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`. +-/ +@[simp] 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_algebraMap_C + (F := F.toCompleteDVF) p hcard π hπ a + +/-- +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)`. +-/ +@[simp] 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.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 laurentImageSubfield_nontriviallyNormedField + (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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_rankOne + F.toCompleteDVF + letI : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 laurentImageSubfield_normedAlgebra + (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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfield_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfield_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + letI : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfield_normedAlgebra 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + let : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfield_normedAlgebra 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField + (F.laurentImageSubfield p hcard π hπ) := + F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + let : NormedAlgebra + (F.laurentImageSubfield p hcard π hπ) K := + F.laurentImageSubfield_normedAlgebra 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..6d3a0aa26b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean @@ -0,0 +1,1933 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup + +/-! # Field Norm -/ +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`. +-/ +@[simp] 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`. +-/ +@[simp] 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. -/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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..5570c59c61 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.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 +-/ + +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. +-/ + +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..359d05efe9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.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 +-/ + +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. +-/ + +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..7422c4e67f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -0,0 +1,1337 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +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. +-/ + +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ˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (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ˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + exact + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup + (F := F) V hzero hπV + +/-- +The defining evaluation formula for `fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF` +is `fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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) : + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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ˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF, + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup] + +/-- +Establishes the identity `((CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val +(fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ z) = Multiplicative.toAdd z.2`. +-/ +@[simp] +theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (z : fieldUnitDecompositionFactors F) : + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val + (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ z) = + Multiplicative.toAdd z.2 := by + let V : MultiplicativeIntegerValuation Kˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + y + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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π +(fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ z) = Multiplicative.toAdd z.2`. +-/ +@[simp] +theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer + (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] + {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) + (z : fieldUnitDecompositionFactors F) : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ z) = + Multiplicative.toAdd z.2 := + multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer + F hπ z + +/-- +Establishes the identity `Multiplicative.toAdd +((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).2 = +(CompleteDVF.uniformizerValueExponent F) hπ x`. +-/ +@[simp] +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 + ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).2 = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + have h := + uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer + F hπ + ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x) + simpa using h.symm + +/-- +Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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ˣ) : + ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).2 = + Multiplicative.ofAdd ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := by + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ + have h : + Multiplicative.toAdd ((E.symm x).2) = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + simp [E] + calc + (E.symm x).2 = Multiplicative.ofAdd (Multiplicative.toAdd ((E.symm x).2)) := by + simp + _ = Multiplicative.ofAdd ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := by + rw [h] + +/-- +`fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer` satisfies the +integer-power formula `valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.1 : +F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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 + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) * + (Units.mk0 (π : K) hπ.ne_zero) ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = + x := by + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ + have hexp : + Multiplicative.toAdd ((E.symm x).2) = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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) ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 +(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.1 : +F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F +(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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 + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) = + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) := by + let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero + let u : Kˣ := + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + valuationSubringUnitFieldUnitHom F + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.2 : F.valuationSubringˣ) + have hux : + u * ϖ ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 * (ϖ ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x * + ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := by + rw [← zpow_add, add_neg_cancel, zpow_zero] + _ = x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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) ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) ∈ + F.valuation.valuationSubring.unitGroup := by + let V : MultiplicativeIntegerValuation Kˣ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + have hzero : + V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ + have hπV : + V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by + simpa [V] using + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + have hmem : + x * (Units.mk0 (π : K) hπ.ne_zero) ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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) ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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) ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) := by + apply Units.ext + simp [valuationSubringUnitFieldUnitHom, fieldUnitUniformizerUnitPart] + +/-- +Establishes the identity `(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F +hπ).symm x).1.1 : F.valuationSubringˣ) * +(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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ˣ) : + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x).1.1 : F.valuationSubringˣ) * + (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 `((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF 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ˣ) : + ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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)) : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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π ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by + rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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π ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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, + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ˣ => + ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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ˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := + continuous_id.mul (hpow.comp hval) + rw [Units.continuous_iff] + constructor + · have hfieldK : + Continuous (fun x : Kˣ => + ((x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 => + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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ˣ => + (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ).symm x) := by + let : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let E := + fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_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) + fieldUnitDecompositionFactors F ≃ₜ* Kˣ := by + letI : Valued K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + exact + { fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + 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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..7d7360bcd7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog +import Mathlib.GroupTheory.SpecificGroups.Cyclic +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. +-/ + +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)) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ)) ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F := + (zmodCyclicMulEquiv + (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + haveI : Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + 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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + F) + Kˣ + (factorsTopology restricted.toTopologicalSpace) + (unitsTopology restricted.toTopologicalSpace) e := by + exact E.continuous + have heSymmContinuous : + @Continuous + Kˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + F) + Kˣ + (factorsTopology direct.toTopologicalSpace) + (unitsTopology direct.toTopologicalSpace) e + rw [hdom, hcod] + exact heContinuous + continuous_invFun := by + change @Continuous + Kˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) ≃ₜ* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F + rw [← Nat.card_units F.residueField] + let e : Multiplicative (ZMod (Nat.card F.residueFieldˣ)) ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F := + (zmodCyclicMulEquiv + (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + haveI : Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..88dbebd05d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean @@ -0,0 +1,435 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Algebra.Group.Hom.Basic +import Mathlib.Algebra.Group.Subgroup.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +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. +-/ + +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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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 := chosenFirstPrincipalUnitStructure_equalCharacteristic 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 := chosenFirstPrincipalUnitStructure_equalCharacteristic 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 := chosenFirstPrincipalUnitStructure_equalCharacteristic 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 := chosenFirstPrincipalUnitStructure_equalCharacteristic 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..fe9fe1767d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits +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. +-/ + +noncomputable section + +universe u + +open ValuationTheory.DiscreteValuationField +open LocalFieldTheory.DiscreteValuationField + +namespace LocalFieldTheory.DiscreteValuationField +namespace LocalField + +variable {K : Type u} [Field K] + +/-- 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 chosenFieldUnitsStructure_mixedCharacteristic + (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⟩ := + chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + v hv + exact ⟨a, + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation + v hπ + (Multiplicative + (ZMod (F.residueCharacteristic ^ a) × + (Fin d → ℤ_[F.residueCharacteristic]))) e⟩ + +/-- 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 chosenFirstPrincipalUnitStructure_equalCharacteristic + (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 + (CompleteDVF.higherPrincipalUnitGroup.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 + +/-- 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 chosenFieldUnitsStructure_equalCharacteristic + (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 := + chosenFirstPrincipalUnitStructure_equalCharacteristic v + exact + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation + 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..269d795d94 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.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 +-/ + +import Mathlib.Algebra.Algebra.ZMod +import Mathlib.Algebra.Field.ZMod +import Mathlib.LinearAlgebra.Basis.Basic +import Mathlib.LinearAlgebra.Dimension.Free +import Mathlib.LinearAlgebra.FiniteDimensional.Defs +import Mathlib.RingTheory.Finiteness.Basic +import Mathlib.RingTheory.LaurentSeries +import Mathlib.RingTheory.Localization.Away.Basic +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))`. +-/ + +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⸩)`. +-/ +@[simp] +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⟧)`. +-/ +@[simp] +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..bb1c4e2d75 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.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 +-/ + +import Mathlib.NumberTheory.Padics.RingHoms +import Mathlib.Topology.Homeomorph.Lemmas +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. +-/ + +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..470aa2a12e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -0,0 +1,2634 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent +import Mathlib.LinearAlgebra.Finsupp.LinearCombination +import Mathlib.LinearAlgebra.Finsupp.VectorSpace +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. +-/ + +/-! +# 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 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift 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) = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup + 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubring) = + 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) * pi ^ n := by + rw [iwasawaSeedAtLevel, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : + F.valuationSubringˣ) : F.valuationSubring) = + 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift 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)) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + (Additive.ofMul + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaSeedAtLevel F hpi n hn i))) = + iwasawaResidueBasis F i := by + let r : F.valuationSubring := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + (iwasawaResidueBasis F i) + let e := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + have hs := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + F.toCompleteDVF hpi n hn r + have he := congrArg e hs + simpa [e, r, iwasawaSeedAtLevel, iwasawaSeedIdeal, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueMap_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 (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuot + F.toCompleteDVF n) := + (iwasawaResidueBasis F).equivFun.symm.toAddEquiv.trans + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n + (iwasawaSeedAtLevel F hpi n hn i)) := by + let e := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + F.toCompleteDVF hpi n hn + let z := Additive.ofMul + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r := + ⟨(Additive.toMul (a • Additive.ofMul x) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) / + (Additive.toMul + (((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) • + Additive.ofMul x) : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = 0 ↔ + ((x : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + (((x ^ (F.residueCharacteristic ^ s) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := + ⟨((higherUnitToFirst F n hn x) ^ (F.residueCharacteristic ^ s) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := + (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF n x y).1 hxyQuot + let d : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := + ⟨((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) m) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) * + ((Additive.toMul + (∑ j ∈ s, a j • Additive.ofMul (iwasawaSeed F hpi n hn j)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n + apply (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n).mul_mem + · exact LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_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]) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + ⟨(Additive.toMul (iwasawaGn F hpi n hn a) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) * _ = + ((principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) * _ + have hfirst : + ((Additive.toMul + (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((principalUnitPadicSmulAtLevel F n hn (a i) + (iwasawaSeed F hpi n hn i) + (iwasawaSeedAtLevel F hpi n hn i).property : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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]) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s) := + ⟨(Additive.toMul + (iwasawaGn F hpi n hn + ((F.residueCharacteristic ^ s : + ℤ_[F.residueCharacteristic]) • a)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : + ∃ a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + (((x / iwasawaGnScaledAtLevel F hpi n hn s a : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) ∈ + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1)) + (hx : (F.residueCharacteristic : + ℤ_[F.residueCharacteristic]) • x = 0) : + x = 0 := by + let u : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ 0)) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + ∃ a : Fin (iwasawaResidueRank F) → + ℤ_[F.residueCharacteristic], + (((x / iwasawaGnAtLevel F hpi n hn a : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) ∈ + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 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 : ℕ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((iwasawaGnScaledAtLevel F hpi d.1 d.property.1 s b : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ℕ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) (r : ℕ) : + ∃ a : iwasawaDomain F, + (∀ j, r < j.1.1 → a j = 0) ∧ + (((x / iwasawaPartialProduct F hpi a r : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s) := + ⟨((x / iwasawaPartialProduct F hpi a r : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (n * F.residueCharacteristic ^ s)) : + F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) = + (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ)) = + (x : F.valuationSubringˣ) / + (iwasawaPartialProduct F hpi a r : + F.valuationSubringˣ) / + ((Additive.toMul (iwasawaGn F hpi n hn b) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 := + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + (E x).1 r := + ((continuous_apply r).comp continuous_subtype_val).comp E.continuous + change Continuous fun x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF r + (Internal.principalUnitMulEquivInverseLimitCarrier + F.toCompleteDVF x) at hcoord + have hquot : Continuous fun x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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' + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (e.1 * F.residueCharacteristic ^ t)) : + F.valuationSubringˣ) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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' + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 := (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1)) + (iwasawaDegreeTerm F hpi a k)).2 + change + ((iwasawaDegreeTerm F hpi a k : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup 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 := + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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..90f5e9329d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -0,0 +1,1028 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap +import Mathlib.Analysis.Normed.Module.FiniteDimension +import Mathlib.FieldTheory.PrimeField +import Mathlib.LinearAlgebra.Dimension.Basic +import Mathlib.NumberTheory.Padics.WithVal +import Mathlib.RingTheory.SimpleRing.Basic +import Mathlib.Topology.Algebra.Field +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. +-/ + +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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + CompleteSpace F.qpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + IsUniformInducing F.qpadicCompletionToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + DenseRange F.qpadicCompletionToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + IsUniformInducing F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + IsClosed (Set.range F.qpadicNumbersToQpadicClosureSubfield) := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + DenseRange F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + Function.Surjective F.qpadicNumbersToQpadicClosureSubfield := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 qpadicClosureSubfield_nontriviallyNormedField + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + letI : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_rankOne + F.toCompleteDVF + letI : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 qpadicClosureSubfield_normedAlgebra + (F : LocalField.{u, v} K) [CharZero K] : + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + letI : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfield_nontriviallyNormedField + NormedAlgebra F.qpadicClosureSubfield K := by + letI : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + letI : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfield_nontriviallyNormedField + 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + letI : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfield_nontriviallyNormedField + letI : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfield_normedAlgebra + FiniteDimensional F.qpadicClosureSubfield K := by + let : Valued K F.mrangeValueGroup := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + let : NontriviallyNormedField K := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfield_nontriviallyNormedField + let : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfield_normedAlgebra + 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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + let : NontriviallyNormedField F.qpadicClosureSubfield := + F.qpadicClosureSubfield_nontriviallyNormedField + let : NormedAlgebra F.qpadicClosureSubfield K := + F.qpadicClosureSubfield_normedAlgebra + 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..368b1ed9de --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +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..93842b93ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -0,0 +1,568 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +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. +-/ + +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 finite_rank_torsion_data_of_setup + {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) := + mixed_deepPrincipalUnitLinearEquivPi + 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 mixed_firstPrincipalUnitFiniteQuotientSetup + (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 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 } + +/-- 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 chosenMixed_firstPrincipalUnitAlgebraicData + (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 := + mixed_firstPrincipalUnitFiniteQuotientSetup + v hv n hlevel + let exactData : FiniteRankTorsionData R M q d := + finite_rank_torsion_data_of_setup 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 U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 + let valuationUnitsToFieldUnits := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF + 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 := by + exact Units.val_injective.comp + (hvaluationUnitsToFieldUnits.comp Subtype.val_injective) + have hcyclic : IsAddCyclic T := + isAddCyclic_of_injective_multiplicative_map + T.subtype.toAddMonoidHom principalToField + T.subtype_injective hprincipalToField + 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 := hcyclic + 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 mixed_firstPrincipalUnitStructure + (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 := + chosenMixed_firstPrincipalUnitAlgebraicData + 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 chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + (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 mixed_firstPrincipalUnitStructure + 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..56c5ece10a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -0,0 +1,569 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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)] [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] + (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 mixed_maximalIdealPowHomeomorphPi_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 + ((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 mixed_deepLogContinuousAddEquiv + (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 + mixed_deepLogContinuousAddEquiv + v hv n hlevel + ((m : ℤ_[F.residueCharacteristic]) • x) = + (m : ℤ_[F.residueCharacteristic]) • + mixed_deepLogContinuousAddEquiv + 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 + (mixed_deepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom + (m • x) = + m • + (mixed_deepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom x + exact + (mixed_deepLogContinuousAddEquiv 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 mixed_deepLogLinearEquiv + (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 := mixed_deepLogContinuousAddEquiv + 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 + (mixed_deepLogLinearEquiv + v hv n hlevel).symm + +/-- Integral-basis coordinates after logarithm give the algebraic coordinate isomorphism `U^n ≃ Z_p^d`. -/ +noncomputable def mixed_deepPrincipalUnitLinearEquivPi + (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 + (mixed_deepLogLinearEquiv + v hv n hlevel).trans + (F.mixed_maximalIdealPowLinearEquivPi n) + +/-- The same coordinate identification is a homeomorphism, as asserted +explicitly in the mixed-characteristic field-unit structure theorem. -/ +noncomputable def mixed_deepPrincipalUnitHomeomorphPi + (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 + (mixed_deepLogContinuousAddEquiv + v hv n hlevel).toHomeomorph.trans + (mixed_maximalIdealPowHomeomorphPi_ofWithZeroValuation + 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..43d414d938 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -0,0 +1,1134 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure +import Mathlib.RingTheory.DedekindDomain.IntegralClosure +import Mathlib.LinearAlgebra.Dimension.Torsion.Finite +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. +-/ + +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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField 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 _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF + let : IsIntegralClosure F.toCompleteDVF.valuationSubring + (Examples.Qp.padicCompleteDVF p).valuationSubring K := + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 mixed_integralBasis + (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 mixed_valuationSubringLinearEquivPi + (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.mixed_integralBasis.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.mixed_integralBasis + (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 mixed_maximalIdealPowLinearEquivPi + (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 + +/-- 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 + CompleteDVF.higherPrincipalUnitGroup.discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero + F n x + +/-- 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) := + CompleteDVF.higherPrincipalUnitGroup.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..21f912899b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic +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..e08faf70dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean @@ -0,0 +1,1077 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup + +/-! # Basic -/ +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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. -/ +@[simp] 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 : ℤ)`. -/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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..c197fc3654 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -0,0 +1,2865 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +/-! +Develops quotient groups attached to an abstract valued norm, including kernel, image, and +representative criteria. +-/ + +/-! +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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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 : ℤ)`. +-/ +@[simp] 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`. +-/ +@[simp] 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 : ℤ)`. +-/ +@[simp] 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 : +ℤ)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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 : ℤ)`. +-/ +@[simp] 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 : ℤ)`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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))`. +-/ +@[simp] 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)`. +-/ +@[simp] 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))`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] +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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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. -/ +@[simp] 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. -/ +@[simp] +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))`. +-/ +@[simp] +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. -/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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) + [NeZero N.residueDegree] + [Finite (G ⧸ 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..622ea25d87 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean @@ -0,0 +1,1609 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients + +/-! # Norm Filtration -/ +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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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)`. +-/ +@[simp] 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.quotient_principalUnitSubgroup_mapOfLe (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.quotient_principalUnitSubgroup_mapOfLe hmn) = + (UG.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn x, ?_⟩ + change + ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).comp + (UH.quotient_principalUnitSubgroup_mapOfLe 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..ac02329cec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -0,0 +1,383 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms +import Mathlib.NumberTheory.Padics.RingHoms +import Mathlib.RingTheory.Polynomial.Cyclotomic.Roots +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. +-/ + +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 + +/-- 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 + MultiplicativeIntegerValuation.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 + +/-- 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 + MultiplicativeIntegerValuation.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..dd393e638f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.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 +-/ + +import Mathlib.NumberTheory.Padics.RingHoms +import Mathlib.Topology.Algebra.Module.Basic +import Mathlib.LinearAlgebra.Pi +import Mathlib.LinearAlgebra.Isomorphisms +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. +-/ + +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..405d9e8406 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors +import Mathlib.Algebra.Module.PID +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`. +-/ + +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] + [CompactSpace 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..be9dd96efa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean @@ -0,0 +1,690 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex +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. +-/ + +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..073e5087b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +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. +-/ + +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..ec05065b4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.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 +-/ + +import Mathlib.Algebra.Polynomial.Splits +import Mathlib.Data.Finset.Max +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. +-/ + +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..5b37bfe014 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -0,0 +1,818 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition +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. +-/ + +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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv + F.valuationSubringˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + Kˣ := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ + let eUnits : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + Kˣ := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ + let eUnits : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ + (powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact + LocalFieldTheory.card_nthPowerQuotient_eq_mul_of_mulEquiv_prod + F.valuationSubringˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ + (powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) = + Nat.card + ((powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) := by + classical + let e : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ≃* + F.residueFieldˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits + F + have : + Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + Finite.of_equiv F.residueFieldˣ e.symm.toEquiv + exact + LocalFieldTheory.card_nthPowerQuotient_eq_nthPowerKernel + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + F).symm + exact + LocalFieldTheory.card_nthPowerKernel_eq_mul_of_mulEquiv_prod + F.valuationSubringˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + Kˣ := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + F hπ + let eUnits : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + F.valuationSubringˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ + (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range)] + [Finite + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + 1 m) := by + let U := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + 1 m) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.finite_principalUnitSubquotient_of_finite_residue + F 1 m + rw [card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq + (F := F) n m hpow] + exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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) + [Finite (A ⧸ B)] + (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) [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 + ((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 : ℕ} [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 + ((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..f6267f81fd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.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 +-/ + +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. +-/ + +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..db41d21dd2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +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..4ab7e83e5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.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 +-/ + +import Mathlib.Algebra.Module.MinimalAxioms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +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. +-/ + +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`. +-/ +@[simp] 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`. -/ +@[simp] 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..649c939472 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.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 +-/ + +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. +-/ + +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)`. +-/ +@[simp] +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..81d7d804d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule +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. +-/ + +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. -/ +@[simp] 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`. -/ +@[simp] 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..59d5a50cce --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean @@ -0,0 +1,417 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Algebra.Module.MinimalAxioms +import Mathlib.Algebra.Module.ZMod +import Mathlib.NumberTheory.Padics.RingHoms +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous +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. +-/ + +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`. +-/ +@[simp] +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..a43ec1474b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +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`. +-/ + +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).quotient_principalUnitSubgroup_mapOfLe + (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 + (dvrHigherUnitQuotientInverseLimit_eval 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 + (dvrHigherUnitQuotientInverseLimit_eval + (chosenPrincipalUnitPadicUniformizer F) n x) + have heval : Continuous fun x : + dvrHigherUnitQuotientInverseLimit + (chosenPrincipalUnitPadicUniformizer F) => + dvrHigherUnitQuotientInverseLimit_eval + (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 + show higherUnitQuotientTransition F hij + (uniformizerHigherUnitQuotientEquiv F j + (dvrHigherUnitQuotientInverseLimit_eval + (chosenPrincipalUnitPadicUniformizer F) j x)) = + uniformizerHigherUnitQuotientEquiv F i + (dvrHigherUnitQuotientInverseLimit_eval + (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 + (dvrHigherUnitQuotientInverseLimit_eval 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..6432449d4e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.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 +-/ + +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. +-/ + +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`. +-/ +@[simp] 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..147808b96e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.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 +-/ + +import Mathlib.NumberTheory.Padics.RingHoms +import Mathlib.Topology.Algebra.Group.Basic +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. +-/ + +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..17d0a166a1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.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 +-/ + +import Mathlib.Algebra.Module.MinimalAxioms +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. +-/ + +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))`. +-/ +@[simp] 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`. +-/ +@[simp] +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`. +-/ +@[simp] 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..f28f90223d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +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. +-/ + +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..2276d4913f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +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. +-/ + +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..b290392aa0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +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. +-/ + +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..2df552e0df --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition +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..54b20362ae --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import Mathlib.Algebra.Group.Units.Equiv + +/-! # Automorphism Transport -/ +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)`. +-/ +@[simp] 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..d117f8ac0e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -0,0 +1,1363 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.RingTheory.Ideal.Quotient.Index +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +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. +-/ + +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 + [Finite F.residueField] (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 + [Finite F.residueField] + {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`. -/ +@[simp] 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..df15db28bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import Mathlib.Algebra.CharP.Lemmas +import Mathlib.Algebra.Group.Units.Hom + +/-! # Filtration -/ +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..792f705136 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport + +/-! # Residue Quotient -/ +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`. +-/ +@[simp] 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..c9d4844d6b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean @@ -0,0 +1,300 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Finite.Basic +import Mathlib.RingTheory.RootsOfUnity.Basic + +/-! # Residue Roots -/ +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 [Finite F.residueField] : + 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..34088f0246 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean @@ -0,0 +1,580 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +/-! # Teichmuller Decomposition -/ +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 fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup + [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..eef986602d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +import Mathlib.Algebra.CharP.Lemmas + +/-! # Teichmuller Lift -/ +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..019e895423 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +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`. +-/ + +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..59ef0444bd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.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 +-/ + +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. +-/ + +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..7579c3f6ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean @@ -0,0 +1,389 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 := + (ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + (ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + base target + let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := + ValuationTheory.DiscreteValuationField.ValuedExtension.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..1ee8689be4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -0,0 +1,1372 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.GroupTheory.Index +import Mathlib.GroupTheory.QuotientGroup.Basic + +/-! # Units -/ +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 quotient_principalUnitSubgroup_mapOfLe {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 `quotient_principalUnitSubgroup_mapOfLe` is +`U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = + QuotientGroup.mk x := + rfl + +/-- +Establishes the identity `U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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] + [Finite (U.principalUnitSubquotient n (n + 1))] : + 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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`. +-/ +@[simp] 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] + [Finite (U.principalUnitSubgroupClassInQuotient l n)] + [Finite (U.principalUnitSubgroupClassInQuotient m n)] + [Finite (U.principalUnitSubgroupClassInQuotient l m)] : + 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] + [Finite (U.principalUnitSubquotient m n)] + [Finite (U.principalUnitSubgroupClassInQuotient m n)] : + 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 : ℕ) [(U.principalUnitSubgroup n).Normal] + [Finite (U.principalUnitSubquotient n 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn q = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn q = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn q = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn q = + U.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe 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.quotient_principalUnitSubgroup_mapOfLe hmn q`. +-/ +@[simp] 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.quotient_principalUnitSubgroup_mapOfLe hmn q := by + change + QuotientGroup.quotientQuotientEquivQuotientAux + (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) + (U.principalUnitSubgroup_antitone hmn) q = + U.quotient_principalUnitSubgroup_mapOfLe 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`. +-/ +@[simp] 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)`. +-/ +@[simp] 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.quotient_principalUnitSubgroup_mapOfLe hkm).comp + (U.quotient_principalUnitSubgroup_mapOfLe hmn) = + U.quotient_principalUnitSubgroup_mapOfLe (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.quotient_principalUnitSubgroup_mapOfLe (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.quotient_principalUnitSubgroup_mapOfLe (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.quotient_principalUnitSubgroup_mapOfLe hlm + (U.quotient_principalUnitSubgroup_mapOfLe hmn + (q : G ⧸ U.principalUnitSubgroup n)) = + U.quotient_principalUnitSubgroup_mapOfLe (le_trans hlm hmn) + (q : G ⧸ U.principalUnitSubgroup n) + change + ((U.quotient_principalUnitSubgroup_mapOfLe hlm).comp + (U.quotient_principalUnitSubgroup_mapOfLe hmn)) + (q : G ⧸ U.principalUnitSubgroup n) = + U.quotient_principalUnitSubgroup_mapOfLe (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..55722255b1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +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..d75651f5b8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +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. +-/ + +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 mrangeRestrict_rankOne + (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..bc65530bbe --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +import Mathlib.Algebra.Order.Group.Cyclic +import Mathlib.Algebra.Group.Int.TypeTags +import Mathlib.Data.Int.WithZero +import Mathlib.RingTheory.Valuation.Archimedean +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. +-/ + +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..f4fb600432 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup +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. +-/ + +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..777b070265 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +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. +-/ + +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 [LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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..5bf8fde178 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.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 +-/ + +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. +-/ + +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.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF) + ProperSpace K := by + exact + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF) + CompleteSpace K := by + exact + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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..e726a1803c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +import Mathlib.RingTheory.AdicCompletion.Topology +import Mathlib.Topology.Algebra.Valued.LocallyCompact +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. +-/ + +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) + +@[instance_reducible] +private noncomputable def mrangeRestrictValued_rankOne + (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.mrangeRestrict_rankOne 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 mrangeRestrict_nontriviallyNormedField + (F : CompleteDVF.{u, v} K) : + NontriviallyNormedField K := + Valued.toNontriviallyNormedField + (L := K) + (Γ₀ := MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (hv := mrangeRestrictValued_rankOne 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⟩ := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + (ValuationTheory.DiscreteValuationField.Valuation.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.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_rankOne 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 + +/-- 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.mrangeRestrict_nontriviallyNormedField 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 := + mrangeRestrictValued_rankOne 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 + (Valued.integer.compactSpace_iff_completeSpace_and_isDiscreteValuationRing_and_finite_residueField + (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.mrangeRestrict_nontriviallyNormedField 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 := + mrangeRestrictValued_rankOne F + let : NontriviallyNormedField K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + have hcompact : CompactSpace 𝒪[K] := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_compactSpace_of_residueField_finite F) + unfold mrangeRestrict_nontriviallyNormedField + unfold Valued.toNontriviallyNormedField + change @ProperSpace K + (Valued.toNormedField K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (hv := mrangeRestrictValued_rankOne F)).toPseudoMetricSpace + exact + (@Valued.integer.properSpace_iff_compactSpace_integer + K + (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) + inferInstance inferInstance + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + (mrangeRestrictValued_rankOne 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.mrangeRestrict_nontriviallyNormedField 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.mrangeRestrict_nontriviallyNormedField F) + have : ProperSpace K := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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..b539a31e6d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.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 +-/ + +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. +-/ + +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..b27e6c45ac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +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. +-/ + +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..e6dfc2ee77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +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. +-/ + +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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F), + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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ˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.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)) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.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..e59d24f870 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.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 +-/ + +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. +-/ + +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..2eca0097b7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase +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. +-/ + +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..376a165d57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +import Mathlib.Data.Int.ModEq + +/-! # Value Group -/ +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..f47d798c5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction +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`. +-/ + +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 := + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F + have : Finite F.residueField := by + change Finite (IsLocalRing.ResidueField v.valuationSubring) + infer_instance + have hcomplete : @CompleteSpace K restrictedNormed.toUniformSpace := by + exact _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F + have huniform : direct.toUniformSpace = restrictedNormed.toUniformSpace := by + change + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField + (completeDVF v)).toUniformSpace + calc + (Valued.mk' v).toUniformSpace = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (completeDVF v)).toUniformSpace := + valuedMk_uniformSpace_eq_mrangeRestrict v + _ = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField + (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..ab71f5b343 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +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..f60ebfe071 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.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 +-/ + +import Mathlib.Topology.Algebra.Group.Quotient +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. +-/ + +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. -/ +@[simp] 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..4a29458674 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.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 +-/ + +import Mathlib.Algebra.Group.Int.TypeTags +import Mathlib.Data.ZMod.QuotientGroup +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. +-/ +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. -/ +@[simp] 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`. -/ +@[simp] 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..d00fa8461e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -0,0 +1,929 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Algebra.Group.Subgroup.Ker +import Mathlib.Algebra.Group.Hom.Basic +import Mathlib.Algebra.Group.Subgroup.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup +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`. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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 : ℕ) + [Finite ((powMonoidHom n : G →* G).ker)] + [Finite ((powMonoidHom n : H →* H).ker)] : + 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) + [Finite ((powMonoidHom n : G →* G).ker)] + [Finite ((powMonoidHom n : H →* H).ker)] + [Finite ((powMonoidHom n : U →* U).ker)] : + 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 : ℕ) + [Finite (G ⧸ (powMonoidHom n : G →* G).range)] + [Finite (H ⧸ (powMonoidHom n : H →* H).range)] : + 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) + [Finite (G ⧸ (powMonoidHom n : G →* G).range)] + [Finite (H ⧸ (powMonoidHom n : H →* H).range)] + [Finite (U ⧸ (powMonoidHom n : U →* U).range)] : + 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) + [Finite (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range)] : + 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) + [Finite ((powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker)] : + 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 ℤ) + [Finite (G ⧸ (powMonoidHom n : G →* G).range)] + [Finite (U ⧸ (powMonoidHom n : U →* U).range)] : + Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = + n * Nat.card (U ⧸ (powMonoidHom n : U →* U).range) := by + let := finite_multiplicativeInt_nthPowerQuotient hn + 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 ℤ) + [Finite ((powMonoidHom n : G →* G).ker)] + [Finite ((powMonoidHom n : U →* U).ker)] : + Nat.card ((powMonoidHom n : G →* G).ker) = + Nat.card ((powMonoidHom n : U →* U).ker) := by + let := finite_multiplicativeInt_nthPowerKernel hn + 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. -/ +@[simp] +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`. -/ +@[simp] +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 : ℕ) + [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] : + 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 : ℕ) + [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] + [Finite (A ⧸ nsmulAddSubgroup A 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 : ℕ) + [Finite ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker)] + [Finite (nsmulAddKernel A 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) + [Finite (G ⧸ (powMonoidHom n : G →* G).range)] + [Finite (A ⧸ nsmulAddSubgroup A n)] : + 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) + [Finite ((powMonoidHom n : G →* G).ker)] + [Finite (nsmulAddKernel A n)] : + 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..4aacc58f8a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +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..a63e9ae790 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.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 +-/ + +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. +-/ +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..ff41c7c0b9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.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 +-/ + +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. +-/ +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. -/ +@[simp] +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. -/ +@[simp] +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..ec43403aab --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import Mathlib.Algebra.Order.Hom.Units +import Mathlib.NumberTheory.LocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +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. +-/ + +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 (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..179bc3bfaf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean @@ -0,0 +1,288 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology +import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +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. +-/ + +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..27e80ba88a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.RingTheory.DedekindDomain.Factorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +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. +-/ + +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..922133976e --- /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 +-/ + +import Mathlib.FieldTheory.Galois.IsGaloisGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension +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. +-/ +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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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] + [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation 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..f70d97e798 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -0,0 +1,914 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +/-! # Ideal Quotients -/ +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. -/ +@[simp] +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) + [Finite (PrincipalUnitsSuccQuot K 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..894ec67998 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +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. +-/ + +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. -/ +@[simp] +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..ea26db7ebc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.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 +-/ + +import Mathlib.LinearAlgebra.Determinant +import Mathlib.RingTheory.Norm.Transitivity +import Mathlib.RingTheory.Valuation.Integral +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension +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. +-/ +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..115bdd05be --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import Mathlib.Analysis.Normed.Module.FiniteDimension +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. +-/ + +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..5036c784bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits +import Mathlib.Algebra.Group.Subgroup.Basic +import Mathlib.Data.Finset.Basic +import Mathlib.GroupTheory.OrderOfElement +import Mathlib.GroupTheory.QuotientGroup.Basic +import Mathlib.LinearAlgebra.FiniteDimensional.Basic +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. +-/ + +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..f16fefd264 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.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 +-/ + +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. +-/ + +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] [FiniteDimensional 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 M] [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..b1ec1cfd60 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean @@ -0,0 +1,294 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +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. +-/ + +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 := + ValuationTheory.DiscreteValuationField.ValuedExtension.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..b0ae36b7cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +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. +-/ + +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⟩ := + LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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 + LocalFieldTheory.DiscreteValuationField.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 := + LocalFieldTheory.DiscreteValuationField.LocalField.chosenFirstPrincipalUnitStructure_equalCharacteristic + 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 + LocalFieldTheory.DiscreteValuationField.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..e2be0e0977 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.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 +-/ + +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. +-/ +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)) + (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)) + (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..99b6ea61f5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -0,0 +1,1561 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.RingTheory.Filtration +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`. +-/ +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] [IsUniformAddGroup 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] [IsUniformAddGroup 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] [IsUniformAddGroup 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) + [Finite (PrincipalUnitsSuccQuot K n)] : + 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)`. -/ +@[simp] +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..27306bef1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.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 +-/ + +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. +-/ +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..ce33893159 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +import Mathlib.Topology.Algebra.ClopenNhdofOne +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. +-/ + +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 localUnits_profinite + (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..a59d061e25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Finite.GaloisField +import Mathlib.LinearAlgebra.Dimension.DivisionRing +import Mathlib.NumberTheory.RamificationInertia.Inertia +import Mathlib.NumberTheory.RamificationInertia.Ramification +import Mathlib.RingTheory.Ideal.Norm.AbsNorm +import Mathlib.RingTheory.RamificationInertia.Basic +import Mathlib.RingTheory.SimpleModule.Basic +import Mathlib.RingTheory.DedekindDomain.IntegralClosure +import Mathlib.RingTheory.Trace.Basic +import Mathlib.RingTheory.Valuation.Extension +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. +-/ +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..0361f826d8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.NumberTheory.RamificationInertia.Galois +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. +-/ + +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..0792f18d1b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.Algebra.Category.ModuleCat.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv +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. +-/ +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] + [Finite (IntegerUnitsModPrincipalUnits K)] + [Finite (ResidueUnits 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..d9fec17f5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.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 +-/ + +import Mathlib.FieldTheory.SeparableClosure +import Mathlib.RingTheory.Ideal.Norm.RelNorm +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +/-! # Separable Norm Valuation -/ +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] + [IsScalarTower K 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] [FiniteDimensional K L] + [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..9fd5ebbbc5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small +import Mathlib.Algebra.Field.Shrink +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. +-/ + +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 := smallLocalField K + Valuation (Shrink.{0} K) (ValueGroupWithZero K) := by + letI : Small.{0} K := 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 := smallLocalField K + ValuativeRel (Shrink.{0} K) := by + letI : Small.{0} K := smallLocalField K + exact ValuativeRel.ofValuation (shrinkLocalFieldValuation K) + +/-- The small carrier inherits local compactness from `K`. -/ +theorem shrinkLocalField_locallyCompact : + letI : Small.{0} K := smallLocalField K + LocallyCompactSpace (Shrink.{0} K) := by + let : Small.{0} K := smallLocalField K + exact (Shrink.homeomorph K).symm.isOpenEmbedding.locallyCompactSpace + +/-- The pulled-back valuative relation is nontrivial. -/ +theorem shrinkLocalField_isNontrivial : + letI : Small.{0} K := smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + ValuativeRel.IsNontrivial (Shrink.{0} K) := by + let : Small.{0} K := 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 := 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 := 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 := smallLocalField K + IsTopologicalAddGroup (Shrink.{0} K) := by + let : Small.{0} K := 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 := smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + IsValuativeTopology (Shrink.{0} K) := by + let : Small.{0} K := 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 := smallLocalField K + letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K + IsNonarchimedeanLocalField (Shrink.{0} K) := by + let : Small.{0} K := 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..1da9600a1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +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. +-/ + +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..fb2e5b36ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.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 +-/ + +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. +-/ + +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..eb6724f20b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +/-! # Uniformizer Principal Quotient -/ +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 [LocalFieldTheory.IsNonarchimedeanLocalField.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 [LocalFieldTheory.IsNonarchimedeanLocalField.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 [LocalFieldTheory.IsNonarchimedeanLocalField.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 [LocalFieldTheory.IsNonarchimedeanLocalField.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..b1037a51dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.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 +-/ + +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. +-/ + +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..b965643df3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.FieldTheory.Finite.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma + +/-! # Unramified Frobenius -/ +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. -/ +@[simp] +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. -/ +private 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) + +private 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) + (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) + (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..e18759e55e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm +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. +-/ +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..d2ffc2e207 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import Mathlib.Algebra.Group.Hom.Basic +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 `ℤ`. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..2b671cdf84 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.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 +-/ + +import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic +import Mathlib.RingTheory.Valuation.Extension +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. +-/ +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..69fa5a9837 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.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 +-/ + +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. +-/ + +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 Γ] + [MulArchimedean Γ] [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..9f00681632 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.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 +-/ + +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. +-/ +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..4e87a01f1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits +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..6cf1e7fa9f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.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 +-/ + +import Mathlib.NumberTheory.Padics.RingHoms +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. +-/ + +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..79af4596d7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean @@ -0,0 +1,10 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified +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..8e4ae9bc17 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex +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..608bfa94ff --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import Mathlib.NumberTheory.Cyclotomic.Gal +import Mathlib.NumberTheory.Cyclotomic.Discriminant +import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral +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. +-/ + +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] + +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 padicCyclotomicTotallyRamified_galoisGroupEquivUnits + (ζ : 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..da884d38d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.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 +-/ + +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. +-/ + +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] + +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..9104f043a5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.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 +-/ + +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. +-/ + +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] + +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, + (LocalFieldTheory.DiscreteValuationField.ValuedExtension.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..e44c0b2198 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.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 +-/ + +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. +-/ + +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] + +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) := + ValuationTheory.DiscreteValuationField.ValuedExtension.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..18b3be681c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.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 +-/ + +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. +-/ + +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] + +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..0103244257 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.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 +-/ + +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][ζ]`. +-/ + +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] + +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..f1a79ad163 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv +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. +-/ + +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] + +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 + LocalFieldTheory.DiscreteValuationField.ValuedExtension.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..e896916ff1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.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 +-/ + +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. +-/ + +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] + +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) = ⊤) + [FiniteDimensional ℚ_[p] L] [Algebra.IsSeparable ℚ_[p] 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..4056630428 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean @@ -0,0 +1,9 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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..fc5b00f427 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -0,0 +1,1775 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic +import Mathlib.RingTheory.Polynomial.Cyclotomic.Factorization +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[ζ]`. +-/ + +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] [Algebra K 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 padicCyclotomicUnramified_galIntegerRingEquiv + (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 := + 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) : + ((padicCyclotomicUnramified_galIntegerRingEquiv + 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 padicCyclotomicUnramified_galResidueAlgEquiv + (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 := padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ + let eell : ell ≃+* ell := IsLocalRing.ResidueField.mapEquiv eW + apply AlgEquiv.ofRingEquiv + 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 + padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ + (IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) x) = + IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) + (padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ x) := by + simp only [padicCyclotomicUnramified_galResidueAlgEquiv, + AlgEquiv.ofRingEquiv_apply, + IsLocalRing.ResidueField.mapEquiv_apply, + IsLocalRing.ResidueField.map_residue] + rfl + +/-- The canonical residue action as a group homomorphism. -/ +noncomputable def padicCyclotomicUnramified_galToResidueGal + (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 := padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens + map_one' := ?_ + map_mul' := ?_ } + · ext x + obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x + change padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens 1 + (IsLocalRing.residue W y) = IsLocalRing.residue W y + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] + change IsLocalRing.residue W + (padicCyclotomicUnramified_galIntegerRingEquiv 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 padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens (σ * τ) + (IsLocalRing.residue W y) = + padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ + (padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens τ + (IsLocalRing.residue W y)) + rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] + change IsLocalRing.residue W + (padicCyclotomicUnramified_galIntegerRingEquiv 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 ζ := + 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 (padicCyclotomicUnramified_galToResidueGal 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 := + padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ a + let bτ : W := + padicCyclotomicUnramified_galIntegerRingEquiv 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 padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ + (IsLocalRing.residue W a) = + padicCyclotomicUnramified_galResidueAlgEquiv 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 + (padicCyclotomicUnramified_galToResidueGal 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 + (padicCyclotomicUnramified_galToResidueGal 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 padicCyclotomicUnramified_galEquivResidueGal + (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 + (padicCyclotomicUnramified_galToResidueGal 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 + (padicCyclotomicUnramified_galEquivResidueGal + 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 _ _ + padicCyclotomicUnramified_galEquivResidueGal + 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 := padicCyclotomicUnramified_galIntegerRingEquiv + 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 : + padicCyclotomicUnramified_galEquivResidueGal + 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 padicCyclotomicUnramified_galResidueAlgEquiv 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 := padicCyclotomicUnramified_galEquivResidueGal + 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 + +/-- 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 := 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 + 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 + 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 := 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 + 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 := 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 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 + 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 hfinTopAlgebra : + FiniteDimensional k (⊤ : IntermediateField k ell) := + @IntermediateField.finiteDimensional_left + k ell _ _ _ (⊤ : IntermediateField 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) := by + refine ⟨?_⟩ + intro hzero + apply hnCastK + 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 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 hfullResidueDegree : + @Module.finrank k ell _ _ residueModule = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + have hdegree : + Module.finrank K L = + @Module.finrank k ell _ _ residueModule := by + change Module.finrank K L = exponentialResidueDegree vK vL hExt + exact hUnramified.2 + rw [← hdegree] + exact hfieldDegree + have hfullResidueDegreeAlgebra : + @Module.finrank k ell _ _ algebraModule = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by + calc + @Module.finrank k ell _ _ algebraModule = + @Module.finrank k ell _ _ residueModule := by + rw [hresidueModule] + _ = padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := + hfullResidueDegree + have halphaSubDegree : + Module.finrank k + (IntermediateField.adjoin k ({alpha} : Set ell)) = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := + padicCyclotomicUnramified_residue_adjoin_finrank hk hpn halphaPrimitive + have halphaTop : + IntermediateField.adjoin k ({alpha} : Set ell) = + (⊤ : IntermediateField k ell) := by + refine @IntermediateField.eq_of_le_of_finrank_eq + k ell _ _ _ + (IntermediateField.adjoin k ({alpha} : Set ell)) + (⊤ : IntermediateField k ell) hfinTopAlgebra le_top ?_ + calc + Module.finrank k + (IntermediateField.adjoin k ({alpha} : Set ell)) = + padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := + halphaSubDegree + _ = @Module.finrank k ell _ _ algebraModule := + hfullResidueDegreeAlgebra.symm + _ = Module.finrank k (⊤ : IntermediateField k ell) := by + simp + have halphaAlgTop : + Algebra.adjoin k ({alpha} : Set ell) = + (⊤ : Subalgebra k ell) := + Algebra.adjoin_eq_top_of_primitive_element + (Algebra.IsAlgebraic.isAlgebraic alpha) halphaTop + 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 + have htop : + (⊤ : Submodule V W) ≤ + A.toSubmodule ⊔ + IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := by + intro b _hb + rcases hcongr b with ⟨z, hzA, hdiff⟩ + have hdiffMap : + b - z ∈ Ideal.map i (IsLocalRing.maximalIdeal V) := by + simpa [hmapMaximal] using hdiff + have hdiffSmul : + b - z ∈ + IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := by + have hdiffMap' : + b - z ∈ Ideal.map (algebraMap V W) + (IsLocalRing.maximalIdeal V) := by + change b - z ∈ Ideal.map i (IsLocalRing.maximalIdeal V) + exact hdiffMap + simpa [Ideal.smul_top_eq_map] using hdiffMap' + have hsum : + z + (b - z) ∈ + A.toSubmodule ⊔ + IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := + Submodule.add_mem_sup hzA hdiffSmul + have hsum_eq : z + (b - z) = b := by ring + simpa [hsum_eq] using hsum + have hjac : + IsLocalRing.maximalIdeal V ≤ + Ideal.jacobson (⊥ : Ideal V) := by + exact IsLocalRing.maximalIdeal_le_jacobson (⊥ : Ideal V) + have hle : (⊤ : Submodule V W) ≤ A.toSubmodule := + Submodule.le_of_le_smul_of_le_jacobson_bot + (I := IsLocalRing.maximalIdeal V) (N := A.toSubmodule) + (N' := (⊤ : Submodule V W)) Module.Finite.fg_top hjac htop + have hA : A.toSubmodule = ⊤ := le_antisymm le_top hle + refine ⟨a, rfl, ?_⟩ + exact Algebra.toSubmodule_eq_top.mp hA + +/-- 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 + (padicCyclotomicUnramified_galToResidueGal 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 := + 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 + (padicCyclotomicUnramified_galToResidueGal 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..0dfe0bd079 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic +import Mathlib.NumberTheory.Padics.ProperSpace +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. +-/ + +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..0057b1adaf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import Mathlib.NumberTheory.Padics.ValuativeRel +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. +-/ + +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))ˣ) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 := LocalFieldTheory.DiscreteValuationField.LocalField.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 + ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring) ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v) n := by + letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v + let P := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 + ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + Ideal (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring)) : + let F := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + let E := expLogMulEquivOfWithZeroValuation v hv n hlevel + ((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : F.valuationSubringˣ) : + F.valuationSubring) : K) = + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 [ + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv, + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuationScaled, + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled] + apply + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled + (v := v) (p := p) + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v) + n + case hπval => + exact Classical.choose_spec + (LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv) + case hπ => + exact + LocalFieldTheory.DiscreteValuationField.WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + v _ + (Classical.choose_spec + (LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + v hv)) + case hlevel => exact hlevel + case hnval => + intro m + exact + LocalFieldTheory.DiscreteValuationField.LocalField.valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + v m + case hcomplete => + exact + LocalFieldTheory.DiscreteValuationField.WithZeroValuationTopology.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 := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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 := + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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]) = + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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]) = + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.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..b7f7787d5c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField +import Mathlib.Topology.Algebra.Group.Units +import Mathlib.NumberTheory.Padics.ValuativeRel +import Mathlib.NumberTheory.Padics.ProperSpace +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. +-/ + +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.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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⟩ + +/-- 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.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + 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 := fun T : TopologicalSpace U => by + letI : TopologicalSpace U := T + exact Σ 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityContinuousMulEquivZMod + F.toCompleteDVF).toMulEquiv + letI : Finite RootGroup := + Finite.of_equiv F.residueFieldˣ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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ˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply + F.toCompleteDVF z).symm + have hTotal : Continuous totalAlg := + hUnitsAlg.comp factors.continuous_toFun + let total : + (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃ₜ* + F.valuationSubringˣ := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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..a659eb621a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting +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..d2daeef16c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +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. +-/ + +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 [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..93dae935af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction +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. +-/ + +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 := by + apply hFreduction.of_dvd + rcases hGdvdF with ⟨H, hH⟩ + refine ⟨H.map (IsLocalRing.residue V), ?_⟩ + rw [hH, Polynomial.map_mul] + 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 + calc + Module.finrank K L = + Module.finrank k + (IntermediateField.adjoin k ({alpha} : Set ell)) := + hresidueSubDegree.symm + _ ≤ @Module.finrank k ell _ _ algebraModule := by + simpa using + (@IntermediateField.finrank_le_of_le_right + k ell _ _ _ + (IntermediateField.adjoin k ({alpha} : Set ell)) + (⊤ : IntermediateField k ell) hfinTopAlgebra le_top) + _ = @Module.finrank k ell _ _ residueModule := by + rw [hresidueModule] + 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 + calc + Module.finrank K L = + @Module.finrank k ell _ _ residueModule := hdegreeEq + _ = @Module.finrank k ell _ _ algebraModule := by + rw [hresidueModule] + have hAdjoinResidue : + IntermediateField.adjoin k ({alpha} : Set ell) = + (⊤ : IntermediateField k ell) := by + refine @IntermediateField.eq_of_le_of_finrank_eq + k ell _ _ _ + (IntermediateField.adjoin k ({alpha} : Set ell)) + (⊤ : IntermediateField k ell) hfinTopAlgebra le_top ?_ + calc + Module.finrank k + (IntermediateField.adjoin k ({alpha} : Set ell)) = + Module.finrank K L := hresidueSubDegree + _ = @Module.finrank k ell _ _ algebraModule := hdegreeEqAlgebra + _ = Module.finrank k (⊤ : IntermediateField k ell) := by + simp + have hsepAdjoin : Algebra.IsSeparable k + (IntermediateField.adjoin k ({alpha} : Set ell)) := + (IntermediateField.isSeparable_adjoin_iff_isSeparable k ell).2 (by + intro x hx + have hxalpha : x = alpha := by simpa using hx + subst x + exact halphaSep) + let eTop : IntermediateField.adjoin k ({alpha} : Set ell) ≃ₐ[k] ell := + (IntermediateField.equivOfEq hAdjoinResidue).trans + (IntermediateField.topEquiv : + (⊤ : IntermediateField k ell) ≃ₐ[k] ell) + have hsepEll : Algebra.IsSeparable k ell := by + let : Algebra.IsSeparable k + (IntermediateField.adjoin k ({alpha} : Set ell)) := hsepAdjoin + exact AlgEquiv.Algebra.isSeparable eTop + 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..58429e82cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +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. +-/ + +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..7301d5beb2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean @@ -0,0 +1,235 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +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. +-/ + +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..d40a3f803e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +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. +-/ + +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 + [FiniteDimensional K L] + (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 + [Algebra.IsAlgebraic K L] + (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 + [Algebra.IsAlgebraic K L] + (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..7d17fb680f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +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. +-/ + +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..b2248cfb6f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +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. +-/ + +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..8e5834c682 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.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 +-/ + +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. +-/ + +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..4033ec2c4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +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. +-/ + +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..e360cccf59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.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 +-/ + +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. +-/ + +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..cb6fbef9ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +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. +-/ + +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 E] [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..eddf7696db --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +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. +-/ + +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..aa99db9e96 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.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 +-/ + +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. +-/ + +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..4edeeba8ad --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants +import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed +import Mathlib.FieldTheory.PrimitiveElement +import Mathlib.FieldTheory.SeparableClosure +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. +-/ + +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 + +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 := by + exact minpoly.dvd k abar hpbarRoot + have hpVmonic : pV.Monic := minpoly.monic haIntegralV + have hpbarMonic : pbar.Monic := hpVmonic.map _ + have hqMonic : q.Monic := minpoly.monic habarIntegral + have hpKmap : pK = pV.map (algebraMap V K) := by + exact minpoly.isIntegrallyClosed_eq_field_fractions' K haIntegralV + have hdegree : pbar.natDegree ≤ q.natDegree := by + apply le_of_eq + calc + pbar.natDegree = pV.natDegree := hpVmonic.natDegree_map _ + _ = pK.natDegree := by + rw [hpKmap, hpVmonic.natDegree_map] + _ = pbL.dim := pbL.natDegree_minpoly + _ = pb.dim := rfl + _ = q.natDegree := pb.natDegree_minpoly.symm + have hpbarEq : pbar = q := by + exact Polynomial.eq_of_monic_of_dvd_of_natDegree_le + hqMonic hpbarMonic hqdvd hdegree + have hqSeparable : q.Separable := + Algebra.IsSeparable.isSeparable k abar + have hqDerivative : q.derivative ≠ 0 := + (Polynomial.separable_iff_derivative_ne_zero + (minpoly.irreducible habarIntegral)).1 hqSeparable + have hpKDerivative : pK.derivative ≠ 0 := by + intro hpKzero + have hpVmapDerivative : + pV.derivative.map (algebraMap V K) = 0 := by + rw [← Polynomial.derivative_map, ← hpKmap, hpKzero] + have hVKinj : Function.Injective (algebraMap V K) := by + exact V.subtype_injective + have hpVDerivative : pV.derivative = 0 := + (Polynomial.map_eq_zero_iff hVKinj).1 hpVmapDerivative + have hpbarDerivative : pbar.derivative = 0 := by + simp [pbar, Polynomial.derivative_map, hpVDerivative] + apply hqDerivative + rw [← hpbarEq] + exact hpbarDerivative + have haSeparable : IsSeparable K (a : L) := by + change pK.Separable + exact (Polynomial.separable_iff_derivative_ne_zero + (minpoly.irreducible (Algebra.IsIntegral.isIntegral (a : L)))).2 + hpKDerivative + have hprimitiveK : + IntermediateField.adjoin K ({(a : L)} : Set L) = ⊤ := by + apply IntermediateField.adjoin_eq_top_iff.2 + exact pbL.adjoin_gen_eq_top + have hresidueMinpoly : + pV.map (IsLocalRing.residue V) = + minpoly k (IsLocalRing.residue W a) := by + change pbar = minpoly k (IsLocalRing.residue W a) + rw [hares] + exact hpbarEq + have hpbarSeparable : + (pV.map (IsLocalRing.residue V)).Separable := by + change pbar.Separable + rw [hpbarEq] + exact hqSeparable + refine ⟨a, pV, hprimitiveK, ?_, hresidueMinpoly, + hpbarSeparable, haSeparable⟩ + change pV.map V.subtype = pK + rw [hpKmap] + ext n + rfl + +/-- 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..36fa6b0a7f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField +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..47652dfe5e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +import Mathlib.FieldTheory.Galois.Infinite + +/-! # Closed Subgroups -/ +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..32d4d30e1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -0,0 +1,708 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +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. +-/ + +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] + [IsIntegralClosure target.valuationSubring base.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 (RamificationTheory.DiscreteValuationField.ValuedExtension.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] + [IsIntegralClosure target.valuationSubring base.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + exact (RamificationTheory.DiscreteValuationField.ValuedExtension.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 (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + exact (RamificationTheory.DiscreteValuationField.ValuedExtension.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 (RamificationTheory.DiscreteValuationField.ValuedExtension.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 (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + exact (RamificationTheory.DiscreteValuationField.ValuedExtension.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 + (RamificationTheory.DiscreteValuationField.ValuedExtension.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) ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 + ((RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt base target)).1 + ((RamificationTheory.DiscreteValuationField.ValuedExtension.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 + [IsScalarTower K M L] + [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) + (RamificationTheory.DiscreteValuationField.ValuedExtension.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) := + (RamificationTheory.DiscreteValuationField.ValuedExtension.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..0e44d7618b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.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 +-/ + +import Mathlib.Algebra.Group.Subgroup.Lattice +import Mathlib.Algebra.Order.Floor.Ring +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. +-/ + +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..0333a7a963 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +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..c3b4c4cd2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction +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..9ed8882768 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -0,0 +1,959 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction + +/-! # Absolute Ramification -/ +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 + RamificationTheory.ValuationSubring.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 := + RamificationTheory.ValuationSubring.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation B.valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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 : + ValuationTheory.DiscreteValuationField.HenselianDVF.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 := + RamificationTheory.ValuationSubring.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := E) F.valuation B.valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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) ∧ + ValuationTheory.DiscreteValuationField.HenselianDVF.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 := + ValuationTheory.DiscreteValuationField.HenselianDVF.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) ∧ + ValuationTheory.DiscreteValuationField.HenselianDVF.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`. -/ +@[simp] 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`. -/ +@[simp] 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`. -/ +@[simp] 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..a1055dfef9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -0,0 +1,1652 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence +/-! Provides the public declarations in the `RamificationTheory.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence` Lean module. -/ + +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'`. -/ +@[simp] +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 +finite extension. The finite-dimensional structure on the field range is +installed inside this definition, so the natural cardinal cannot silently use +the infinite-type zero fallback. -/ +noncomputable def normalClosureFiniteExtensionGaloisCard + [FiniteDimensional K L] + (i : L →ₐ[K] AlgebraicClosure K) : ℕ := by + letI := finiteDimensional_fieldRange (K := K) i + 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 [FiniteDimensional K L] + (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'`. -/ +@[simp] +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'`. -/ +@[simp] +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'`. -/ +@[simp] +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'`. -/ +@[simp] +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)`. -/ +private 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 [FiniteDimensional K L] + (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 K L := Algebra.IsAlgebraic.of_finite K L + 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'`. -/ +@[simp] +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'`. -/ +@[simp] +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`. -/ +@[simp] +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`. -/ +@[simp] +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`. -/ +@[simp] +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`. -/ +@[simp] +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 := + RamificationTheory.Field.absoluteGaloisGroup.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..5cae88edf8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +import Mathlib.Algebra.Exact.Basic +import Mathlib.FieldTheory.AbsoluteGaloisGroup +import Mathlib.FieldTheory.Galois.Infinite +import Mathlib.FieldTheory.Galois.Profinite +import Mathlib.FieldTheory.PurelyInseparable.Basic +import Mathlib.RingTheory.Valuation.RamificationGroup +import Mathlib.Topology.Algebra.ContinuousMonoidHom +import Mathlib.Topology.Maps.Basic +import Mathlib.Topology.Sets.Opens + +/-! # Finite Level Valuation Restriction -/ +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`. -/ +@[simp] 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 [ValuationSubring.integer_valuation, 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..12331ef9ec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -0,0 +1,1757 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification +/-! Provides the public declarations in the `RamificationTheory.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence` Lean module. -/ + +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] + [IsGalois 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'`. -/ +@[simp] +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'`. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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) := + 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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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'`. -/ +@[simp] +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. -/ +@[simp] +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..6d29d23744 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.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 +-/ + +import Mathlib.FieldTheory.Galois.Infinite +import Mathlib.FieldTheory.Galois.Profinite +/-! +# Closed fixing subgroups + +This module packages the closed subgroup attached to an intermediate field in +the Krull topology. +-/ + +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..6c9ecba487 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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. +-/ + +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..86c87a37d9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.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 +-/ + +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. +-/ + +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..17a0be1743 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean @@ -0,0 +1,1757 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core +import Mathlib.Data.Rat.Lemmas + +/-! # Ramification -/ +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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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'`. -/ +@[simp] 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..66f7ca3f58 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean @@ -0,0 +1,600 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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`. +-/ + +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..bdf98e7eaa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +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..23275a9f77 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +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. +-/ + +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] + +noncomputable local instance averageSubgroupFintype [Finite G] : Fintype H := + Fintype.ofFinite H + +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 [Finite G] : ℕ := + 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) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : ℕ) [Fintype G] : + (∑ τ : H, + (WithTop.untopD (α := ℕ) 0 + (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ)) = + D.depthRamificationIndex H + + ∑ τ : (D.depthLowerFiltration H).lower 0, + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ) := by + 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 : ℝ) + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat (D.depthLowerFiltration H)) n = + (∑ τ : (D.depthLowerFiltration H).lower 0, + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ)) / + D.depthRamificationIndex H by + simpa [depthRamificationIndex] using + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 ≥ + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 ≥ (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s + 1 ↔ _ + rw [show D.quotientFiberAverage H hq ≥ (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s + 1 ↔ + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s ≤ D.quotientFiberAverage H hq - 1 by + constructor <;> intro h <;> linarith] + rw [havg] + exact (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..efcce072f4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient +import Mathlib.FieldTheory.Galois.Basic +/-! +# Fixed-field group models for Herbrand towers +-/ + +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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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) := + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H)).lower n) * + Nat.card (((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport F H) + (IsGalois.normalAutEquivQuotient H)).lower n) = _ + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) n] + exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_subgroupFiltration_mul_card_quotientImageTransport F H + (IsGalois.normalAutEquivQuotient H) n + +omit [IsGalois K L] in +/-- States the theorem `fixedFieldSubextension_herbrandFunction`. -/ +theorem fixedFieldSubextension_herbrandFunction + [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) (s : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (fixedFieldSubextensionFiltration F H)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) s + +omit [IsGalois K L] in +/-- States the theorem `fixedFieldSubextension_inverseHerbrandFunction`. -/ +theorem fixedFieldSubextension_inverseHerbrandFunction + [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) (t : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldSubextensionFiltration F H)) t = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (IntermediateField.subgroupEquivAlgEquiv H) t + +/-- States the theorem `fixedFieldQuotientImage_herbrandFunction`. -/ +theorem fixedFieldQuotientImage_herbrandFunction + [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (fixedFieldQuotientImageFiltration F H)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) s := by + let : Fintype Gal(IntermediateField.fixedField H/K) := + Fintype.ofFinite Gal(IntermediateField.fixedField H/K) + exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_herbrandFunction F H + (IsGalois.normalAutEquivQuotient H) s + +/-- States the theorem `fixedFieldQuotientImage_inverseHerbrandFunction`. -/ +theorem fixedFieldQuotientImage_inverseHerbrandFunction + [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldQuotientImageFiltration F H)) t = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) t := by + let : Fintype Gal(IntermediateField.fixedField H/K) := + Fintype.ofFinite Gal(IntermediateField.fixedField H/K) + exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..1004be9cea --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification +import Mathlib.Algebra.Order.Floor.Ring +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. +-/ + +noncomputable section + +universe u + +namespace RamificationTheory.DiscreteValuationField +namespace AntitoneNormalSubgroupFiltration + +variable {G : Type u} [Group G] [Finite G] +variable (F : AntitoneNormalSubgroupFiltration G) + +local instance subgroupFintype (H : Subgroup G) : Fintype H := + Fintype.ofFinite H + +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..391e29130d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +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. +-/ + +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`. -/ +@[simp] 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 + [Finite G] (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`. -/ +@[simp] 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 + [Finite G] [Finite G'] + (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 : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (transportEquiv F e)) s = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s := by + apply RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (transportEquiv F e)) t = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t := by + apply (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono (transportEquiv F e)).injective + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] + rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv F)] + rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (quotientImageTransport F H e)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : ℝ) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (quotientImageTransport F H e)) t = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..e90ac7ade4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.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 +-/ + +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. +-/ + +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} + +noncomputable local instance subgroupFintype [Finite G] : Fintype H := + Fintype.ofFinite H + +noncomputable local instance groupFintype [Finite G] : Fintype G := + Fintype.ofFinite G + +noncomputable local instance quotientFiberFintype [Finite G] (q : G ⧸ H) : + Fintype (QuotientFiber H q) := + Fintype.ofFinite (QuotientFiber H q) + +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..c0fc333b33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction +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..0bedd9adc4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +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`. +-/ + +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 := absoluteValueExtension_algebraicCompletionClosure vK + let τ : L →ₐ[K] A := absoluteValueExtension_embeddingOfExtension vK w + let τ' : L →ₐ[K] A := absoluteValueExtension_embeddingOfExtension 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 + absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (τ' x) = + absoluteValueExtension_algebraicClosureAbsoluteValue 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..7837480d37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean @@ -0,0 +1,624 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +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. +-/ + +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 + +@[simp] 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 + +@[simp] 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..cc2c3383b6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +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. +-/ + +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 +private 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 galoisPullback_galoisPullback : (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 (galoisPullback_galoisPullback 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 galoisPullback_absoluteValueDecompositionGroupMap (w' : AbsoluteValue L' ℝ) : + absoluteValueDecompositionGroup K' w' →* + absoluteValueDecompositionGroup K (w'.comp (f := tauL) tauL.injective) where + toFun sigma := + ⟨galoisPullback_galoisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + intro x + change w' (tauL + (galoisPullback_galoisPullback 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 (galoisPullback_galoisPullback tauK tauL hsquare) + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullback_galoisPullback tauK tauL hsquare) + (sigma : L' ≃ₐ[K'] L') (rho : L' ≃ₐ[K'] L') + +namespace ValuationSubring + +open RamificationTheory.HilbertRamification.ValuationSubring + +variable (A' : _root_.ValuationSubring L') + +private 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, + ValuationTheory.DiscreteValuationField.ResidueField.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, + ValuationTheory.DiscreteValuationField.ResidueField.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 galoisPullback_decompositionGroupMap : + decompositionGroup K' A' →* + decompositionGroup K (pulledValuationSubring tauL A') where + toFun sigma := + ⟨galoisPullback_galoisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + ext x + rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] + change tauL + ((galoisPullback_galoisPullback 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 (galoisPullback_galoisPullback tauK tauL hsquare) + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullback_galoisPullback tauK tauL hsquare) + (sigma : L' ≃ₐ[K'] L') (rho : L' ≃ₐ[K'] L') + +private theorem decompositionGroupMap_commutes + (sigma : decompositionGroup K' A') (x : L) : + tauL ((((galoisPullback_decompositionGroupMap 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 galoisPullback_inertiaGroupMap : + inertiaGroup K' A' →* + inertiaGroup K (pulledValuationSubring tauL A') where + toFun sigma := by + let delta := galoisPullback_decompositionGroupMap tauK tauL hsquare A' + (sigma : decompositionGroup K' A') + refine ⟨delta, ?_⟩ + 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 (galoisPullback_decompositionGroupMap tauK tauL hsquare A') + map_mul' sigma rho := by + apply Subtype.ext + exact map_mul (galoisPullback_decompositionGroupMap tauK tauL hsquare A') + (sigma : decompositionGroup K' A') (rho : decompositionGroup K' A') + +private theorem inertiaGroupMap_commutes + (sigma : inertiaGroup K' A') (x : L) : + tauL (((((galoisPullback_inertiaGroupMap 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 [galoisPullback_inertiaGroupMap] 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') + ((galoisPullback_inertiaGroupMap 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') + ((galoisPullback_inertiaGroupMap 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 galoisPullback_ramificationGroupMap : + ramificationGroup K' A' →* + ramificationGroup K (pulledValuationSubring tauL A') := + ((galoisPullback_inertiaGroupMap 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') + ((galoisPullback_inertiaGroupMap 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..4ec3135659 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -0,0 +1,952 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup + +/-! # Character Map -/ +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`. -/ +@[simp] 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 + show + (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 + show + (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`. -/ +@[simp] 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`. -/ +@[simp] 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 + show + 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`. -/ +@[simp] 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 + show + 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`. -/ +@[simp] 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`. -/ +@[simp] 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`. -/ +@[simp] 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`. -/ +@[simp] 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`. -/ +@[simp] 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 + show + 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..0571df6773 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean @@ -0,0 +1,504 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.Exact.Basic +import Mathlib.FieldTheory.Galois.IsGaloisGroup +import Mathlib.GroupTheory.GroupAction.Quotient +import Mathlib.RingTheory.Invariant.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +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. +-/ + +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`. -/ +@[simp] +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`. -/ +@[simp] +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..1baa7917ba --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.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 +-/ + +import Mathlib.Algebra.Group.Subgroup.Finite +import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +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. +-/ + +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..085e698533 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +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. +-/ + +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) + +@[simp] 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..21babf0999 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.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 +-/ + +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. +-/ + +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..10a787239a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +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. +-/ + +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) + +local instance proposition98CompletionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +local instance proposition98CompletionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +local instance proposition98CompletionAlgebra : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +private abbrev localization : IntermediateField vK.Completion w.1.Completion := + AbsoluteValue.algebraicLocalization vK w.1 w.2 + +private abbrev toLocalization : L →+* localization vK w := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + +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 decompositionField_toLocalizationAlgHom : + 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 + (decompositionField_toLocalizationAlgHom vK w x) := + (Algebra.IsSeparable.isSeparable K x).map + (decompositionField_toLocalizationAlgHom vK w) + (decompositionField_toLocalizationAlgHom 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 := decompositionField_toLocalizationAlgHom 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 decompositionField_completionImageSubfield : + 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 : + (decompositionField_completionImageSubfield 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 ⊓ + decompositionField_completionImageSubfield vK w = + (absoluteValueDecompositionField K w.1).toSubfield.map + (toLocalization vK w) := by + calc + (toLocalization vK w).fieldRange ⊓ + decompositionField_completionImageSubfield vK w = + decompositionField_completionImageSubfield vK w ⊓ + (toLocalization vK w).fieldRange := by rw [inf_comm] + _ = ((decompositionField_completionImageSubfield vK w).comap + (toLocalization vK w)).map (toLocalization vK w) := + (Subfield.map_comap_eq (toLocalization vK w) + (decompositionField_completionImageSubfield 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 decompositionField_baseValuationSubring + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + _root_.ValuationSubring K := + absoluteValueValuationSubring vK hv + +/-- The valuation subring of `w|Z_w`. -/ +abbrev decompositionField_decompositionFieldValuationSubring + (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 decompositionField_decompositionField_integerMap + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + decompositionField_baseValuationSubring vK hv →+* + decompositionField_decompositionFieldValuationSubring vK w hv := by + let Z := absoluteValueDecompositionField K w.1 + let AK := decompositionField_baseValuationSubring vK hv + let AZ := decompositionField_decompositionFieldValuationSubring 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 : decompositionField_baseValuationSubring vK hv) : + ((decompositionField_decompositionField_integerMap vK w hv x : + decompositionField_decompositionFieldValuationSubring 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 (decompositionField_decompositionField_integerMap 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 decompositionField_decompositionField_residueMap + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + IsLocalRing.ResidueField (decompositionField_baseValuationSubring vK hv) →+* + IsLocalRing.ResidueField + (decompositionField_decompositionFieldValuationSubring vK w hv) := + IsLocalRing.ResidueField.map + (decompositionField_decompositionField_integerMap 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 + (decompositionField_decompositionField_residueMap vK w hv) := by + let Z := absoluteValueDecompositionField K w.1 + let AK := decompositionField_baseValuationSubring vK hv + let AZ := decompositionField_decompositionFieldValuationSubring vK w hv + let f := decompositionField_decompositionField_integerMap 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 [ValuationTheory.DiscreteValuationField.ResidueField.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 decompositionField_decompositionField_residueFieldEquiv + (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : + IsLocalRing.ResidueField (decompositionField_baseValuationSubring vK hv) ≃+* + IsLocalRing.ResidueField + (decompositionField_decompositionFieldValuationSubring vK w hv) := + ValuationTheory.DiscreteValuationField.ResidueField.ringEquivOfSurjective + (decompositionField_decompositionField_integerMap 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 + (decompositionField_baseValuationSubring vK hv)) : + decompositionField_decompositionField_residueFieldEquiv vK hvK w hv x = + decompositionField_decompositionField_residueMap 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..14774ece9d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +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. +-/ + +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..a8ef59cc23 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants +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..089091831b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean @@ -0,0 +1,569 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.NumberTheory.RamificationInertia.Galois +import Mathlib.NumberTheory.RamificationInertia.Inertia +import Mathlib.Algebra.Exact.Basic +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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.IsMaximal] (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 dedekindDecomposition_primesOverEquivQuotientDecompositionGroup + (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 dedekindRamification_decompositionQuotientInertiaEquivResidueGalois + (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 dedekindRamification_decompositionGroupEquivResidueGalois_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 = ⊥) : + 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 dedekindRamification_residueGaloisEmbeddingIntoG_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 = ⊥) : + ((B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) →* G := + (decompositionGroup P G).subtype.comp + (dedekindRamification_decompositionGroupEquivResidueGalois_of_inertiaGroup_eq_bot + 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 + (dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot p P G hI) := by + intro σ τ hστ + apply (dedekindRamification_decompositionGroupEquivResidueGalois_of_inertiaGroup_eq_bot + p P G hI).symm.injective + exact Subtype.ext <| by + simpa [dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot] 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 + (dedekindRamification_decompositionQuotientInertiaEquivResidueGalois + (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..1eb04a9c31 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.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 +-/ + +import Mathlib.LinearAlgebra.FreeModule.IdealQuotient +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes +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. +-/ + +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] [NumberField K] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois 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] [NumberField K] + [Field M] [NumberField M] [Algebra K M] + [FiniteDimensional K M] [IsGalois 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..af425e120e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.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 +-/ + +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. +-/ + +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..955df51e8d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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 dedekindTower_decompositionGroupEquivGalDecompositionField + (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) : + dedekindTower_decompositionGroupEquivGalDecompositionField + (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 + (dedekindTower_decompositionGroupEquivGalDecompositionField + (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. -/ +@[simp] +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), + dedekindTower_decompositionGroupEquivGalDecompositionField + (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 := + dedekindTower_decompositionGroupEquivGalDecompositionField + (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 : + dedekindTower_decompositionGroupEquivGalDecompositionField + (K := K) (L := L) G P τ ∈ + inertiaGroupOverDecompositionField (K := K) (L := L) G P := by + exact ⟨τ, hτ, rfl⟩ + simpa [τ] using hx + (dedekindTower_decompositionGroupEquivGalDecompositionField + (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 dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (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) + (dedekindTower_decompositionGroupEquivGalDecompositionField + (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 + (dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (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 dedekindRamification_galInertiaFieldOverDecompositionEquivResidueGalois + (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 := + (dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (K := K) (L := L) G P).symm.trans + (dedekindRamification_decompositionQuotientInertiaEquivResidueGalois + (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, + ⟨dedekindRamification_galInertiaFieldOverDecompositionEquivResidueGalois + (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..f0e386310a --- /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 +-/ + +import Mathlib.NumberTheory.NumberField.Discriminant.Different +import Mathlib.NumberTheory.NumberField.Ideal.Basic +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. +-/ + +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..f7640f4879 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.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 +-/ + +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. +-/ + +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. -/ +@[simp] +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. -/ +@[simp] +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. -/ +@[simp] +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..411eabcfd9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.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 +-/ + +import Mathlib.NumberTheory.RamificationInertia.Unramified +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality +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. +-/ + +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..2f883838e7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.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 +-/ + +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. +-/ + +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..4207ee755a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.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 +-/ + +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`. +-/ + +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] [NumberField F] + [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 + +/-- 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 inertiaField_algebra_decompositionField + (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..776d6ba804 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.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 +-/ + +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. +-/ + +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.IsMaximal] + (P : Ideal B) [P.IsMaximal] [P.LiesOver p] + (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..5039137123 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import Mathlib.NumberTheory.RamificationInertia.Galois +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. +-/ + +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..789ec998b5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.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 +-/ + +import Mathlib.FieldTheory.Galois.Profinite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +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. +-/ + +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 (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..5e20abf706 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.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 +-/ + +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. +-/ + +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 + [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) : + 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 + [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) : + 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 => + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..7507e00ba7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +import Mathlib.Algebra.CharP.Reduced +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. +-/ + +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..005400d964 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.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 +-/ + +import Mathlib.GroupTheory.OrderOfElement +import Mathlib.Order.Iterate +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap + +/-! # Finite Order Valuation -/ +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..d70c0bc55e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion +import Mathlib.Algebra.Group.Subgroup.Finite +import Mathlib.Algebra.CharP.Defs +import Mathlib.Data.Nat.Factorization.Basic +import Mathlib.GroupTheory.OrderOfElement +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. +-/ + +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..883fbacf65 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF +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. +-/ + +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..2a74be6d11 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +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. +-/ + +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..7d9062757d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -0,0 +1,560 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +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. +-/ + +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)) [H.Normal] : + ((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 [RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth.depthLowerFiltration_lower, + RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth.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..7f59fe4f25 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +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. +-/ + +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 [ValuationSubring.integer_valuation, _root_.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)) [H.Normal] : + 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..6dbbef2283 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +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`. +-/ + +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..ba3608c829 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +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. +-/ + +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] + +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 : ℝ) : ℝ := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 = + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) t := + rfl + +/-- States the theorem `herbrandFunctionOfUniqueExtension_psi`. -/ +@[simp] 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 := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction + (lowerRamificationFiltrationOfUniqueExtension + (base := base) (target := target) huniq) t + +/-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_eta`. -/ +@[simp] 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 := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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) := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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) := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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`. -/ +@[simp] 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 := + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..8130be9ed4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.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 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +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. +-/ + +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] +noncomputable local instance lowerMembershipDecidable + {G : Type*} [Group G] (F : AntitoneNormalSubgroupFiltration G) + (n : ℕ) (sigma : G) : Decidable (sigma ∈ F.lower n) := + Classical.propDecidable _ + +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] [Fintype 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 [hsigma] + exact_mod_cast (by omega : k = 1 + (k - 1)) + +private theorem truncate_depth_eq_zero_of_not_mem_lower_zero + {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} + (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] [Fintype 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 + 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) : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 + + + +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] [Fintype 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) = + 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] [Fintype G] + (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + {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 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] [Fintype 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 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] [Fintype 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 F := D.depthLowerFiltration H + change (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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)) [H.Normal] (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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) + rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : ℝ, + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) + apply (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).injective + rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..846cdf11dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +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. +-/ + +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..5879174bf5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.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 +-/ + +import Mathlib.Algebra.Group.Subgroup.Finite +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. +-/ + +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..c2ca76c6af --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +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. +-/ + +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, + ValuationTheory.DiscreteValuationField.ResidueField.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, + ValuationTheory.DiscreteValuationField.ResidueField.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) + +local instance completionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +local instance completionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +local instance completionAlgebra : Algebra vK.Completion w.1.Completion := + AbsoluteValue.completionAlgebra vK w.1 w.2 + +private abbrev localization : IntermediateField vK.Completion w.1.Completion := + AbsoluteValue.algebraicLocalization vK w.1 w.2 + +private abbrev toLocalization : L →+* localization vK w := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + +private 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) + +private abbrev extensionValuationSubring + (hw : LubinTate.Valuations.NonarchimedeanAbsoluteValue w.1) : + _root_.ValuationSubring L := + absoluteValueValuationSubring w.1 hw + +private 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..33e89d2c37 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +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`. +-/ + +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) + +local instance irCompletionBaseAlgebra : Algebra K w.1.Completion := + AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 + +local instance irCompletionBaseSMul : SMul K w.1.Completion := + (AbsoluteValue.extensionCompletionAlgebra (K := K) w.1).toSMul + +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 localizationRamificationGroups_localization : + 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 (localizationRamificationGroups_localization 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 localizationRamificationGroups_absoluteValueDecompositionGroupEquiv : + absoluteValueDecompositionGroup K w.1 ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw) where + toFun sigma := + ⟨(sigma : L ≃ₐ[K] L), + 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 : localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization 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 localizationRamificationGroups_localDecompositionGroupEquiv : + (localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization vK w) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) where + toFun tau := + ⟨tau, 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 localizationRamificationGroups_valuationDecompositionGroupEquiv : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw) ≃* + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw) := + (localizationRamificationGroups_absoluteValueDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm.trans + ((decompositionGroupEquivAlgebraicLocalizationAut vK hvK w).trans + (localizationRamificationGroups_localDecompositionGroupEquiv + vK (hvK := hvK) w hw)) + +@[simp] theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization + (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K + (absoluteValueExtensionValuationSubring vK w hw)) + (x : L) : + (((localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization 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 + ((localizationRamificationGroups_absoluteValueDecompositionGroupEquiv + 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)) : + localizationRamificationGroups_valuationDecompositionGroupEquiv + 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) + (localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma)).mp hsigma xLocal + have hlocal : + AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (((localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization vK w) + (xLocal : localizationRamificationGroups_localization vK w) - + (xLocal : localizationRamificationGroups_localization 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 + (((localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma : + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (algebraicLocalizationValuationSubring vK w hw)) : + localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization vK w) + (xLocal : localizationRamificationGroups_localization vK w) - + (xLocal : localizationRamificationGroups_localization 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 + (localizationRamificationGroups_valuationDecompositionGroupEquiv + 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 := + ⟨localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw sigma, + (localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_inertia_iff + vK hvK w hw sigma).mpr sigma.property⟩ + invFun tau := by + let sigma := (localizationRamificationGroups_valuationDecompositionGroupEquiv + 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 (localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw).symm_apply_apply sigma + right_inv tau := by + apply Subtype.ext + exact (localizationRamificationGroups_valuationDecompositionGroupEquiv + vK (hvK := hvK) w hw).apply_symm_apply tau + map_mul' sigma tau := by + apply Subtype.ext + exact map_mul (localizationRamificationGroups_valuationDecompositionGroupEquiv + 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)) : + localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization 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 →+* localizationRamificationGroups_localization vK w := + AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 + let xLocal : (localizationRamificationGroups_localization 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 : + (localizationRamificationGroups_localization vK w)ˣ) : + localizationRamificationGroups_localization 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 : + (localizationRamificationGroups_localization vK w)ˣ) : + localizationRamificationGroups_localization 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 localizationRamificationGroups_ramificationGroupEquiv : + 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 localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] + localizationRamificationGroups_localization vK w from + (((localizationRamificationGroups_ramificationGroupEquiv 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..a9a66754b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean @@ -0,0 +1,594 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial +import Mathlib.NumberTheory.RamificationInertia.Inertia +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. +-/ + +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..5462a460bb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean @@ -0,0 +1,545 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification +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. +-/ + +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) + exact congrArg Subtype.val (by simpa [c] using hmap) + +/-- 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..a99c7d462c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization +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]`. +-/ + +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..20d4e6c370 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.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 +-/ + +import Mathlib.Algebra.Polynomial.Eval.Defs +import Mathlib.Algebra.Ring.GeomSum +import Mathlib.RingTheory.Ideal.Defs +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. +-/ + +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..4dbee5d92b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.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 +-/ + +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. + +-/ + +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. -/ +@[simp] 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..3e5dae7b62 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +/-! +# General-DVF ramification numbers as a nonarchimedean depth +-/ + +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..218869f32a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +/-! # Ramification Group -/ +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`. -/ +@[simp] 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`. -/ +@[simp] 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..9e0145d66f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean @@ -0,0 +1,294 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +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. +-/ + +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..75e303d277 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -0,0 +1,335 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.SetTheory.Cardinal.Finite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber +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. +-/ + +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] + +local instance galoisFintype : Fintype Gal(L/K) := + Fintype.ofFinite Gal(L/K) + +local instance subgroupFintype (H : Subgroup Gal(L/K)) : Fintype H := + Fintype.ofFinite H + +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 + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = m := by + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = k - 1 := by + rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [hmem] + 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, + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_succ_eq_sum_indicator F) m).symm + change Finset.sum Finset.univ (fun sigma : F.lower 0 => + (1 : ℝ) + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_depth_sum_of_mem_Icc F) m hms hsm] + field_simp + ring + · have hsle : s ≤ 0 := le_of_not_ge hs0 + rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..77192429f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +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. +-/ + +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..009851d1cf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +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. +-/ + +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..f9c1e204c9 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +import Mathlib.Algebra.Order.Archimedean.Real.Basic +import Mathlib.RingTheory.Valuation.Extension +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`. +-/ + +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..718866b559 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean @@ -0,0 +1,460 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant + +/-! # Residue Exact Sequence -/ +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`. -/ +@[simp] 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..e944596684 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -0,0 +1,1062 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 [div_eq_mul_inv] + 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`. -/ +@[simp] 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..fddb4c090f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +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. +-/ + +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..f7de124ce4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.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 +-/ + +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. +-/ + +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..bb8933cc86 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +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`. +-/ + +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..2a93c09d54 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean @@ -0,0 +1,753 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.Exact.Basic +import Mathlib.Algebra.Group.Units.Equiv +import Mathlib.Algebra.Group.Subgroup.Map +import Mathlib.FieldTheory.Galois.Basic +import Mathlib.GroupTheory.QuotientGroup.Basic +import Mathlib.RingTheory.Valuation.RamificationGroup + +/-! # Valuation Subring -/ +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`. -/ +@[simp] 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`. -/ +@[simp] 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`. -/ +@[simp] 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 ramificationGroupEquivGalRamificationField_of_finiteDimensional + [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`. -/ +@[simp] 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 decompositionGroupEquivGalDecompositionField_of_finiteDimensional + [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) : + decompositionGroupEquivGalDecompositionField_of_finiteDimensional (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 + (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (K := K) A).toMonoidHom + (inertiaGroup K A) + +/-- States the theorem `mem_inertiaGroupOverDecompositionField_iff`. -/ +@[simp] theorem mem_inertiaGroupOverDecompositionField_iff + [FiniteDimensional K L] (A : _root_.ValuationSubring L) + (σ : L ≃ₐ[decompositionField K A] L) : + σ ∈ inertiaGroupOverDecompositionField (K := K) A ↔ + ∃ τ : inertiaGroup K A, + decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (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 := + decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (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τ : + decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (K := K) A (τ : decompositionGroup K A) ∈ + inertiaGroupOverDecompositionField (K := K) A := by + exact ⟨(τ : decompositionGroup K A), τ.property, rfl⟩ + simpa using hx + (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (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 +inertiaGroupOverDecompositionFieldEquivGalInertiaFieldOverDecompositionField_of_finiteDimensional + [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 decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + [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 decompositionGroupQuotientInertiaEquivGalDecompositionQuotient_of_finiteDimensional + [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) + (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (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 decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + decompositionGroup K A ⧸ inertiaGroup K A ≃* + (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] + inertiaFieldOverDecompositionField K A) := + (decompositionGroupQuotientInertiaEquivGalDecompositionQuotient_of_finiteDimensional + (K := K) A).trans + (decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + (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 inertiaGroupInAutEquivGalInertiaField_of_finiteDimensional + [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`. -/ +@[simp] 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 galInertiaFieldOverDecompositionEquivResidueActionRange_of_finiteDimensional + [FiniteDimensional K L] (A : _root_.ValuationSubring L) : + (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] + inertiaFieldOverDecompositionField K A) ≃* + (residueAction K A).range := + (decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + (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..8290d3a1a4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.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 +-/ + +import Mathlib.Algebra.Group.Subgroup.Finite +import Mathlib.Algebra.Group.Subgroup.Lattice +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. +-/ + +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..c7f636f8b3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard +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..99d059a22d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.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 +-/ + +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. +-/ + +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 + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..189f2aff05 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -0,0 +1,1045 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction +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. +-/ + +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 + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + change r x ∈ IsLocalRing.maximalIdeal targetM.valuationSubring + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro h + have h' := h.map r.symm.toRingHom + exact hx (by simpa using h') + · intro y hy + obtain ⟨x, rfl⟩ := r.surjective y + apply Ideal.mem_map_of_mem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro h + exact hy (h.map r.toRingHom) + 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 + constructor + · intro hx + have hrx : + r x ∈ Ideal.map + (r : pulled.valuationSubring →+* targetM.valuationSubring) + (realRamificationIdeal pulled.toDVF s) := + Ideal.mem_map_of_mem + (r : pulled.valuationSubring →+* targetM.valuationSubring) hx + simpa only [hmapIdeal s] using hrx + · intro hrx + have hrx' : + r x ∈ Ideal.map + (r : pulled.valuationSubring →+* targetM.valuationSubring) + (realRamificationIdeal pulled.toDVF s) := by + simpa only [hmapIdeal s] using hrx + exact Ideal.apply_mem_of_equiv_iff.mp hrx' + 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 + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 := by + intro a + apply Subtype.ext + exact e.symm_apply_apply (a : IntermediateField.fixedField H) + right_inv := by + intro a + apply Subtype.ext + exact e.apply_symm_apply (a : M) + map_mul' := by + intro a b + apply Subtype.ext + exact e.map_mul (a : IntermediateField.fixedField H) + (b : IntermediateField.fixedField H) + map_add' := by + intro a b + apply Subtype.ext + exact 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 + apply le_antisymm + · rw [Ideal.map_le_iff_le_comap] + intro x hx + change r x ∈ IsLocalRing.maximalIdeal targetM.valuationSubring + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ + intro h + have h' := h.map r.symm.toRingHom + exact hx (by simpa using h') + · intro y hy + obtain ⟨x, rfl⟩ := r.surjective y + apply Ideal.mem_map_of_mem + rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ + intro h + exact hy (h.map r.toRingHom) + 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 + constructor + · intro hx + have hrx : + r x ∈ Ideal.map (r : B →+* targetM.valuationSubring) + (fixedFieldRamificationIdealDVF + (K := K) (target := targetL.toDVF) H s) := + Ideal.mem_map_of_mem (r : B →+* targetM.valuationSubring) hx + simpa only [hmapIdeal s] using hrx + · intro hrx + have hrx' : + r x ∈ Ideal.map (r : B →+* targetM.valuationSubring) + (fixedFieldRamificationIdealDVF + (K := K) (target := targetL.toDVF) H s) := by + simpa only [hmapIdeal s] using hrx + exact Ideal.apply_mem_of_equiv_iff.mp hrx' + 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 + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 [qEquiv, eFixed, eEF, EF, H, AlgEquiv.autCongr_apply, + IsGalois.normalAutEquivQuotient_apply] + 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 + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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..ed75c9c350 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +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. +-/ + +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..1ee3ef7450 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +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. +-/ + +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..a86d5b9c9e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified +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. +-/ + +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..2028f56a26 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.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 +-/ + +import Mathlib.FieldTheory.Galois.Profinite +import Mathlib.RingTheory.Invariant.Profinite + +/-! # Profinite Invariant -/ +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..8ffcabe483 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +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..4c0f66eaed --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory +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..6f501ce4e5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +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..b1204098dc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import Mathlib.RingTheory.Complex +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. +-/ + +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. -/ +@[simp] +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. -/ +private noncomputable def algebraicExtension_archimedean + {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. -/ +private noncomputable def algebraicExtension_nonarchimedean + {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 algebraicExtension_nonarchimedean + v hcomplete hnonarch hv + · exact algebraicExtension_archimedean + 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..71467aa196 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean @@ -0,0 +1,1271 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import Mathlib.Analysis.Normed.Unbundled.SpectralNorm +import Mathlib.RingTheory.Norm.Transitivity +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. +-/ + +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 finiteNormExtension_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) : 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) : + finiteNormExtension_finite_normFormulaAbsoluteValue (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) : + finiteNormExtension_finite_normFormulaAbsoluteValue (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) : + finiteNormExtension_finite_normFormulaAbsoluteValue (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 + (finiteNormExtension_finite_normFormulaAbsoluteValue (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 = finiteNormExtension_finite_normFormulaAbsoluteValue (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 finiteNormExtension_nonarchimedean_finite_extension + {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 := + finiteNormExtension_finite_normFormulaAbsoluteValue (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 finiteNormExtension_archimedean_finite_extension + {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 finiteNormExtension_finite_extension + {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 finiteNormExtension_nonarchimedean_finite_extension + v hcomplete hnonarch hv + · exact finiteNormExtension_archimedean_finite_extension + 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..ababbdf012 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +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. +-/ + +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..977ee10e04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.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 +-/ + +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. +-/ + +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 normFormula_finite_normFormulaAbsoluteValue_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)) : + 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) : + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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) : + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (K := K) (L := L) v hnonarch hv) := by + refine LubinTate.Valuations.nonarchimedean_of_strong_triangle + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_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 + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_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 + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_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..49a511896f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +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. +-/ + +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..40d6e53bcb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +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). +-/ + +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] + +/-- 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 := + ValuationTheory.DiscreteValuationField.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 + DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (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 + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (K := K) (L := L) v hnonarch hv) + (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean + (K := K) (L := L) v hnonarch hv)) : + w = + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (K := K) (L := L) v hnonarch hv := by + ext x + let rAbs := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 + +/-- 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 := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 := + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (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 := + DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (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 := + DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (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..3d0410297d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +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. +-/ + +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..32acc08e4c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -0,0 +1,1568 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +import Mathlib.LinearAlgebra.Dimension.Finrank +import Mathlib.LinearAlgebra.Dimension.Free +import Mathlib.Algebra.Order.WithTop.Untop0 +import Mathlib.GroupTheory.Index +import Mathlib.Data.ZMod.QuotientGroup +import Mathlib.Algebra.Algebra.Tower +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. +-/ + +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] [Algebra K 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] + [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))) : + LinearIndependent K + (fun p : I × J ↦ (omega p.2 : L) * pi p.1) := by + 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] [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) (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 + 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] [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) (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 + 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..e370b23172 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +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. +-/ + +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..83198a960d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.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 +-/ + +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. +-/ + +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..e41affab00 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +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. +-/ + +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) + (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..2df99ae1f6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.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 +-/ + +import Mathlib.Analysis.Normed.Field.WithAbs +import Mathlib.Analysis.SpecialFunctions.Pow.Real +import Mathlib.RingTheory.Norm.Defs +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. +-/ + +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] [FiniteDimensional 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..5eea81ee04 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import Mathlib.Analysis.Normed.Field.Instances +import Mathlib.Analysis.Normed.Module.Completion +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. +-/ + +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. -/ +@[simp] +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) + +private 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) + (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) + (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] + +private 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) + (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) + (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`. -/ +@[simp] +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..4a52c9a669 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.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 +-/ + +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|`. +-/ + +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..039dc2fb24 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.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 +-/ + +import Mathlib.Algebra.Algebra.Basic +import Mathlib.Basic.Real.Basic +import Mathlib.Topology.UniformSpace.AbsoluteValue +/-! +# Extensions of absolute values + +A reusable predicate for exact extension along an algebra map. +-/ +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..e5514171d4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.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 +-/ + +import Mathlib.Analysis.AbsoluteValue.Equivalence +import Mathlib.Analysis.SpecialFunctions.Pow.Continuity +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. +-/ + +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..d2b776f42c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean @@ -0,0 +1,1170 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import Mathlib.Analysis.Normed.Algebra.GelfandMazur +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. +-/ + +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..fffaebe524 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +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. +-/ + +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..5d99cabc5b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +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. +-/ + +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 := + 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 := 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..d5a2346cc7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean @@ -0,0 +1,11 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +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..6ac2d7c458 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean @@ -0,0 +1,753 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Analysis.AbsoluteValue.Equivalence +import Mathlib.Algebra.Order.Ring.IsNonarchimedean +import Mathlib.NumberTheory.Ostrowski +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. +-/ + +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*} [Fintype ι] + (v : ι → AbsoluteValue K ℝ) (a : ι → K) {δ : ℝ} (hδ : 0 < δ) : + ∃ η : ℝ, 0 < η ∧ ∀ i j, v i (a j) * η < δ := by + 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*} [Fintype ι] + (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.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..a8186ac07b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean @@ -0,0 +1,844 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations +/-! Provides the public declarations in the `ValuationTheory.AbsoluteValue.Theory` Lean module. -/ + +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 residue_addEquiv_maximalIdeal_pow_quotient + {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 residue_addEquiv_uniformizerPowerIdeal_quotient + {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 residue_addEquiv_maximalIdeal_pow_quotient 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 units_quotient_equiv + {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ˣ) : + units_quotient_equiv 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 higher_unit_graded_equiv + {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..3aba89de2e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean @@ -0,0 +1,1541 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues +import Mathlib.GroupTheory.QuotientGroup.Basic +import Mathlib.RingTheory.DiscreteValuationRing.Basic +import Mathlib.RingTheory.Henselian +import Mathlib.RingTheory.Ideal.IsPrincipalPowQuotient +import Mathlib.RingTheory.Valuation.ValuationSubring +/-! Provides the public declarations in the `ValuationTheory.AbsoluteValue.Theory.ExponentialValuations` Lean module. -/ + +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. -/ +@[simp] +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..1dc3c271ee --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import Mathlib.Algebra.Polynomial.Lifts +import Mathlib.RingTheory.LocalRing.ResidueField.Basic +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. +-/ + +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..7bd4e1c5aa --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +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..6e5f7b440f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import Mathlib.Analysis.Normed.Field.Instances +import Mathlib.Analysis.Normed.Module.Completion +import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +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. +-/ + +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 absoluteValueExtension_algebraicCompletionClosure + {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 absoluteValueExtension_algebraicClosureAbsoluteValue + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + AbsoluteValue (absoluteValueExtension_algebraicCompletionClosure 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) : + absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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 absoluteValueExtension_localizationEmbedding + {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] + absoluteValueExtension_algebraicCompletionClosure 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 + (absoluteValueExtension_algebraicCompletionClosure vK) := + Module.isTorsionFree_iff_algebraMap_injective.mpr + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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 = + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtension_localizationEmbedding 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 : + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtension_localizationEmbedding vK w).injective = R.extension := by + apply R.unique + intro x + change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + (absoluteValueExtension_localizationEmbedding vK w + (algebraMap vK.Completion (AbsoluteValue.algebraicLocalization vK w.1 w.2) x)) = _ + rw [(absoluteValueExtension_localizationEmbedding 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 absoluteValueExtension_pullback + {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] + (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) + (tau : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK) : + AbsoluteValue L ℝ := + (absoluteValueExtension_algebraicClosureAbsoluteValue 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] absoluteValueExtension_algebraicCompletionClosure vK) : + AbsoluteValue.Extends vK (absoluteValueExtension_pullback vK hvK tau) := by + intro x + change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + (tau (algebraMap K L x)) = vK x + rw [tau.commutes, + IsScalarTower.algebraMap_apply K vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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 Ω] [IsAlgClosed Ω] + (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (u : AbsoluteValueExtension vK L) : + AbsoluteValueExtension vK Ω := by + let τ : + Ω →ₐ[L] + absoluteValueExtension_algebraicCompletionClosure u.1 := + IsAlgClosed.lift + let wΩ : AbsoluteValue Ω ℝ := + absoluteValueExtension_pullback + 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 + absoluteValueExtension_pullback + 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 absoluteValueExtension_embeddingOfExtension + {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] absoluteValueExtension_algebraicCompletionClosure 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 := absoluteValueExtension_localizationEmbedding 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 + (absoluteValueExtension_algebraicCompletionClosure 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) : + absoluteValueExtension_embeddingOfExtension vK w x = + absoluteValueExtension_localizationEmbedding 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 = absoluteValueExtension_pullback vK hvK + (absoluteValueExtension_embeddingOfExtension 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 + _ = absoluteValueExtension_pullback vK hvK + (absoluteValueExtension_embeddingOfExtension vK w) x := by + change AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 + (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtension_localizationEmbedding 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] absoluteValueExtension_algebraicCompletionClosure vK, + w.1 = absoluteValueExtension_pullback vK hvK tau := by + exact ⟨absoluteValueExtension_embeddingOfExtension 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] absoluteValueExtension_algebraicCompletionClosure vK) : Prop := + ∃ sigma : absoluteValueExtension_algebraicCompletionClosure vK ≃ₐ[vK.Completion] + absoluteValueExtension_algebraicCompletionClosure 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 : absoluteValueExtension_algebraicCompletionClosure vK + ≃ₐ[vK.Completion] absoluteValueExtension_algebraicCompletionClosure vK) + (x : absoluteValueExtension_algebraicCompletionClosure vK) : + absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (sigma x) = + absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK x := by + let R := AbsoluteValue.uniqueAlgebraicExtension + (K := vK.Completion) + (L := absoluteValueExtension_algebraicCompletionClosure vK) + (AbsoluteValue.completionAbsoluteValue vK) + (AbsoluteValue.completionAbsoluteValue_complete vK) + (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) + let a : AbsoluteValue (absoluteValueExtension_algebraicCompletionClosure vK) ℝ := + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp + (f := sigma.toRingHom) sigma.injective + have ha : a = absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK := by + change a = R.extension + apply R.unique + intro y + change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + (sigma (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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] absoluteValueExtension_algebraicCompletionClosure vK} + (hconj : AbsoluteValueExtensionConjugateOverCompletion vK tau tau') : + absoluteValueExtension_pullback vK hvK tau = + absoluteValueExtension_pullback vK hvK tau' := by + rcases hconj with ⟨sigma, hsigma⟩ + ext x + change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (tau x) = + absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (tau' x) + rw [hsigma x, absoluteValueExtension_algebraicClosureAbsoluteValue_algEquiv] + +/-- The dense embedding of `\bar K_v` into its metric completion. -/ +noncomputable def absoluteValueExtension_algebraicClosureToCompletionRingHom + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + absoluteValueExtension_algebraicCompletionClosure vK →+* + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + UniformSpace.Completion.coeRingHom.comp + (WithAbs.equiv + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK)).symm.toRingHom + +@[simp] +theorem absoluteValueExtension_algebraicClosureToCompletionRingHom_apply + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) + (x : absoluteValueExtension_algebraicCompletionClosure vK) : + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK x = + ((WithAbs.equiv + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK)).symm x : + (absoluteValueExtension_algebraicClosureAbsoluteValue 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 absoluteValueExtension_algebraicClosureCompletionAlgebra + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + Algebra vK.Completion + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + ((absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK))).toAlgebra + +/-- The dense algebraic-closure map as a `K_v`-algebra homomorphism. -/ +noncomputable def absoluteValueExtension_algebraicClosureToCompletionAlgHom + {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) + (hvK : vK.IsNontrivial) : + letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + absoluteValueExtension_algebraicCompletionClosure vK →ₐ[vK.Completion] + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := by + letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + exact + { __ := absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + commutes' _ := rfl } + +/-- A valuation-preserving `K`-embedding `tau` extends isometrically from +`L` to a map between metric completions. -/ +noncomputable def absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + {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] absoluteValueExtension_algebraicCompletionClosure vK) : + WithAbs w.1 →+* + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + (absoluteValueExtension_algebraicClosureToCompletionRingHom 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (x : WithAbs w.1) : + ‖absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau x‖ = ‖x‖ := by + change ‖absoluteValueExtension_algebraicClosureToCompletionRingHom 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + Isometry (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + 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 absoluteValueExtension_embeddingCompletionMap + {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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + w.1.Completion →+* + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + UniformSpace.Completion.extensionHom + (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (x : WithAbs w.1) : + absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (x : w.1.Completion) = + absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + vK hvK w tau x := + UniformSpace.Completion.extensionHom_coe + (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + Isometry (absoluteValueExtension_embeddingCompletionMap 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 ((absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK))) := by + apply AddMonoidHomClass.isometry_of_norm + intro x + change ‖absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK) x)‖ = ‖x‖ + rw [absoluteValueExtension_algebraicClosureToCompletionRingHom_apply, + UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs] + change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (x : vK.Completion) : + absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.completionMap vK w.1 w.2 x) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK) x) := by + let f := (absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau).comp + (AbsoluteValue.completionMap vK w.1 w.2) + let g := (absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure 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 absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.completionMap vK w.1 w.2 + (algebraMap K vK.Completion (WithAbs.equiv vK a))) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK) + (algebraMap K vK.Completion (WithAbs.equiv vK a))) + rw [AbsoluteValue.completionMap_coe] + change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (((algebraMap (WithAbs vK) (WithAbs w.1)) a : WithAbs w.1) : + w.1.Completion) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK) + (a : vK.Completion)) + rw [absoluteValueExtension_embeddingCompletionMap_coe] + change absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (tau (algebraMap K L (WithAbs.equiv vK a))) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + (algebraMap vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK) + (algebraMap K vK.Completion (WithAbs.equiv vK a))) + congr 1 + rw [tau.commutes, + IsScalarTower.algebraMap_apply K vK.Completion + (absoluteValueExtension_algebraicCompletionClosure vK)] + +/-- The completion extension of `tau`, bundled over `K_v`. -/ +noncomputable def absoluteValueExtension_embeddingCompletionAlgHom + {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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + w.1.Completion →ₐ[vK.Completion] + (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := by + letI := AbsoluteValue.completionAlgebra vK w.1 w.2 + letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + exact + { __ := absoluteValueExtension_embeddingCompletionMap 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (z : AbsoluteValue.algebraicLocalization vK w.1 w.2) : + letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau (z : w.1.Completion) + ∈ (absoluteValueExtension_algebraicClosureToCompletionAlgHom 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom 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 absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.toCompletion w.1 y) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK (tau y) + change absoluteValueExtension_embeddingCompletionMap 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 + (absoluteValueExtension_algebraicCompletionClosure 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 absoluteValueExtension_localizationEmbeddingOfPullback + {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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback 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] + absoluteValueExtension_algebraicCompletionClosure 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom 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] absoluteValueExtension_algebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtension_pullback 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 + absoluteValueExtension_localizationEmbeddingOfPullback 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 + let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau + let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom 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 absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + (AbsoluteValue.toCompletion w.1 x) = + absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK (tau x) + change absoluteValueExtension_embeddingCompletionMap 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] [Algebra.IsAlgebraic F E] + [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] absoluteValueExtension_algebraicCompletionClosure vK} + (h : absoluteValueExtension_pullback vK hvK tau = + absoluteValueExtension_pullback vK hvK tau') : + AbsoluteValueExtensionConjugateOverCompletion vK tau tau' := by + let w : AbsoluteValueExtension vK L := + ⟨absoluteValueExtension_pullback vK hvK tau, + absoluteValueExtension_pullback_extends vK hvK tau⟩ + have htau : w.1 = absoluteValueExtension_pullback vK hvK tau := rfl + have htau' : w.1 = absoluteValueExtension_pullback 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 := absoluteValueExtension_localizationEmbeddingOfPullback + vK hvK w tau htau + let phi' := absoluteValueExtension_localizationEmbeddingOfPullback + 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] absoluteValueExtension_algebraicCompletionClosure vK) : + absoluteValueExtension_pullback vK hvK tau = + absoluteValueExtension_pullback 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] absoluteValueExtension_algebraicCompletionClosure vK, + w.1 = absoluteValueExtension_pullback vK hvK tau) ∧ + (∀ tau tau' : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK, + absoluteValueExtension_pullback vK hvK tau = + absoluteValueExtension_pullback 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..ff404055a6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.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 +-/ + +import Mathlib.FieldTheory.PrimitiveElement +import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas +import Mathlib.RingTheory.AdjoinRoot +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. +-/ + +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] + show 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..b41311213e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.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 +-/ + +import Mathlib.LinearAlgebra.Charpoly.BaseChange +import Mathlib.LinearAlgebra.Trace +import Mathlib.RingTheory.Norm.Basic +import Mathlib.RingTheory.Trace.Basic +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`. +-/ + +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..8f50be6cbd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +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. +-/ + +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 completionTensorMap_leftCanonicalHom + {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 ↦ + absoluteValueExtension_localizationTensorHom 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 + completionTensorMap_leftCanonicalHom 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 completionTensorMap_canonicalHom + {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 := + completionTensorMap_leftCanonicalHom 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 + completionTensorMap_canonicalHom 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 [completionTensorMap_canonicalHom] + change completionTensorMap_leftCanonicalHom (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..e40537676f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition +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`. +-/ + +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 (completionTensorDecomposition_left 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 := completionTensorDecomposition_extensionFintype (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 := completionTensorDecomposition_extensionFintype (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) + (completionTensorDecomposition_left 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 := completionTensorDecomposition_extensionFintype (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 := completionTensorDecomposition_extensionFintype (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) + (completionTensorDecomposition_left 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 := completionTensorDecomposition_extensionFintype (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 := completionTensorDecomposition_extensionFintype (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) + (completionTensorDecomposition_left 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 := completionTensorDecomposition_extensionFintype (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 := completionTensorDecomposition_extensionFintype (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..e3098668c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean @@ -0,0 +1,1109 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization +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. +-/ + +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 completionExtensionFactor_completionPolynomial + {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 (completionExtensionFactor_completionPolynomial 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 + (completionExtensionFactor_completionPolynomial 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 completionExtensionFactor_minpolyFactorsEquivCompletionFactors + {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] absoluteValueExtension_algebraicCompletionClosure vK) := + Setoid.comap + (simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtension_algebraicCompletionClosure 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 completionExtensionFactor_embeddingClassesEquivMinpolyFactors + {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 := absoluteValueExtension_algebraicCompletionClosure vK) + α hα hgen + (Quotient.congr e (fun _ _ => Iff.rfl)).trans + (rootClassesEquivDistinctNormalizedFactors + (E := absoluteValueExtension_algebraicCompletionClosure 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] absoluteValueExtension_algebraicCompletionClosure 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] absoluteValueExtension_algebraicCompletionClosure 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] absoluteValueExtension_algebraicCompletionClosure vK) : + AbsoluteValueExtension vK L := + ⟨absoluteValueExtension_pullback 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] absoluteValueExtension_algebraicCompletionClosure vK) : + absoluteValueExtension_pullback vK hvK τ = + absoluteValueExtension_pullback 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 = absoluteValueExtension_pullback vK hvK + (absoluteValueExtension_embeddingOfExtension 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 completionExtensionFactor_extensionsEquivEmbeddingClasses + {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) + (absoluteValueExtension_embeddingOfExtension 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 + (absoluteValueExtension_embeddingOfExtension 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 completionExtensionFactor_extensionsEquivMinpolyFactors + {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)) := + (completionExtensionFactor_extensionsEquivEmbeddingClasses + vK hvK α hα hgen).trans + (completionExtensionFactor_embeddingClassesEquivMinpolyFactors + vK α hα hgen) + +/-- Auxiliary form with the particular chosen irreducible polynomial `f` as +target. -/ +noncomputable def completionExtensionFactor_extensionsEquivCompletionFactorsAux + {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 + (completionExtensionFactor_extensionsEquivMinpolyFactors + vK hvK α hα hgen).trans + (completionExtensionFactor_minpolyFactorsEquivCompletionFactors + 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 completionExtensionFactor_extensionFactor + {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) : + completionExtensionFactor_extensionFactor vK α w ∈ + polynomialDistinctNormalizedFactors + (completionExtensionFactor_completionPolynomial 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 : completionExtensionFactor_completionPolynomial vK f ≠ 0 := + (Polynomial.map_ne_zero_iff + (algebraMap K vK.Completion).injective).2 hf.ne_zero + have haf : Polynomial.aeval a + (completionExtensionFactor_completionPolynomial 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 [completionExtensionFactor_extensionFactor, + 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 completionExtensionFactor_extensionToFactor + {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 => ⟨completionExtensionFactor_extensionFactor 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 + (absoluteValueExtension_embeddingOfExtension vK w α) = + completionExtensionFactor_extensionFactor 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 + (absoluteValueExtension_embeddingOfExtension vK w α) = + minpoly vK.Completion a := + minpoly.algHom_eq + (absoluteValueExtension_localizationEmbedding vK w) + (absoluteValueExtension_localizationEmbedding 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 + _ = completionExtensionFactor_extensionFactor 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 completionExtensionFactor_adjoinRootEquivCompletion + {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 (completionExtensionFactor_extensionFactor 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 + completionExtensionFactor_adjoinRootEquivCompletion vK hvK α hα hgen w + (AdjoinRoot.root (completionExtensionFactor_extensionFactor 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] absoluteValueExtension_algebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtension_pullback vK hvK τ) : + completionExtensionFactor_extensionFactor 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 := absoluteValueExtension_embeddingOfExtension vK w + have hpull : absoluteValueExtension_pullback vK hvK τw = + absoluteValueExtension_pullback 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 completionExtensionFactor_completionEquivSimpleRoot + {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] absoluteValueExtension_algebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtension_pullback 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 (absoluteValueExtension_algebraicCompletionClosure 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 : completionExtensionFactor_extensionFactor 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 (completionExtensionFactor_adjoinRootEquivCompletion + 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] absoluteValueExtension_algebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtension_pullback 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 + completionExtensionFactor_completionEquivSimpleRoot + 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 := completionExtensionFactor_adjoinRootEquivCompletion + vK hvK α hα hgen w + let hfactor : completionExtensionFactor_extensionFactor 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 (completionExtensionFactor_extensionFactor 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] absoluteValueExtension_algebraicCompletionClosure vK) + (hτ : w.1 = absoluteValueExtension_pullback 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 + ((completionExtensionFactor_completionEquivSimpleRoot + vK hvK α hα hgen w τ hτ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({τ α} : Set (absoluteValueExtension_algebraicCompletionClosure vK))) : + absoluteValueExtension_algebraicCompletionClosure 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 (absoluteValueExtension_algebraicCompletionClosure vK)) + let e : w.1.Completion ≃ₐ[vK.Completion] E := + completionExtensionFactor_completionEquivSimpleRoot + vK hvK α hα hgen w τ hτ + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let φ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure 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) : + absoluteValueExtension_algebraicCompletionClosure 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) : + (completionExtensionFactor_extensionsEquivCompletionFactorsAux + vK hvK hf hroot hgen w).1 = + completionExtensionFactor_extensionFactor 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 + (absoluteValueExtension_embeddingOfExtension vK w α) = + completionExtensionFactor_extensionFactor 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 completionExtensionFactor_extensionEquivFactors + {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 := completionExtensionFactor_extensionsEquivCompletionFactorsAux + vK hvK hf hroot hgen + apply Equiv.ofBijective + (completionExtensionFactor_extensionToFactor vK hf hroot) + have heq : completionExtensionFactor_extensionToFactor 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + β ∈ ((minpoly K α).map (algebraMap K vK.Completion)).rootSet + (absoluteValueExtension_algebraicCompletionClosure 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 completionExtensionFactor_embeddingOfFactorRoot + {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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK := + let hα := completionExtensionFactor_root_isIntegral hf hroot + (simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtension_algebraicCompletionClosure 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + completionExtensionFactor_embeddingOfFactorRoot + vK hf hroot hgen g β hβ α = β := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let e := simpleEmbeddingsEquivMappedMinpolyRoots + (K' := vK.Completion) + (E := absoluteValueExtension_algebraicCompletionClosure vK) + α hα hgen + let z : PolynomialRootsIn + (absoluteValueExtension_algebraicCompletionClosure 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 completionExtensionFactor_extensionOfFactorRoot + {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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + AbsoluteValueExtension vK L := + pullbackAbsoluteValueExtension vK hvK + (completionExtensionFactor_embeddingOfFactorRoot + 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + (completionExtensionFactor_extensionOfFactorRoot + vK hvK hf hroot hgen g β hβ).1 = + absoluteValueExtension_pullback vK hvK + (completionExtensionFactor_embeddingOfFactorRoot + 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + completionExtensionFactor_extensionFactor vK α + (completionExtensionFactor_extensionOfFactorRoot + vK hvK hf hroot hgen g β hβ) = g.1 := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let τ := completionExtensionFactor_embeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactor_extensionOfFactorRoot + 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 + completionExtensionFactor_extensionFactor 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + completionExtensionFactor_extensionOfFactorRoot + vK hvK hf hroot hgen g β hβ = + (completionExtensionFactor_extensionEquivFactors + vK hvK hf hroot hgen).symm g := by + let e := completionExtensionFactor_extensionEquivFactors + 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure 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 completionExtensionFactor_factorRootCompletionEquiv + {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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + let w := completionExtensionFactor_extensionOfFactorRoot + 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 (absoluteValueExtension_algebraicCompletionClosure vK)) := by + let hα := completionExtensionFactor_root_isIntegral hf hroot + let w := completionExtensionFactor_extensionOfFactorRoot + 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 : completionExtensionFactor_extensionFactor 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 (completionExtensionFactor_adjoinRootEquivCompletion + 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) : + let w := completionExtensionFactor_extensionOfFactorRoot + 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 + completionExtensionFactor_factorRootCompletionEquiv + 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 := completionExtensionFactor_extensionOfFactorRoot + 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 := completionExtensionFactor_adjoinRootEquivCompletion + vK hvK α hα hgen w + let hpoly : completionExtensionFactor_extensionFactor 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 (completionExtensionFactor_extensionFactor 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) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)) + (x : L) : + let τ := completionExtensionFactor_embeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactor_extensionOfFactorRoot + 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 + ((completionExtensionFactor_factorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({β} : Set (absoluteValueExtension_algebraicCompletionClosure vK))) : + absoluteValueExtension_algebraicCompletionClosure 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 τ := completionExtensionFactor_embeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactor_extensionOfFactorRoot + 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 (absoluteValueExtension_algebraicCompletionClosure vK)) + let e : w.1.Completion ≃ₐ[vK.Completion] E := + completionExtensionFactor_factorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + let ι : L →ₐ[K] w.1.Completion := + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + let φ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure 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) : + absoluteValueExtension_algebraicCompletionClosure 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 (completionExtensionFactor_extensionToFactor vK hf hroot) ∧ + ∀ (g : CompletionExtensionFactorCompletionFactors vK f) + (β : absoluteValueExtension_algebraicCompletionClosure vK) + (hβ : β ∈ g.1.rootSet + (absoluteValueExtension_algebraicCompletionClosure vK)), + let τ := completionExtensionFactor_embeddingOfFactorRoot + vK hf hroot hgen g β hβ + let w := completionExtensionFactor_extensionOfFactorRoot + 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 := completionExtensionFactor_factorRootCompletionEquiv + vK hvK hf hroot hgen g β hβ + τ α = β ∧ + w.1 = absoluteValueExtension_pullback vK hvK τ ∧ + w = (completionExtensionFactor_extensionEquivFactors + vK hvK hf hroot hgen).symm g ∧ + completionExtensionFactor_extensionFactor vK α w = g.1 ∧ + ∀ x : L, + ((e (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : + IntermediateField.adjoin vK.Completion + ({β} : Set + (absoluteValueExtension_algebraicCompletionClosure vK))) : + absoluteValueExtension_algebraicCompletionClosure vK) = τ x := by + constructor + · exact (completionExtensionFactor_extensionEquivFactors + 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..f372ebe79a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace +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. +-/ + +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) + (completionNonarchimedean a ha)) = + exponentialValueSubgroup + (absoluteValueExponentialValuation a ha) := by + let aC := AbsoluteValue.completionAbsoluteValue a + let haC := 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) + (completionNonarchimedean a ha)) + (absoluteValueExponentialValuation + (AbsoluteValue.completionAbsoluteValue b) + (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) + (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) + (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) + (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 := 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 [ValuationTheory.DiscreteValuationField.ResidueField.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) + (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) + (completionNonarchimedean a ha)) := by + let aC := AbsoluteValue.completionAbsoluteValue a + let haC := 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 := completionNonarchimedean a ha + let hbC := 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 := completionNonarchimedean a ha + let hbC := 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 := completionNonarchimedean a ha + let hbC := 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 := completionTensorDecomposition_powerBasis 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 τ := absoluteValueExtension_embeddingOfExtension 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 := completionExtensionFactor_extensionToFactor 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, completionExtensionFactor_extensionToFactor] using hgdvd + have hτα : IsSeparable a.Completion (τ α) := + hsepMapped.of_dvd hdvd + let E := IntermediateField.adjoin a.Completion + ({τ α} : Set (absoluteValueExtension_algebraicCompletionClosure a)) + have hEsep : Algebra.IsSeparable a.Completion E := + Iff.mpr (IntermediateField.isSeparable_adjoin_iff_isSeparable + a.Completion (absoluteValueExtension_algebraicCompletionClosure 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 + (completionExtensionFactor_completionEquivSimpleRoot + 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 := 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 := completionTensorDecomposition_extensionFintype (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 := completionTensorDecomposition_extensionFintype (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..cc8cd129c6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +import Mathlib.Analysis.Normed.Module.FiniteDimension +import Mathlib.RingTheory.TensorProduct.Finite +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`. +-/ + +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 absoluteValueExtension_completionNontriviallyNormedField + {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 absoluteValueExtension_completionNormedAlgebra + {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 absoluteValueExtension_localizationTensorHom + {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 + absoluteValueExtension_localizationTensorHom 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 (absoluteValueExtension_localizationTensorHom 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 := + absoluteValueExtension_completionNontriviallyNormedField vK hvK + let : NormedAlgebra vK.Completion w.1.Completion := + absoluteValueExtension_completionNormedAlgebra vK w + let : Module.Finite vK.Completion (vK.Completion ⊗[K] L) := + inferInstance + let f := absoluteValueExtension_localizationTensorHom 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 := + absoluteValueExtension_localizationTensorHom 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..cafb296805 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.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 +-/ + +import Mathlib.RingTheory.Norm.Basic +import Mathlib.RingTheory.Trace.Basic +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. +-/ + +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..2e0c955a67 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import Mathlib.NumberTheory.Ostrowski +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. +-/ + +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..7685176189 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.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 +-/ + +import Mathlib.RingTheory.AdjoinRoot +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. +-/ + +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..8daa483bb3 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean @@ -0,0 +1,215 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +import Mathlib.FieldTheory.Minpoly.IsConjRoot +import Mathlib.Algebra.Polynomial.FieldDivision +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. +-/ + +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..4e5cf994dd --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +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. +-/ + +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..875683413e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap +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. +-/ + +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 completionTensorDecomposition_powerBasis + (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 completionTensorDecomposition_extensionFintype + {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 := completionTensorDecomposition_powerBasis K L + let hf : Irreducible (minpoly K pb.gen) := + minpoly.irreducible pb.isIntegral_gen + let e := completionExtensionFactor_extensionEquivFactors 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + (minpoly K (completionTensorDecomposition_powerBasis K L).gen).map + (algebraMap K vK.Completion) = + ∏ w : AbsoluteValueExtension vK L, + completionExtensionFactor_extensionFactor vK + (completionTensorDecomposition_powerBasis K L).gen w := by + classical + let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecomposition_powerBasis 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 := completionExtensionFactor_extensionEquivFactors 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, + completionExtensionFactor_extensionFactor 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + ∀ w w' : AbsoluteValueExtension vK L, w ≠ w' → + IsCoprime + (completionExtensionFactor_extensionFactor vK + (completionTensorDecomposition_powerBasis K L).gen w) + (completionExtensionFactor_extensionFactor vK + (completionTensorDecomposition_powerBasis K L).gen w') := by + classical + let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecomposition_powerBasis K L + let hf : Irreducible (minpoly K pb.gen) := + minpoly.irreducible pb.isIntegral_gen + let e := completionExtensionFactor_extensionEquivFactors 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 completionTensorDecomposition_factorEquiv + {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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecomposition_powerBasis 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 ↦ + completionExtensionFactor_extensionFactor vK pb.gen w) + (completionTensorDecomposition_extensionFactors_pairwise_coprime + (K := K) (L := L) vK hvK) + let elocal := AlgEquiv.piCongrRight fun w ↦ + completionExtensionFactor_adjoinRootEquivCompletion + 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 + completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK + (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis K L).gen) w = + AbsoluteValue.toCompletionAlgHom (K := K) w.1 + (completionTensorDecomposition_powerBasis K L).gen := by + classical + let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecomposition_powerBasis 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 ↦ + completionExtensionFactor_extensionFactor 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 ↦ + completionExtensionFactor_adjoinRootEquivCompletion + 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 + (completionExtensionFactor_adjoinRootEquivCompletion + 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 + (completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK).toAlgHom = + completionTensorMap_leftCanonicalHom vK := by + classical + let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + let pb := completionTensorDecomposition_powerBasis 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 + completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK + (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis K L).gen) w = + completionTensorMap_leftCanonicalHom (K := K) (L := L) vK + (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis 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 + (completionTensorMap_leftCanonicalHom (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 (completionTensorDecomposition_factorEquiv + (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 completionTensorDecomposition_left + {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 + (completionTensorMap_leftCanonicalHom (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 + completionTensorDecomposition_left (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 completionTensorMap_leftCanonicalHom (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 + (completionTensorMap_canonicalHom (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 := completionTensorMap_leftCanonicalHom (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 + (completionTensorMap_canonicalHom (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 = + completionTensorMap_canonicalHom 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 completionTensorMap_canonicalHom (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 + (completionTensorDecomposition_left + (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) = + completionTensorDecomposition_left (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..9ff5721217 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace +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. +-/ + +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] + [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) : + 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..4d5b746b06 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +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..3a4f25b154 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.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 +-/ + +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. +-/ + +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..c0a1e7a5c2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean @@ -0,0 +1,300 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.RingTheory.AdicCompletion.Functoriality + +/-! # Adic Power -/ +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..864d1ef3c8 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.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 +-/ + +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. +-/ + +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..a331500c57 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.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 +-/ + +import Mathlib.Algebra.CharP.Subring +import Mathlib.RingTheory.LocalRing.ResidueField.Basic +import Mathlib.RingTheory.Valuation.Discrete.Basic +import Mathlib.RingTheory.Valuation.LocalSubring + +/-! # Basic -/ +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..0e73d89b5d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean @@ -0,0 +1,1378 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension +import Mathlib.RingTheory.DedekindDomain.IntegralClosure +import Mathlib.RingTheory.Valuation.LocalSubring +import Mathlib.RingTheory.Valuation.Integral + +/-! # Chevalley Extension -/ +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..25e409241c --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean @@ -0,0 +1,388 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +/-! # Complete -/ +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..c21109db59 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean @@ -0,0 +1,548 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +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`. +-/ + +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..d3310665e6 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean @@ -0,0 +1,1009 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.Algebra.Algebra.Subalgebra.Lattice +import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic +import Mathlib.FieldTheory.Relrank +import Mathlib.FieldTheory.LinearDisjoint +import Mathlib.FieldTheory.SeparableClosure +import Mathlib.RingTheory.Ideal.Quotient.Operations +import Mathlib.RingTheory.Unramified.Field +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. +-/ + +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 + +private 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 both factors are +finite over the base. -/ +theorem finiteDimensional_compositum_over_right + (L K' : IntermediateField K Ω) + [FiniteDimensional K L] [FiniteDimensional K K'] : + 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 K'] : + 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 L] [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] [FiniteDimensional K 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_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 L] [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] [FiniteDimensional K 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_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 L] [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] [FiniteDimensional K K'] + (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 finite +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] [FiniteDimensional K K'] + [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..1d374b3453 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean @@ -0,0 +1,501 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import Mathlib.RingTheory.Valuation.Extension +import Mathlib.RingTheory.RamificationInertia.Basic +import Mathlib.NumberTheory.RamificationInertia.Inertia +import Mathlib.NumberTheory.RamificationInertia.Ramification +import Mathlib.LinearAlgebra.FiniteDimensional.Basic +import Mathlib.Algebra.Group.Units.Hom + +/-! # Extensions -/ +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. -/ +@[simp] 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..85403f89b4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +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..7c5a1aca54 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -0,0 +1,740 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness +/-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension` Lean module. -/ + +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 →+* + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval where + toFun a := + ⟨algebraMap K L (a : K), + (ValuationTheory.DiscreteValuationField.Valuation.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 : + ValuationTheory.DiscreteValuationField.Valuation.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 : + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval => (x : L)) hab + +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. -/ +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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + let hvL_le : B ≤ vL.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 + (ValuationTheory.DiscreteValuationField.Valuation.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 + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) := by + let B := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.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 := + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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 + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) + target.toDVF.valuation.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.toDVF.valuation target.toDVF.valuation hval) = + IsLocalRing.maximalIdeal + (ValuationTheory.DiscreteValuationField.Valuation.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 + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval) + v'.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.toDVF.valuation v' hval) = + IsLocalRing.maximalIdeal + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval)) : + HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.toDVF.valuation hval + have htarget_le : B ≤ target.toDVF.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.toDVF.valuation target.toDVF.valuation hval + have htarget_eq : target.toDVF.valuation.valuationSubring = B := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.toDVF.valuation v' hval + have hv_eq : v'.valuationSubring = B := + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_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 + ValuationTheory.DiscreteValuationField.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 + ValuationTheory.DiscreteValuationField.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) + [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] : + 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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := L) base.valuation B.valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + (L := L) base.valuation C.valuation ⟨z, hz⟩ + exact + ValuationTheory.DiscreteValuationField.Valuation.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 = + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval := by + let C := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let : _root_.Valuation.HasExtension base.valuation C.valuation := + ValuationTheory.DiscreteValuationField.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..87aa376f0a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import Mathlib.LinearAlgebra.Dimension.Localization +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. +-/ + +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..44859ac4f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean @@ -0,0 +1,919 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless +import Mathlib.RingTheory.RamificationInertia.Basic + +/-! # Degree -/ +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..bddbeaf76e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -0,0 +1,1311 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree +/-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension.Uniqueness` Lean module. -/ + +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 + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation v' + exact + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + (L := L) base.valuation target.valuation + let : Module.Finite base.valuation.valuationSubring + target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + (L := L) base.valuation v' + let : Module.Finite base.valuation.valuationSubring v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + (L := L) base.valuation v' + exact + ValuationTheory.DiscreteValuationField.Valuation.valuation_isEquiv_of_hasExtension_of_moduleFinite + (L := L) base.valuation target.valuation v' + +omit [FiniteDimensional K L] 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 + ((ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + target.valuation.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 + ((ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval).inclusion + v'.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation v' hval))) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.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 + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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 + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + target.valuation.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval) = + IsLocalRing.maximalIdeal + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) + (hcenter : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + ValuationSubring.idealOfLE + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval) + v'.valuationSubring + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation v' hval) = + IsLocalRing.maximalIdeal + (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval)) : + HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + have htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + have htarget_eq : target.valuation.valuationSubring = B := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation v' hval + have hv_eq : v'.valuationSubring = B := + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_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) + [base.valuation.HasExtension target.valuation] + [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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.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) + · intro Gamma' _ v' hExt + let : base.valuation.HasExtension v' := hExt + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.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) + (hcenterMem : + ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] + (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation target.valuation hval + exact + ValuationTheory.DiscreteValuationField.Valuation.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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (L := L) base.valuation v' hval + exact + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let htarget_le : B ≤ target.valuation.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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 := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let hv_le : B ≤ v'.valuationSubring := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_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⟩ := + ValuationTheory.DiscreteValuationField.Valuation.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 +/-- 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⟩ := + ValuationTheory.DiscreteValuationField.Valuation.chevalley_exists_extension_valuation_with_pullback_integralClosure_local_data + (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] + [IsScalarTower base.valuationSubring target.valuationSubring L] : + IsIntegralClosure target.valuationSubring base.valuationSubring L := by + let hval := (integralClosure_mem_or_inv_of_finite_separable base target) + let B := + ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (L := L) base.valuation hval + let : base.valuation.HasExtension B.valuation := + ValuationTheory.DiscreteValuationField.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 := + ValuationTheory.DiscreteValuationField.Valuation.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..c7cddf5e76 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing + +/-! # Finite Integral Closure -/ +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) + [Algebra.IsSeparable K L] : + 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) + [Algebra.IsSeparable K L] : + ¬ 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..f0e2419e60 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic +import Mathlib.RingTheory.Henselian +import Mathlib.RingTheory.Ideal.Quotient.Operations + +/-! # Henselian -/ +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 [pow_two] + 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 [pow_two] + 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 [f, Polynomial.coeff_map] + 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 [f, Polynomial.coeff_map, hcoeff] + 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..1a94606125 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower +import Mathlib.Algebra.Module.Shrink +import Mathlib.RingTheory.AdicCompletion.AsTensorProduct +import Mathlib.RingTheory.AdicCompletion.Noetherian +import Mathlib.RingTheory.Nakayama + +/-! # Henselian Finite -/ +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 [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..2929474d12 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import Mathlib.RingTheory.Valuation.Extension + +/-! # Henselian Valuation Extension -/ +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..659c2e0be4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -0,0 +1,1790 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +import Mathlib.RingTheory.DedekindDomain.IntegralClosure +import Mathlib.RingTheory.DiscreteValuationRing.TFAE +import Mathlib.RingTheory.Ideal.GoingUp +import Mathlib.RingTheory.QuasiFinite.Basic +import Mathlib.RingTheory.Spectrum.Prime.Topology +import Mathlib.RingTheory.TensorProduct.Quotient +import Mathlib.RingTheory.Valuation.Integral +import Mathlib.LinearAlgebra.TensorProduct.RightExactness + +/-! # Integral Closure -/ +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] + [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + [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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_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..c1d420ffbb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.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 +-/ + +import Mathlib.RingTheory.LocalRing.ResidueField.Basic + +/-! # Residue Field -/ +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. -/ +@[simp] +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..fa44d8d0f2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions + +/-! # Valuation Extension -/ +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..55c1e3deb7 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic + +/-! # Valuation Transport -/ +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..ded5ae1118 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField +import Mathlib.Algebra.Polynomial.FieldDivision + +/-! # Hensel Lemma -/ +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..45bbe93c1a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +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..271a41bd46 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure +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. +-/ + +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)] + +/-- 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 + (_root_.DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + 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..62946fff1d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import Mathlib.Algebra.Polynomial.Lifts +import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure +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. +-/ + +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..b45d099cbc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +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. +-/ + +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..5f34095c68 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +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. +-/ + +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..1126f4178e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction + +/-! # Core -/ +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..19e4fffa95 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +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. +-/ + +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..f31aa19ec0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation +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..f2c203541e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +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. +-/ + +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 henselFactorization_adicCoeffCauchy + {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 : ℕ) : + henselFactorization_adicCoeffCauchy I (fun N : ℕ => (Pseq N).coeff i) := by + intro M N hMN + simpa [henselFactorization_adicCoeffCauchy, 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 : henselFactorization_adicCoeffCauchy 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 : henselFactorization_adicCoeffCauchy 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 henselFactorization_polyOfLimitCoeffs + {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) : + (henselFactorization_polyOfLimitCoeffs N c).coeff n = c n := by + classical + unfold henselFactorization_polyOfLimitCoeffs + 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) : + (henselFactorization_polyOfLimitCoeffs N c).coeff n = 0 := by + classical + unfold henselFactorization_polyOfLimitCoeffs + 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) : + (henselFactorization_polyOfLimitCoeffs 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 : ℕ, henselFactorization_adicCoeffCauchy 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] := henselFactorization_polyOfLimitCoeffs 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..7e3e96dbf4 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits +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. +-/ + +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 := henselFactorization_twoPolynomialCoeffFinset + (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 : + henselFactorization_twoPolynomialCoeffFinset + (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 := henselFactorization_twoPolynomialCoeffFinset + (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 : + henselFactorization_twoPolynomialCoeffFinset + (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..4e5f6bee64 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.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 +-/ + +import Mathlib.Algebra.Polynomial.Div +import Mathlib.Algebra.Polynomial.Lifts +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. +-/ + +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..f5012b8fac --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.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 +-/ + +import Mathlib.RingTheory.Valuation.ValuationRing +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. +-/ + +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 henselFactorization_twoPolynomialCoeffFinset + {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 ∈ henselFactorization_twoPolynomialCoeffFinset P Q := by + classical + unfold henselFactorization_twoPolynomialCoeffFinset + 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 ∈ henselFactorization_twoPolynomialCoeffFinset P Q := by + classical + unfold henselFactorization_twoPolynomialCoeffFinset + 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 ∈ henselFactorization_twoPolynomialCoeffFinset P Q) : + x ≠ 0 := by + classical + unfold henselFactorization_twoPolynomialCoeffFinset 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 : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ henselFactorization_twoPolynomialCoeffFinset P Q, + (∀ n : ℕ, π ∣ P.coeff n) ∧ + (∀ n : ℕ, π ∣ Q.coeff n) := by + classical + rcases henselFactorization_exists_mem_finset_dvd_all + (R := R) (s := henselFactorization_twoPolynomialCoeffFinset 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 : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ I, + π ∈ henselFactorization_twoPolynomialCoeffFinset 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 henselFactorization_twoPolynomialCoeffFinset 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 : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : + ∃ π ∈ I, + π ∈ henselFactorization_twoPolynomialCoeffFinset 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 : + (henselFactorization_twoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : + ∃ π ∈ IsLocalRing.maximalIdeal R, + π ∈ henselFactorization_twoPolynomialCoeffFinset + (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 : + (henselFactorization_twoPolynomialCoeffFinset + (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : + ∃ π ∈ IsLocalRing.maximalIdeal R, + π ∈ henselFactorization_twoPolynomialCoeffFinset + (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 : henselFactorization_twoPolynomialCoeffFinset P Q = ∅) : + P = 0 := by + ext n + by_cases hn : n ∈ P.support + · have hmem : + P.coeff n ∈ henselFactorization_twoPolynomialCoeffFinset 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 : henselFactorization_twoPolynomialCoeffFinset P Q = ∅) : + Q = 0 := by + ext n + by_cases hn : n ∈ Q.support + · have hmem : + Q.coeff n ∈ henselFactorization_twoPolynomialCoeffFinset 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]} : + henselFactorization_twoPolynomialCoeffFinset 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 henselFactorization_twoPolynomialCoeffFinset + 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..52c54affa1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +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. +-/ + +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..caa92d654b --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.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 +-/ + +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. +-/ + +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..bab8dfc128 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.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 +-/ + +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. +-/ + +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..77d44c1cdb --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean @@ -0,0 +1,239 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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`. +-/ + +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..adcd797397 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 - henselFactorization_henselIterate π g0 pCorr r * + henselFactorization_henselIterate π h0 qCorr r = + Polynomial.C (π ^ (r + 1)) * fr) + {fn : R[X]} + (hfactor : + f - henselFactorization_henselIterate π g0 pCorr n * + henselFactorization_henselIterate π h0 qCorr n = + Polynomial.C (π ^ (n + 1)) * fn) + (hgDeg : (henselFactorization_henselIterate π g0 pCorr n).natDegree ≤ m) + (hhDeg : (henselFactorization_henselIterate π 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 - henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) r * + henselFactorization_henselIterate π h0 + (Function.update qCorr (n + 1) q) r = + Polynomial.C (π ^ (r + 1)) * fr) ∧ + f - henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) * + henselFactorization_henselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1) = + Polynomial.C (π ^ (n + 2)) * fnNext ∧ + (henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1)).natDegree ≤ m ∧ + (henselFactorization_henselIterate π h0 + (Function.update qCorr (n + 1) q) (n + 1)).natDegree ≤ + d - m ∧ + (∀ i : ℕ, + (henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) - + g0).coeff i ∈ IsLocalRing.maximalIdeal R) ∧ + (∀ i : ℕ, + (henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π g0 pCorr n - g0).coeff i ∈ + Ideal.span ({π} : Set R) := + henselFactorization_henselIterate_span_singleton (π := π) g0 pCorr n + have hhSpan : + ∀ i : ℕ, + (henselFactorization_henselIterate π 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 := henselFactorization_henselIterate π g0 pCorr n) + (h := henselFactorization_henselIterate π 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 - (henselFactorization_henselIterate π g0 pCorr n + + Polynomial.C (π ^ (n + 1)) * p) * + (henselFactorization_henselIterate π 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..f67abe609f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean @@ -0,0 +1,1039 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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. +-/ + +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 - henselFactorization_henselIterate π g0 pCorr r * + henselFactorization_henselIterate π 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 - henselFactorization_henselIterate π g0 pCorr N * + henselFactorization_henselIterate π h0 qCorr N = + Polynomial.C (π ^ (N + 1)) * fErr + /-- The first approximate factor at stage `N` has degree at most `m`. -/ + gDeg : (henselFactorization_henselIterate π g0 pCorr N).natDegree ≤ m + /-- The second approximate factor at stage `N` has degree at most `d - m`. -/ + hDeg : (henselFactorization_henselIterate π h0 qCorr N).natDegree ≤ d - m + /-- The first approximate factor remains congruent to `g0` modulo the maximal ideal. -/ + gRed : + ∀ i : ℕ, + (henselFactorization_henselIterate π g0 pCorr N - g0).coeff i ∈ + IsLocalRing.maximalIdeal R + /-- The second approximate factor remains congruent to `h0` modulo the maximal ideal. -/ + hRed : + ∀ i : ℕ, + (henselFactorization_henselIterate π 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 henselFactorization_initialPrefixState_of_factor + {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 henselFactorization_chosenNextPrefixState_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) + (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 - henselFactorization_henselIterate π g0 + (Function.update s.pCorr (N + 1) p) r * + henselFactorization_henselIterate π h0 + (Function.update s.qCorr (N + 1) q) r = + Polynomial.C (π ^ (r + 1)) * fr := hspec.2.2.1 + have hfactorNext : + f - henselFactorization_henselIterate π g0 + (Function.update s.pCorr (N + 1) p) (N + 1) * + henselFactorization_henselIterate π h0 + (Function.update s.qCorr (N + 1) q) (N + 1) = + Polynomial.C (π ^ (N + 2)) * fnNext := hspec.2.2.2.1 + have hgNextDeg : + (henselFactorization_henselIterate π g0 + (Function.update s.pCorr (N + 1) p) (N + 1)).natDegree ≤ m := + hspec.2.2.2.2.1 + have hhNextDeg : + (henselFactorization_henselIterate π h0 + (Function.update s.qCorr (N + 1) q) (N + 1)).natDegree ≤ d - m := + hspec.2.2.2.2.2.1 + have hgNextRed : + ∀ i : ℕ, + (henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π 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) : + (henselFactorization_chosenNextPrefixState_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 r = + s.pCorr r := by + unfold henselFactorization_chosenNextPrefixState_of_mem_span + 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) : + (henselFactorization_chosenNextPrefixState_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).qCorr r = + s.qCorr r := by + unfold henselFactorization_chosenNextPrefixState_of_mem_span + simp [Function.update_of_ne hr] + +/-- recursively chosen compatible finite Hensel prefixes in +the displayed-factor displayed-factor form. -/ +def henselFactorization_prefixStateSeq_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 : ℕ) → HenselFactorizationFinitePrefixState π f g0 h0 m d N + | 0 => + henselFactorization_initialPrefixState_of_factor + (π := π) (f := f) (g0 := g0) (h0 := h0) + (f1 := f1) (m := m) (d := d) + hfactor0 hg0nat hh0deg + | N + 1 => + henselFactorization_chosenNextPrefixState_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 + (henselFactorization_prefixStateSeq_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 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 → + (henselFactorization_prefixStateSeq_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 N).pCorr M = + (henselFactorization_prefixStateSeq_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 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 + (henselFactorization_prefixStateSeq_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 (N + 1)).pCorr M = + (henselFactorization_prefixStateSeq_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 N).pCorr M := by + simpa [henselFactorization_prefixStateSeq_of_mem_span] 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 + (henselFactorization_prefixStateSeq_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 N) + htop + _ = + (henselFactorization_prefixStateSeq_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 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 → + (henselFactorization_prefixStateSeq_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 N).qCorr M = + (henselFactorization_prefixStateSeq_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 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 + (henselFactorization_prefixStateSeq_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 (N + 1)).qCorr M = + (henselFactorization_prefixStateSeq_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 N).qCorr M := by + simpa [henselFactorization_prefixStateSeq_of_mem_span] 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 + (henselFactorization_prefixStateSeq_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 N) + htop + _ = + (henselFactorization_prefixStateSeq_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 M).qCorr M := ih hMN' + +/-- the infinite `p`-correction sequence from the +displayed-factor displayed-factor prefix construction. -/ +def henselFactorization_infinitePCorr_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 : ℕ) : R[X] := + (henselFactorization_prefixStateSeq_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 n).pCorr n + +/-- the infinite `q`-correction sequence from the +displayed-factor displayed-factor prefix construction. -/ +def henselFactorization_infiniteQCorr_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 : ℕ) : R[X] := + (henselFactorization_prefixStateSeq_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 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 : ℕ, + (henselFactorization_infinitePCorr_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).natDegree ≤ m := by + intro n + unfold henselFactorization_infinitePCorr_of_mem_span + exact + (henselFactorization_prefixStateSeq_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 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 : ℕ, + (henselFactorization_infiniteQCorr_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).natDegree ≤ d - m := by + intro n + unfold henselFactorization_infiniteQCorr_of_mem_span + exact + (henselFactorization_prefixStateSeq_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 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 → + (henselFactorization_prefixStateSeq_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 N).pCorr r = + henselFactorization_infinitePCorr_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 r := by + intro r N hr + unfold henselFactorization_infinitePCorr_of_mem_span + 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 → + (henselFactorization_prefixStateSeq_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 N).qCorr r = + henselFactorization_infiniteQCorr_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 r := by + intro r N hr + unfold henselFactorization_infiniteQCorr_of_mem_span + 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 - henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 * + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 = + Polynomial.C (π ^ (N + 1)) * fN := by + intro N + let S := + henselFactorization_prefixStateSeq_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 N + have hp : + henselFactorization_henselIterate π g0 S.pCorr N = + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 := 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 : + henselFactorization_henselIterate π h0 S.qCorr N = + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 := 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 - henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 * + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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).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 : ℕ, + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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).natDegree ≤ m := by + exact henselFactorization_henselIterate_natDegree_le + (π := π) (F0 := g0) + (corr := henselFactorization_infinitePCorr_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) + (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 : ℕ, + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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).natDegree ≤ d - m := by + exact henselFactorization_henselIterate_natDegree_le + (π := π) (F0 := h0) + (corr := henselFactorization_infiniteQCorr_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) + (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 : ℕ, + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 - g0).coeff i ∈ + IsLocalRing.maximalIdeal R := + henselFactorization_henselIterate_reduction_of_mem + (π := π) hπmem g0 + (henselFactorization_infinitePCorr_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 `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 : ℕ, + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 - h0).coeff i ∈ + IsLocalRing.maximalIdeal R := + henselFactorization_henselIterate_reduction_of_mem + (π := π) hπmem h0 + (henselFactorization_infiniteQCorr_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) + +/-- 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 : ℕ, + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 - + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + M).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (M + 1) := + henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem + (π := π) hπmem g0 + (henselFactorization_infinitePCorr_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) + +/-- 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 : ℕ, + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 - + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + M).coeff i ∈ + IsLocalRing.maximalIdeal R ^ (M + 1) := + henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem + (π := π) hπmem h0 + (henselFactorization_infiniteQCorr_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) + + +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..fd4ee96f6a --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.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 +-/ + +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. +-/ + +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 henselFactorization_henselIterate {R : Type*} [CommRing R] + (π : R) (F0 : R[X]) (corr : ℕ → R[X]) : ℕ → R[X] + | 0 => F0 + | n + 1 => + henselFactorization_henselIterate π 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]) : + henselFactorization_henselIterate π F0 corr 0 = F0 := + rfl + +@[simp] +theorem henselFactorization_henselIterate_succ + {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) + (n : ℕ) : + henselFactorization_henselIterate π F0 corr (n + 1) = + henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π 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 := henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π 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 := henselFactorization_henselIterate π 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 : ℕ, (henselFactorization_henselIterate π 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) → + henselFactorization_henselIterate π F0 corr n = + henselFactorization_henselIterate π F0 corr' n := by + intro n hcorr + induction n with + | zero => + rfl + | succ n ih => + rw [henselFactorization_henselIterate_succ, + henselFactorization_henselIterate_succ] + have hprev : + henselFactorization_henselIterate π F0 corr n = + henselFactorization_henselIterate π 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) : + henselFactorization_henselIterate π F0 (Function.update corr k c) n = + henselFactorization_henselIterate π 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]) : + henselFactorization_henselIterate π F0 + (Function.update corr (n + 1) c) (n + 1) = + henselFactorization_henselIterate π 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 - henselFactorization_henselIterate π g0 pCorr r * + henselFactorization_henselIterate π h0 qCorr r = + Polynomial.C (π ^ (r + 1)) * fn) : + f - henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) r * + henselFactorization_henselIterate π 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 - (henselFactorization_henselIterate π g0 pCorr n + + Polynomial.C (π ^ (n + 1)) * p) * + (henselFactorization_henselIterate π h0 qCorr n + + Polynomial.C (π ^ (n + 1)) * q) = + Polynomial.C (π ^ (n + 2)) * fnNext) : + f - henselFactorization_henselIterate π g0 + (Function.update pCorr (n + 1) p) (n + 1) * + henselFactorization_henselIterate π 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 : ℕ) : + henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : ℕ) : + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : ℕ) : + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : ℕ) : + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π F0 corr n - + henselFactorization_henselIterate π 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 : + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : + henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π F0 corr m = + (henselFactorization_henselIterate π F0 corr n - + henselFactorization_henselIterate π F0 corr m) + + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : ℕ, + (henselFactorization_henselIterate π F0 corr n - + henselFactorization_henselIterate π 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 : + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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 : + henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π F0 corr m = + (henselFactorization_henselIterate π F0 corr n - + henselFactorization_henselIterate π F0 corr m) + + (henselFactorization_henselIterate π F0 corr (n + 1) - + henselFactorization_henselIterate π 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..78f3fa0ecf --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +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. +-/ + +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 : ℕ) : + henselFactorization_adicCoeffCauchy (Ideal.span ({π} : Set R)) + (fun N : ℕ => + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (Ideal.span ({π} : Set R)) + (Pseq := fun N : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (by + intro M N hMN i + exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le + (π := π) g0 + (henselFactorization_infinitePCorr_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 + +/-- 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 : ℕ, + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 - 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 : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (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 : ℕ) : + henselFactorization_adicCoeffCauchy (Ideal.span ({π} : Set R)) + (fun N : ℕ => + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (Ideal.span ({π} : Set R)) + (Pseq := fun N : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (by + intro M N hMN i + exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le + (π := π) h0 + (henselFactorization_infiniteQCorr_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 + +/-- 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 : ℕ, + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 - 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 : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (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 - henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 * + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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).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 : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (Hseq := fun n : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + · 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 : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (P := G) (P0 := g0) hGlim + (henselFactorization_henselIterate_span_singleton g0 + (henselFactorization_infinitePCorr_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 hHredSpan : ∀ i : ℕ, (H - h0).coeff i ∈ Ideal.span ({π} : Set R) := + henselFactorization_limit_reduction_of_approx_reduction + (I := Ideal.span ({π} : Set R)) + (Pseq := fun n : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (P := H) (P0 := h0) hHlim + (henselFactorization_henselIterate_span_singleton h0 + (henselFactorization_infiniteQCorr_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 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..92cc2e8c52 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean @@ -0,0 +1,474 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +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. +-/ + +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) : + (henselFactorization_lowPart (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) * + henselFactorization_lowPart (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) * + henselFactorization_lowPart (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 * henselFactorization_lowPart (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 := henselFactorization_lowPart (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) : + (henselFactorization_lowPart (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) * + henselFactorization_lowPart (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) * + henselFactorization_lowPart (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) * + henselFactorization_lowPart (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 * henselFactorization_lowPart (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 := henselFactorization_lowPart (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) * + henselFactorization_lowPart (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) : + (henselFactorization_lowPart (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) * + henselFactorization_lowPart (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) * + henselFactorization_lowPart (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, henselFactorization_lowPart (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, henselFactorization_lowPart (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..a4ed87732d --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.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 +-/ + +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. +-/ + +noncomputable section + +open scoped Polynomial +open scoped BigOperators + +namespace AlgebraicNumberTheory +namespace Valuations + +/-- low-degree part of a polynomial up to degree `N`. -/ +def henselFactorization_lowPart {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) : + (henselFactorization_lowPart N P).coeff n = P.coeff n := by + classical + unfold henselFactorization_lowPart + 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) : + (henselFactorization_lowPart N P).coeff n = 0 := by + classical + unfold henselFactorization_lowPart + 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]) : + (henselFactorization_lowPart 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 φ) : + (henselFactorization_lowPart 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) : + (henselFactorization_lowPart 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 φ) : + (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart 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 * henselFactorization_lowPart N Q + h0 * p - fn).map φ = 0 := by + calc + (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map φ = + g0.map φ * (henselFactorization_lowPart N Q).map φ + + h0.map φ * p.map φ - fn.map φ := by + exact henselFactorization_map_mul_add_mul_sub φ g0 h0 + (henselFactorization_lowPart 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 * henselFactorization_lowPart 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) : + (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart 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)) : + (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart 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) : + (henselFactorization_lowPart (d - m) Q).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart (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) : + (henselFactorization_lowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart (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) : + (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart 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 * henselFactorization_lowPart N Q + h0 * p - fn).map + (IsLocalRing.residue R) = 0 := by + calc + (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map + (IsLocalRing.residue R) = + g0.map (IsLocalRing.residue R) * + (henselFactorization_lowPart 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 + (henselFactorization_lowPart 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 * henselFactorization_lowPart 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) : + (henselFactorization_lowPart (d - m) Q).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart (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) : + (henselFactorization_lowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + ∀ n : ℕ, + (g0 * henselFactorization_lowPart (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..811b2337d1 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +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. +-/ + +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 : ℕ) : + henselFactorization_adicCoeffCauchy (IsLocalRing.maximalIdeal R) + (fun N : ℕ => + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (IsLocalRing.maximalIdeal R) + (Pseq := fun N : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (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 : ℕ, + (henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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 - G).coeff i ∈ + IsLocalRing.maximalIdeal R ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (IsLocalRing.maximalIdeal R) + (N := m) + (Pseq := fun n : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (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 : ℕ) : + henselFactorization_adicCoeffCauchy (IsLocalRing.maximalIdeal R) + (fun N : ℕ => + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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).coeff i) := by + exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem + (IsLocalRing.maximalIdeal R) + (Pseq := fun N : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (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 : ℕ, + (henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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 - H).coeff i ∈ + IsLocalRing.maximalIdeal R ^ n := by + exact + henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits + (IsLocalRing.maximalIdeal R) + (N := d - m) + (Pseq := fun n : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (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 : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (Hseq := fun n : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + · 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 : ℕ => + henselFactorization_henselIterate π g0 + (henselFactorization_infinitePCorr_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) + (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 : ℕ => + henselFactorization_henselIterate π h0 + (henselFactorization_infiniteQCorr_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) + (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..1670961855 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean @@ -0,0 +1,811 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +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. +-/ + +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..cf7c370681 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +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. +-/ + +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..eafd0f269f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -0,0 +1,1149 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization +import Mathlib.FieldTheory.Normal.Basic +import Mathlib.RingTheory.Norm.Basic +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. +-/ + +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 + +/-- 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.henselFactorization_twoPolynomialCoeffFinset 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 + AlgebraicNumberTheory.Valuations.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] + +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 + 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 + + + +/-- 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..d03efdae5f --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.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 +-/ + +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. +-/ + +noncomputable section + +open Polynomial + +namespace AlgebraicNumberTheory +namespace Valuations + +universe u + +/-- 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 + (DiscreteValuationField.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..d48fb07229 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.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 +-/ + +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. +-/ + +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..95bbc05668 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core +import Mathlib.RingTheory.Polynomial.GaussLemma +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. +-/ + +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..78618f9149 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +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. +-/ + +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..109e91e753 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.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 +-/ + +import Mathlib.RingTheory.Henselian +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. +-/ + +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..2d7d7553f0 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients +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. +-/ + +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⟩ + +/-- 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 + DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (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..d0b6745602 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +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. +-/ + +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 + +/-- 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 + (DiscreteValuationField.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..150838dfa5 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +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. +-/ + +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 := + ValuationTheory.DiscreteValuationField.Valuation.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..3247897f72 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.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 +-/ + +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. +-/ + +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)) + +/-- 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⟩ := + ValuationTheory.DiscreteValuationField.Valuation.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 := + AlgebraicNumberTheory.Valuations.primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit_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..4c1b29e8e2 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.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 +-/ + +import Mathlib.NumberTheory.RamificationInertia.Ramification +import Mathlib.RingTheory.LocalRing.Basic +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. +-/ + +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] [IsLocalHom (algebraMap 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..2f28492b33 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +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..69aebb1dec --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -0,0 +1,1759 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +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`. +-/ + +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 [unitReduction] + 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 `adicUnitInverseLimit_mk`. -/ +def adicUnitInverseLimit_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) : + adicUnitInverseLimit I := + (adicUnitInverseLimitCompatibleFamiliesEquiv I).symm ⟨x, compatible⟩ + +/-- Defines `adicUnitInverseLimit_eval`. -/ +def adicUnitInverseLimit_eval + {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 : ℕ) : + adicUnitInverseLimit_eval I n (adicUnitInverseLimit_mk 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 : ℕ, adicUnitInverseLimit_eval I n x = + adicUnitInverseLimit_eval 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 + (adicUnitInverseLimit_eval I n x) = + adicUnitInverseLimit_eval 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 := adicUnitInverseLimit_mk I + (fun n => Units.map (adicQuotientInverseLimit_eval I n).toMonoidHom u) + (fun hmn => by + ext + exact adicQuotientInverseLimit_eval_factorPow I hmn + (u : adicQuotientInverseLimit I)) + invFun u := + { val := adicQuotientInverseLimit_mk I + (fun n => (adicUnitInverseLimit_eval I n u : R ⧸ I ^ n)) + (fun hmn => congrArg Units.val + (adicUnitInverseLimit_eval_transition I hmn u)) + inv := adicQuotientInverseLimit_mk I + (fun n => + (((adicUnitInverseLimit_eval 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 (adicUnitInverseLimit_eval I n u) + inv_val := by + ext n + exact Units.inv_mul (adicUnitInverseLimit_eval 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 + (adicCompletion_equiv_quotientInverseLimit 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 : ℕ) : + adicUnitInverseLimit_eval 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 `adicPositiveUnitInverseLimit_mk`. -/ +def adicPositiveUnitInverseLimit_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) : + adicPositiveUnitInverseLimit I := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Defines `adicPositiveUnitInverseLimit_eval`. -/ +def adicPositiveUnitInverseLimit_eval + {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 : ℕ) : + adicPositiveUnitInverseLimit_eval I n + (adicPositiveUnitInverseLimit_mk 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 : ℕ, adicPositiveUnitInverseLimit_eval I n x = + adicPositiveUnitInverseLimit_eval 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 + (adicPositiveUnitInverseLimit_eval I n x) = + adicPositiveUnitInverseLimit_eval I m x := + (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I x).2 hmn + +/-- Defines `adicUnitInverseLimit_toPositive`. -/ +def adicUnitInverseLimit_toPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicUnitInverseLimit I → + adicPositiveUnitInverseLimit I := + fun u => + adicPositiveUnitInverseLimit_mk I + (fun n => adicUnitInverseLimit_eval I (n + 1) u) + (fun hmn => adicUnitInverseLimit_eval_transition I + (Nat.succ_le_succ hmn) u) + +/-- Defines `adicPositiveUnitInverseLimit_toAll`. -/ +def adicPositiveUnitInverseLimit_toAll + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveUnitInverseLimit I → + adicUnitInverseLimit I := + fun u => + adicUnitInverseLimit_mk I (fun n => match n with + | 0 => 1 + | k + 1 => adicPositiveUnitInverseLimit_eval 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) : + adicUnitInverseLimit_toPositive I + (adicPositiveUnitInverseLimit_toAll 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) : + adicPositiveUnitInverseLimit_toAll I + (adicUnitInverseLimit_toPositive 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 := adicUnitInverseLimit_toPositive I + invFun := adicPositiveUnitInverseLimit_toAll 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 : ℕ) : + adicPositiveUnitInverseLimit_eval 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 `dvrPowerIdealUnitInverseLimit_mk`. -/ +def dvrPowerIdealUnitInverseLimit_mk + {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 `dvrPowerIdealUnitInverseLimit_eval`. -/ +def dvrPowerIdealUnitInverseLimit_eval + {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 : ℕ, dvrPowerIdealUnitInverseLimit_eval π n x = + dvrPowerIdealUnitInverseLimit_eval π 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 `dvrHigherUnitQuotientInverseLimit_mk`. -/ +def dvrHigherUnitQuotientInverseLimit_mk + {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 `dvrHigherUnitQuotientInverseLimit_eval`. -/ +def dvrHigherUnitQuotientInverseLimit_eval + {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 : ℕ) : + dvrHigherUnitQuotientInverseLimit_eval π n + (dvrHigherUnitQuotientInverseLimit_mk π 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 : ℕ, dvrHigherUnitQuotientInverseLimit_eval π n x = + dvrHigherUnitQuotientInverseLimit_eval π 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 + (dvrHigherUnitQuotientInverseLimit_eval π n x) = + dvrHigherUnitQuotientInverseLimit_eval π 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 + +private 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 `dvrHigherUnitQuotientInverseLimit_discreteEval`. -/ +def dvrHigherUnitQuotientInverseLimit_discreteEval + {O : Type*} [CommRing O] (π : O) (n : ℕ) : + dvrHigherUnitQuotientInverseLimit π → + DiscreteHigherUnitQuotient π (n + 1) := + fun x => DiscreteHigherUnitQuotient.of π (n + 1) + (dvrHigherUnitQuotientInverseLimit_eval π 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 (dvrHigherUnitQuotientInverseLimit_discreteEval π 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 => + dvrHigherUnitQuotientInverseLimit_discreteEval π 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 => + dvrHigherUnitQuotientInverseLimit_eval π 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 := dvrHigherUnitQuotientInverseLimit_mk π + (fun _ => QuotientGroup.mk u) + (fun {m n} hmn => + 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)) : + units_quotient_equiv hπ + (Nat.succ_pos m) + (dvrHigherUnitQuotientTransition π hmn q) = + Units.map (dvrPowerIdealUnitTransition π hmn).toMonoidHom + (units_quotient_equiv 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 => units_quotient_equiv 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 : ℕ) : + dvrHigherUnitQuotientInverseLimit_eval π n + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u) = + QuotientGroup.mk u := by + apply + (units_quotient_equiv hπ + (Nat.succ_pos n)).injective + change units_quotient_equiv hπ (Nat.succ_pos n) + (dvrHigherUnitQuotientInverseLimit_eval π n + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = + units_quotient_equiv hπ (Nat.succ_pos n) + (QuotientGroup.mk u) + rw [units_quotient_equiv_mk] + change dvrPowerIdealUnitInverseLimit_eval π n + ((higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ) + (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = + unitReduction (uniformizerPowerIdeal π (n + 1)) u + simp [dvrUnitsEquivHigherUnitQuotientInverseLimit, + adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit, + 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 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 π) + refine + { toFun := fun u => c u + invFun := fun q => e.symm q + left_inv := ?_ + right_inv := ?_ + continuous_toFun := ?_ + continuous_invFun := ?_ } + · 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 + · 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] + · 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) + · apply Units.continuous_iff.mpr + constructor + · 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) + · 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 hinv_mk : + (QuotientGroup.mk ((e.symm q')⁻¹ : Oˣ) : + Oˣ ⧸ higherUnitSubgroup π (n + 1)) = + QuotientGroup.mk ((e.symm q)⁻¹ : Oˣ) := by + simpa using congrArg Inv.inv hmk + have hinv_sub_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)⁻¹ : Oˣ) ((e.symm q')⁻¹ : Oˣ)).1 hinv_mk + have hinv_sub : + (((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) + hinv_sub_succ + refine + ⟨(((e.symm q')⁻¹ : Oˣ) : O) - (((e.symm q)⁻¹ : Oˣ) : O), + hinv_sub, ?_⟩ + change (((e.symm q)⁻¹ : Oˣ) : O) + + ((((e.symm q')⁻¹ : Oˣ) : O) - (((e.symm q)⁻¹ : Oˣ) : O)) = + (((e.symm q')⁻¹ : Oˣ) : O) + ring) + +/-- 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 completeDVF_valuationSubring_adicCompletionAlgEquiv + {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 completeDVF_valuationSubring_quotientInverseLimitEquiv + {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 : ℕ) : + adicQuotientInverseLimit_eval F.maximalIdeal n + (completeDVF_valuationSubring_quotientInverseLimitEquiv 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 completeDVF_units_adicCompletionUnitsEquiv + {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ˣ) : + (completeDVF_units_adicCompletionUnitsEquiv F u : + AdicCompletion F.maximalIdeal F.valuationSubring) = + completeDVF_valuationSubring_adicCompletionAlgEquiv 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ˣ, + completeDVF_units_adicCompletionUnitsEquiv 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 completeDVF_unitsEquivUnitInverseLimit + {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 : ℕ) : + adicUnitInverseLimit_eval F.maximalIdeal n + (completeDVF_unitsEquivUnitInverseLimit 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 completeDVF_unitsModMaximalIdealPowEquiv + {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ˣ) : + completeDVF_unitsModMaximalIdealPowEquiv 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 completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit + {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 + (completeDVF_valuationSubring_quotientInverseLimitEquiv 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 : ℕ) : + adicPositiveQuotientInverseLimit_eval + (IsLocalRing.maximalIdeal + (Valued.v : Valuation K Gamma).valuationSubring) n + (completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit + (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 + adicPositiveQuotientInverseLimit_eval 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 completeValuedField_valuationSubringPositiveQuotientInverseLimitHomeomorph + {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] [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)) : + 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] [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)) : + 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 completeValuedField_unitsEquivHigherUnitQuotientInverseLimit + {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 : ℕ) : + dvrHigherUnitQuotientInverseLimit_eval pi n + (completeValuedField_unitsEquivHigherUnitQuotientInverseLimit + 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 completeValuedField_unitsHigherUnitQuotientInverseLimitHomeomorph + {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..94a7c460bc --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -0,0 +1,947 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models +import Mathlib.Algebra.Ring.TransferInstance +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. +-/ + +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 adicQuotientInverseLimit_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) : + adicQuotientInverseLimit I := + (adicQuotientInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Coordinate evaluation from the explicit projective limit. -/ +def adicQuotientInverseLimit_eval + {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 : ℕ) : + adicQuotientInverseLimit_eval I n + (adicQuotientInverseLimit_mk 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 : ℕ, adicQuotientInverseLimit_eval I n x = + adicQuotientInverseLimit_eval 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 + (adicQuotientInverseLimit_eval I n x) = + adicQuotientInverseLimit_eval 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 + +private 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 adicQuotientInverseLimit_discreteEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicQuotientInverseLimit I → DiscreteAdicQuotient I n := + fun x => DiscreteAdicQuotient.of I n + (adicQuotientInverseLimit_eval 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 (adicQuotientInverseLimit_discreteEval 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 adicCompletion_toQuotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : + AdicCompletion I R → adicQuotientInverseLimit I := + fun z => + adicQuotientInverseLimit_mk 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 adicQuotientInverseLimit_toCompletion + {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 + (adicQuotientInverseLimit_eval 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 + (adicQuotientInverseLimit_toCompletion I x) = + adicQuotientInverseLimit_eval I n x := by + change (Ideal.quotientEquivAlgOfEq R (by ext r; simp)) + ((adicQuotientInverseLimit_toCompletion I x).val n) = + adicQuotientInverseLimit_eval I n x + dsimp [adicQuotientInverseLimit_toCompletion] + 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) : + adicQuotientInverseLimit_toCompletion I + (adicCompletion_toQuotientInverseLimit 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) : + adicCompletion_toQuotientInverseLimit I + (adicQuotientInverseLimit_toCompletion I x) = x := by + ext n + change AdicCompletion.evalₐ I n + (adicQuotientInverseLimit_toCompletion I x) = + adicQuotientInverseLimit_eval 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 adicCompletion_equiv_quotientInverseLimit + {R : Type*} [CommRing R] (I : Ideal R) : + AdicCompletion I R ≃+* adicQuotientInverseLimit I where + toFun := adicCompletion_toQuotientInverseLimit I + invFun := adicQuotientInverseLimit_toCompletion 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 adicQuotientInverseLimit_canonicalMap + {R : Type*} [CommRing R] (I : Ideal R) : + R →+* adicQuotientInverseLimit I where + toFun x := adicQuotientInverseLimit_mk 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 + (adicCompletion_equiv_quotientInverseLimit 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 : ℕ) : + adicQuotientInverseLimit_eval 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 + +private 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 `adicPositiveQuotientInverseLimit_mk`. -/ +def adicPositiveQuotientInverseLimit_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) : + adicPositiveQuotientInverseLimit I := + (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).symm + ⟨x, compatible⟩ + +/-- Defines `adicPositiveQuotientInverseLimit_eval`. -/ +def adicPositiveQuotientInverseLimit_eval + {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 : ℕ) : + adicPositiveQuotientInverseLimit_eval I n + (adicPositiveQuotientInverseLimit_mk 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 : ℕ, adicPositiveQuotientInverseLimit_eval I n x = + adicPositiveQuotientInverseLimit_eval 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) + (adicPositiveQuotientInverseLimit_eval I n x) = + adicPositiveQuotientInverseLimit_eval 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 + +private 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 `adicPositiveQuotientInverseLimit_discreteEval`. -/ +def adicPositiveQuotientInverseLimit_discreteEval + {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : + adicPositiveQuotientInverseLimit I → DiscreteAdicQuotient I (n + 1) := + fun x => DiscreteAdicQuotient.of I (n + 1) + (adicPositiveQuotientInverseLimit_eval 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 (adicPositiveQuotientInverseLimit_discreteEval 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 `adicQuotientInverseLimit_toPositive`. -/ +def adicQuotientInverseLimit_toPositive + {R : Type*} [CommRing R] (I : Ideal R) : + adicQuotientInverseLimit I → + adicPositiveQuotientInverseLimit I := + fun x => + adicPositiveQuotientInverseLimit_mk I + (fun n => adicQuotientInverseLimit_eval I (n + 1) x) + (fun hmn => + adicQuotientInverseLimit_eval_factorPow I + (Nat.succ_le_succ hmn) x) + +/-- Defines `adicPositiveQuotientInverseLimit_toAll`. -/ +def adicPositiveQuotientInverseLimit_toAll + {R : Type*} [CommRing R] (I : Ideal R) : + adicPositiveQuotientInverseLimit I → + adicQuotientInverseLimit I := + fun x => + adicQuotientInverseLimit_mk I (fun n => match n with + | 0 => 0 + | k + 1 => adicPositiveQuotientInverseLimit_eval 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) : + adicQuotientInverseLimit_toPositive I + (adicPositiveQuotientInverseLimit_toAll 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) : + adicPositiveQuotientInverseLimit_toAll I + (adicQuotientInverseLimit_toPositive 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 := adicQuotientInverseLimit_toPositive I + invFun := adicPositiveQuotientInverseLimit_toAll 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 adicPositiveQuotientInverseLimit_canonicalMap + {R : Type*} [CommRing R] (I : Ideal R) : + R →+* adicPositiveQuotientInverseLimit I where + toFun x := adicPositiveQuotientInverseLimit_mk 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 : ℕ) : + adicPositiveQuotientInverseLimit_eval I n + (adicPositiveQuotientInverseLimitEquiv I x) = + Ideal.Quotient.mk (I ^ (n + 1)) x := + adicQuotientInverseLimitEquiv_apply I x (n + 1) + +private 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 + (adicPositiveQuotientInverseLimit_canonicalMap 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, adicPositiveQuotientInverseLimit_canonicalMap] 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..e133a18023 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.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 +-/ + +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`. +-/ + +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..faef611e6e --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.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 +-/ + +import Mathlib.Algebra.Ring.Subring.Basic +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. +-/ + +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..2c56636858 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.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 +-/ + +import Mathlib.Topology.Homeomorph.Defs +import Mathlib.Topology.Order +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. +-/ + +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..1219c45322 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension +import Mathlib.RingTheory.Valuation.RamificationGroup +import Mathlib.FieldTheory.Normal.Basic + +/-! # Unique Ring -/ +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 + (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_pullback_of_hasExtension_valuation + V.valuation W x) + _ ↔ x ∈ V.toSubring := (V.mem_toSubring x).symm + apply + ValuationTheory.DiscreteValuationField.Valuation.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 + (ValuationTheory.DiscreteValuationField.Valuation.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..3f75c6fcde --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.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 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete +import Mathlib.RingTheory.AdicCompletion.Topology +import Mathlib.Topology.Algebra.Valued.ValuedField + +/-! # Valued Adic Complete -/ +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 + (ValuationTheory.DiscreteValuationField.Valuation.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 := + (ValuationTheory.DiscreteValuationField.Valuation.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 95e0c8ad83..bf372a5981 100644 --- a/LeanPool/projects.yml +++ b/LeanPool/projects.yml @@ -9966,3 +9966,36 @@ projects: msc: - '90C35' - '05C21' + - 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 From 2e2b5b381624ae97e453d7f7106c43fe2656d596 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 18:42:46 +0000 Subject: [PATCH 02/33] Port complete upstream content to current Mathlib and improve lint compliance --- .../LocalGlobalArtinCompatibility/Factorization.lean | 6 +++--- .../FinitePadicAuxiliaryField.lean | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean index 16881509f5..81f83a96f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -340,7 +340,7 @@ private theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply 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 opaque exists_finitePlaceNormDescent_localGlobalRepresentative +private theorem exists_finitePlaceNormDescent_localGlobalRepresentative {M : Type} [Field M] [NumberField M] [Algebra K M] [FiniteDimensional K M] [IsGalois K M] @@ -467,7 +467,7 @@ private opaque exists_finitePlaceNormDescent_localGlobalRepresentative 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 opaque exists_finitePlacePrimaryNormDescent_localGlobalRepresentative +private theorem exists_finitePlacePrimaryNormDescent_localGlobalRepresentative {M : Type} [Field M] [NumberField M] [Algebra K M] [FiniteDimensional K M] [IsGalois K M] @@ -504,7 +504,7 @@ private opaque exists_finitePlacePrimaryNormDescent_localGlobalRepresentative /-- Cyclic fixed-field descent turns a primary decomposition automorphism into a lower representative without exposing the constructed field tower in the declaration type. -/ -private opaque exists_finitePlacePrimary_cyclicFixedFieldRepresentative +private theorem exists_finitePlacePrimary_cyclicFixedFieldRepresentative (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) (δ : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index 1884050d49..ac5902ab53 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -748,7 +748,7 @@ theorem /-- 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 opaque +private theorem numberFieldTowerFinitePadicAuxiliaryTopPlace_automorphism_apply (v : HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) @@ -785,7 +785,7 @@ private opaque /-- The distinguished auxiliary automorphism preserves the top-field place obtained by restricting the original separable-closure place. -/ -private opaque numberFieldTowerFinitePadicAuxiliaryAutomorphism_mem_topPlaceDecomposition +private theorem numberFieldTowerFinitePadicAuxiliaryAutomorphism_mem_topPlaceDecomposition (v : HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) @@ -837,7 +837,7 @@ private opaque numberFieldTowerFinitePadicAuxiliaryAutomorphism_mem_topPlaceDeco /-- The restricted top-field place and the chosen extension above its centre have the same decomposition group. -/ -private opaque numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_chosen +private theorem numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_chosen (v : HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) @@ -1009,7 +1009,7 @@ private theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply /-- 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. -/ -opaque numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative +theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative (v : HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) From 09a5f038cb02bf62a4476134b6ebc8637eb06a81 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 19:25:08 +0000 Subject: [PATCH 03/33] Split Kummer localization proof and simplify tensor composition --- .../IdeleClassDirectLimitCore.lean | 12 ++- .../SimpleExtensionLocalBehavior.lean | 75 +++++++++++++++++-- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index 5036d35642..f2477ed760 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -318,13 +318,11 @@ theorem rationalRelativeAdeleEmbedding_comp (RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion hEF) z) = RelativeIdeleGroup.adeleEmbedding (IntermediateField.inclusion (hEF.trans hFH)) 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] + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean index a93ca58c25..b94849de6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -449,12 +449,9 @@ theorem htop, IntermediateField.fixingSubgroup_top] omit [NumberField K] 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 +/-- 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) @@ -470,8 +467,10 @@ theorem 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 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 @@ -570,6 +569,66 @@ theorem have hD : D = ⊥ := by rw [← IntermediateField.fixingSubgroup_fixedField D, htop, IntermediateField.fixingSubgroup_top] + exact hD + +omit [NumberField K] 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 From 301da9a509defeb48e4bd804b5212b3456ff563d Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 20:03:17 +0000 Subject: [PATCH 04/33] Port finite-level idele class compositions and direct-limit actions --- .../Idele/ClassGroup/NormComparison.lean | 15 +++++++++++ .../IdeleClassDirectLimitCore.lean | 22 +++++++++------ .../IdeleClassDirectLimitFiniteLevel.lean | 4 ++- .../IdeleClassDirectLimitFiniteLevelCore.lean | 27 +++++++++---------- ...ClassDirectLimitFixedPointDescentCore.lean | 4 ++- 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean index 36d017dda8..81040a7694 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean @@ -63,6 +63,21 @@ theorem classEmbedding_mk (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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index f2477ed760..e64da75e77 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -352,14 +352,16 @@ theorem rationalRelativeIdeleClassEmbedding_comp (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion hEF) c) = RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (hEF.trans hFH)) c := by - refine QuotientGroup.induction_on c ?_ - intro a - exact congrArg - (QuotientGroup.mk' - (RelativeIdeleGroup.principalSubgroup ℚ H)) - (Units.ext - (rationalRelativeAdeleEmbedding_comp hEF hFH - (a : RelativeAdeleRing ℚ E))) + 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 private noncomputable instance : DirectedSystem @@ -440,6 +442,10 @@ noncomputable instance (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean index 8bb7070ea0..72c8501bc4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean @@ -104,7 +104,9 @@ theorem rationalRelativeIdeleEmbedding_unflatten ((IntermediateField.inclusion hKN).toRingHom.toAlgebra) inferInstance (relativeAdeleRingIntermediateAlgebra ℚ K) - (smulCommClass_self K (RelativeAdeleRing ℚ K))).toRingHom a : + (@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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean index 3f76f250e3..480d13d673 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean @@ -112,6 +112,13 @@ noncomputable def rationalIntermediateIdeleClassToDirectLimit (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. -/ @@ -126,21 +133,11 @@ theorem rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure K) (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) c) := by - simp only [rationalIntermediateIdeleClassToDirectLimit, - rationalIntermediateIdeleClassToNormalClosure] - change - rationalRelativeIdeleClassToDirectLimit - (rationalNormalClosure K) - (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) - ((_root_.relativeIdeleClassBaseChangeMulEquiv - (K := ℚ) (L := K)).symm - (_root_.relativeIdeleClassBaseChangeMulEquiv - (K := ℚ) (L := K) c))) = - rationalRelativeIdeleClassToDirectLimit - (rationalNormalClosure K) - (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) c) - rw [(_root_.relativeIdeleClassBaseChangeMulEquiv - (K := ℚ) (L := K)).symm_apply_apply] + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean index 5fae6b8ba2..17560acbc8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean @@ -77,7 +77,9 @@ theorem rationalTowerRelativeIdeleClass_fixed_of_directLimit_fixed _ = y := h_algebraMap yK have hzσ := hz_fixed σ hσK - rw [hzU, DirectLimit.smul_def] at hzσ + 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σ From f19037f4e03d6c1608172a938ffc43271963cd69 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 20:14:17 +0000 Subject: [PATCH 05/33] Extract ambient field-equivariance compatibility for fixed points --- .../Idele/ClassGroup/AlgEquiv.lean | 2 - .../IdeleClassDirectLimitFixedPoints.lean | 152 +++++++++++------- 2 files changed, 91 insertions(+), 63 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index 1f677105a3..20dd6fa5ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -161,8 +161,6 @@ 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] - [FiniteDimensional K L] [FiniteDimensional K M] - [FiniteDimensional K N] (e : L ≃ₐ[K] M) (f : M →ₐ[K] N) (c : RelativeIdeleGroup.ClassGroup K L) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean index 86669d89d4..fbac793daa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean @@ -135,7 +135,7 @@ theorem rationalIntermediateIdeleClassToDirectLimit_conjugation σ • rationalRelativeIdeleClassToDirectLimit N d = rationalRelativeIdeleClassToDirectLimit N (σ • d) := by - exact DirectLimit.smul_def _ _ _ + rfl calc σ • rationalIntermediateIdeleClassToDirectLimit E (_root_.relativeIdeleClassBaseChangeMulEquiv @@ -168,6 +168,92 @@ theorem rationalIntermediateIdeleClassToDirectLimit_conjugation 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. -/ @@ -284,64 +370,8 @@ theorem rationalIntermediateIdeleClassToDirectLimit_ambientAlgEquiv rationalFiniteGaloisIdeleClassToDirectLimit_baseChange U (RelativeIdeleGroup.classEmbedding (K := ℚ) (L := F) (M := U) (IntermediateField.inclusion hFU) cF) - 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 + have hclass' := rationalRelativeIdeleClassEmbedding_ambientAlgEquiv + U hEU hFU σ e hσe cE have hclass : σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) (IntermediateField.inclusion hEU) cE = @@ -355,7 +385,7 @@ theorem rationalIntermediateIdeleClassToDirectLimit_ambientAlgEquiv rationalRelativeIdeleClassToDirectLimit U (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := E) (M := U) (IntermediateField.inclusion hEU) cE) := by - exact DirectLimit.smul_def _ _ _ + rfl calc σ • rationalIntermediateIdeleClassToDirectLimit E c = σ • rationalRelativeIdeleClassToDirectLimit U @@ -416,7 +446,7 @@ theorem rationalIntermediateIdeleClassToDirectLimit_fixed rationalRelativeIdeleClassToDirectLimit N (σ • RelativeIdeleGroup.classEmbedding (K := ℚ) (L := K) (M := N) (IntermediateField.inclusion hKN) d) := by - exact DirectLimit.smul_def _ _ _ + rfl calc σ • rationalIntermediateIdeleClassToDirectLimit K c = σ • rationalIntermediateIdeleClassToDirectLimit K From 9204a813320e6b3f526855229154e6b1fec97c85 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 20:33:46 +0000 Subject: [PATCH 06/33] Make direct-limit action and transport elaboration explicit --- .../IdeleClassDirectLimitExtension.lean | 9 ++++++- .../IdeleClassDirectLimitExtensionAction.lean | 25 +++++-------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean index 9420bf8e90..4821b459ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -17,6 +17,13 @@ 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 @@ -263,7 +270,7 @@ theorem rationalIdeleClassEquivFixed_relativeCosetAction_coe (K := ℚ) (L := K) c)⟩⟧ : rationalIdeleClassDirectLimit) from rfl, - DirectLimit.smul_def] + rationalIdeleClassDirectLimit_smul_mk] apply congrArg Additive.ofMul apply congrArg (fun d : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean index e3fe55d72f..241702daa5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean @@ -568,6 +568,8 @@ private theorem rationalAbstractExtensionIdeleClassEquiv_action_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 @@ -628,25 +630,10 @@ private theorem rationalAbstractExtensionIdeleClassEquiv_action_mk let τ₀ : E ≃ₐ[ℚ] E := τ.restrictScalars ℚ let c : Additive (RelativeIdeleGroup.ClassGroup ℚ E) := eRelative.symm (eFixed.symm (eAmbient x)) - change - (((eAmbient.trans eFixed.symm).trans eRelative.symm).trans eTower) - (M.ρ - (QuotientGroup.mk' - (extensionSubgroup K L hLK) σ) x) = - Additive.ofMul - (τ • Additive.toMul - (eTower - (eRelative.symm - (eFixed.symm (eAmbient x))))) - apply addEquiv_trans_symm_trans_symm_trans_apply_eq - eAmbient eFixed eRelative eTower - (z := Additive.ofMul (τ₀ • Additive.toMul c)) - · exact - rationalAbstractExtensionIdeleClassEquiv_action_fixed_mk - K L hLK hnormal σ x - · simpa only [eTower, τ₀, c] using - (rationalTowerRelativeIdeleClassBaseChangeAddEquiv_smul - F E τ c) + 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 From e398ce18233e3ffca9f1c57d91212e761a10bce8 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 20:49:56 +0000 Subject: [PATCH 07/33] Preserve local representative construction through existence and choice --- ...eClassDirectLimitFiniteTowerNormProof.lean | 3 +- .../FinitePadicAuxiliaryField.lean | 47 ++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean index 656ec3e9ad..c008d4e87f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean @@ -351,7 +351,8 @@ private theorem rationalFiniteTower_representativeAction sigma.1 • (⟦⟨U₀, RelativeIdeleGroup.classEmbedding jEU dℚ⟩⟧ : rationalIdeleClassDirectLimit) = _ - rw [DirectLimit.smul_def] + change (⟦⟨U₀, sigma.1 • RelativeIdeleGroup.classEmbedding jEU dℚ⟩⟧ : + rationalIdeleClassDirectLimit) = _ apply congrArg (fun z : RelativeIdeleGroup.ClassGroup ℚ U₀ => (⟦⟨U₀, z⟩⟧ : rationalIdeleClassDirectLimit)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index ac5902ab53..ad62b9d86c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -1009,7 +1009,7 @@ private theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction_apply /-- 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. -/ -theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative +private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_nonempty (v : HeightOneSpectrum (𝓞 K)) (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) @@ -1038,7 +1038,7 @@ theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative (numberFieldTowerTopSubgroup L) (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) p.1) : - {z : (v.adicCompletion K)ˣ // + Nonempty {z : (v.adicCompletion K)ˣ // chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = numberFieldTowerExtensionQuotientEquivGaloisGroup K L (numberFieldTowerFiniteQuotientCoordinate @@ -1048,6 +1048,7 @@ theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative numberFieldTowerExtensionQuotientEquivGaloisGroup K L (numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ)} := by + refine ⟨?_⟩ let H := numberFieldTowerFinitePadicAuxiliaryAbstractField (K := K) (L := L) p τ hτ @@ -1260,6 +1261,48 @@ theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative exact ⟨z, hlocal, hglobal⟩ +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. -/ From 3631110f9424ce21f94a8a69e7bbe930ac0c5750 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 21:28:02 +0000 Subject: [PATCH 08/33] Factor norm range transport for intrinsic Hilbert fields --- .../Idele/ClassGroup/AlgEquiv.lean | 12 ++++++++++++ .../BigHilbertClassFieldMathlibArtin.lean | 11 ++--------- .../SmallHilbertClassFieldMathlibArtin.lean | 11 ++--------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index 20dd6fa5ac..8396a84686 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -282,6 +282,18 @@ theorem ideleClassNorm_range_algEquiv 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean index 626ec55202..d2a57e9957 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -59,15 +59,8 @@ theorem bigHilbertClassField_ideleClassNorm_range_of_isBig let H := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K let e : E ≃ₐ[K] H := bigHilbertClassFieldEquivOfIsBig E hE calc - (_root_.ideleClassNorm K E).range = - (RelativeIdeleGroup.classNorm K E).range := - ordinaryIdeleClassNorm_range_eq_relative - (K := K) (L := E) - _ = (RelativeIdeleGroup.classNorm K H).range := - (ideleClassNorm_range_algEquiv (K := K) e).symm - _ = (_root_.ideleClassNorm K H).range := - (ordinaryIdeleClassNorm_range_eq_relative - (K := K) (L := H)).symm + (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := + ordinaryIdeleClassNorm_range_algEquiv e _ = _ := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_ideleClassNorm_range_over_original (K := K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index 6231e54f1c..fd11202e1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -44,15 +44,8 @@ theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K let e : E ≃ₐ[K] H := GlobalClassFieldComparison.smallHilbertClassFieldEquivOfIsSmall K E hE calc - (_root_.ideleClassNorm K E).range = - (RelativeIdeleGroup.classNorm K E).range := - ordinaryIdeleClassNorm_range_eq_relative - (K := K) (L := E) - _ = (RelativeIdeleGroup.classNorm K H).range := - (ideleClassNorm_range_algEquiv (K := K) e).symm - _ = (_root_.ideleClassNorm K H).range := - (ordinaryIdeleClassNorm_range_eq_relative - (K := K) (L := H)).symm + (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := + ordinaryIdeleClassNorm_range_algEquiv e _ = _ := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_ideleClassNorm_range_over_original (K := K) From a96861a6d351fa946074f1918cbb3d1c7ca2bee4 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Mon, 21 Sep 2026 22:56:42 +0000 Subject: [PATCH 09/33] Apply checked whitespace suggestions and normalize source typography --- .../Construction/UnitCohomologyAxiom.lean | 2 +- .../Reciprocity/Reduction.lean | 6 +- .../Reciprocity/TotallyRamified.lean | 8 +- .../Galois/AbsoluteAbelianization.lean | 2 +- .../Galois/FixedFieldLattice.lean | 2 +- .../Galois/RelativeAbelianization.lean | 2 +- .../Idele/Cohomology/Decomposition.lean | 6 +- .../Splitting/FinitePlaceIdeal.lean | 2 +- .../ClassFieldAxiom/HasseNormPrinciple.lean | 72 +++++++------- .../SupportedPrincipalQuotient.lean | 2 +- .../ArithmeticRayClassFieldReciprocity.lean | 2 +- .../ClassFieldRealization.lean | 4 +- .../Algebraic/Evaluation.lean | 2 +- .../Topological/Evaluation.lean | 2 +- .../Topological/EvaluationCore.lean | 2 +- .../Topological/EvaluationValue.lean | 2 +- .../ConductorInfinitePart.lean | 2 +- ...HilbertClassFieldUnramifiedMaximality.lean | 4 +- .../RayClassFieldRealization.lean | 2 +- .../NumberFieldComplexification.lean | 2 +- .../Reciprocity/CyclotomicIdeleValue.lean | 10 +- .../Reciprocity/CyclotomicZHatBaseChange.lean | 22 ++--- .../FinitePlaceCyclotomicFrobeniusLift.lean | 2 +- ...eleClassDirectLimitAbstractFixedField.lean | 2 +- .../Reciprocity/InfiniteGlobalArtin.lean | 2 +- .../Factorization.lean | 18 ++-- .../FinitePadicAuxiliaryField.lean | 10 +- .../SeparableClosurePadicLift.lean | 18 ++-- .../RationalCyclotomicFinitePlaceArtin.lean | 2 +- .../TopologicalGlobalNormResidue.lean | 2 +- ...ogicalGlobalNormResidueAbelianization.lean | 2 +- .../RationalRayClassFieldCyclotomic.lean | 8 +- .../ClassFormation/CohomologyBridge.lean | 36 +++---- .../ClassFormation/Hilbert90.lean | 2 +- .../ClassFormation/Main.lean | 8 +- .../ClassFormation/NormalBasis.lean | 32 +++---- .../ClassFormation/NormalBasisCohomology.lean | 2 +- .../NormalBasisGaloisAction.lean | 10 +- .../NormalBasisGradedLifting.lean | 4 +- .../NormalBasisInfiniteProduct.lean | 2 +- .../ClassFormation/Valuation.lean | 12 +-- .../Finite/Existence/LocalAbsoluteData.lean | 4 +- .../LubinTateUniformizerDiagonal.lean | 18 ++-- .../AbstractFixedFieldNorm.lean | 6 +- .../AbstractFixedFieldUnits.lean | 20 ++-- .../ConjugationNaturality.lean | 2 +- .../Filtered/AbstractUnramified.lean | 12 +-- .../LocalReciprocity/Filtered/Core.lean | 4 +- .../FiniteAbstractFixedField.lean | 40 ++++---- .../FiniteExtensionClassFieldAxiom.lean | 4 +- .../FiniteResidueFinrankTransfer.lean | 2 +- .../FiniteSubgroupResidueDegree.lean | 28 +++--- .../FixedFieldContinuousNaturality.lean | 52 +++++----- .../AmbientPrimeComparison.lean | 2 +- .../AmbientPrimeNormTransport.lean | 8 +- .../AmbientPrimeSymbolSetup.lean | 6 +- .../AmbientPrimeWitness.lean | 4 +- .../AmbientPrimeWitnessComparison.lean | 10 +- .../FixedFieldNormQuotient.lean | 30 +++--- .../FixedFieldSpecialization.lean | 2 +- .../IntrinsicBaseEquivalence.lean | 6 +- .../EmbeddedFrobeniusTransport.lean | 2 +- .../IntrinsicFrobeniusQuotientTransport.lean | 2 +- .../NormRestriction.lean | 10 +- .../PrimeComparison.lean | 28 +++--- .../LocalReciprocity/FixedFieldLocalData.lean | 14 +-- .../FixedFieldNormResidueNaturality.lean | 28 +++--- .../FixedFieldRelativeNorm.lean | 16 ++-- .../ResidueAbsoluteDegree.lean | 4 +- .../SemilinearNaturality.lean | 2 +- .../UnramifiedComparison.lean | 2 +- .../UnramifiedNormComparison.lean | 2 +- .../Finite/Unramified/Cohomology.lean | 10 +- .../Kummer/LocalHilbertPairing.lean | 2 +- .../Existence/LaurentLocalField.lean | 2 +- .../Frobenius/LaurentSeriesFrobenius.lean | 2 +- .../FiniteLevel/HigherUnitLevelEquiv.lean | 4 +- .../LubinTate/FiniteLevel/LevelAbelian.lean | 2 +- .../FiniteLevel/LevelAutomorphisms.lean | 14 +-- .../FiniteLevel/LowerRamification.lean | 2 +- .../FiniteLevel/PrimitiveDisplacement.lean | 2 +- .../FiniteLevelPrimitiveRoot.lean | 10 +- .../Cyclic/GaloisCohomology.lean | 4 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 8 +- .../PrincipalUnits/QuotientTower.lean | 20 ++-- .../GroupTheory/Augmentation.lean | 10 +- .../Transfer/RelativeAugmentation.lean | 12 +-- .../GroupTheory/Transfer/Witt.lean | 6 +- .../InverseLimitCore.lean | 2 +- .../FiniteUnramified.lean | 2 +- .../GaloisIntegerRing.lean | 40 ++++---- .../ResidueGalois.lean | 20 ++-- .../FiniteExtensionCorrespondence.lean | 6 +- .../InfiniteGaloisCorrespondence.lean | 94 +++++++++---------- .../HilbertRamification/CharacterMap.lean | 10 +- .../ValuationRestriction.lean | 2 +- .../Ramification/LocalField/BaseChange.lean | 4 +- .../Ramification/LocalField/Core.lean | 4 +- .../AbsoluteValue/ExponentialValuation.lean | 2 +- .../Completion/BaseChangeAdjoinRoot.lean | 2 +- 100 files changed, 501 insertions(+), 501 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean index 59c059d6bd..c3af90a2f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -495,7 +495,7 @@ theorem exists_unit_sigma_sub_eq_of_tateHMinusOne_isZero `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 in ; +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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean index da8cbaaebf..16b2815fe9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean @@ -461,7 +461,7 @@ theorem exists_cyclicIntermediateFields /-! ## 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̃` in the notation of. -/ +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 @@ -482,7 +482,7 @@ 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̃`. -/ +/-- The actual maximal unramified subextension `M = L ∩ K_tilde`. -/ def maximalUnramifiedSubextension (D : DegreeData G) (L : FiniteGaloisSubextension K) : ClosedSubgroup G := L.intermediateField (L.inertiaImage D) @@ -603,7 +603,7 @@ namespace FiniteGaloisSubextension variable {K : ClosedSubgroup G} /-- In the cyclic case, the lower norm arrow for -`L / (L ∩ K̃) / K` is injective by the order calculation from. +`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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean index dae9121366..a263d99e62 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -20,7 +20,7 @@ This file isolates the calculation. The input from the finite reciprocity equiv 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-σ̃)` is descended from `A_M` to the actual fixed group +`π_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`. @@ -40,7 +40,7 @@ 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 `σ̃`, `c = π_Σ^k`, and `b = π_L^k v`. The hypotheses say +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`. -/ @@ -296,8 +296,8 @@ theorem abstractReciprocity_exists_hMinusOne_primitive `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 `σ̃` fixes `π_Σ`, and that `σ` and -`σ̃` have the same action on the element coming from `L`. -/ +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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean index 118b5bef6c..f410a134b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean @@ -66,7 +66,7 @@ noncomputable def absoluteAbelianizationMulEquivMaximalAbelianGalois : maximal abelian extension. -/ @[simp] theorem absoluteAbelianizationMulEquivMaximalAbelianGalois_mk - (sigma : Gal(SeparableClosure K / K)) : + (sigma : Gal(SeparableClosure K/K)) : absoluteAbelianizationMulEquivMaximalAbelianGalois K (QuotientGroup.mk sigma) = AlgEquiv.restrictNormalHom (maximalAbelianExtension K) sigma := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean index 14d61e79c9..a52db3d716 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean @@ -19,7 +19,7 @@ namespace IntermediateField intersection of their fixed fields. -/ theorem fixedField_sup_eq_inf {k Ω : Type*} [Field k] [Field Ω] [Algebra k Ω] - (S T : Subgroup (Gal(Ω / k))) : + (S T : Subgroup (Gal(Ω/k))) : IntermediateField.fixedField (S ⊔ T) = IntermediateField.fixedField S ⊓ IntermediateField.fixedField T := by apply le_antisymm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean index c3a48613f9..f83ac42ac7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean @@ -62,7 +62,7 @@ noncomputable def relativeAbelianizationMulEquiv : /-- The quotient equivalence sends a class to restriction. -/ @[simp] -theorem relativeAbelianizationMulEquiv_mk (sigma : Gal(M / F)) : +theorem relativeAbelianizationMulEquiv_mk (sigma : Gal(M/F)) : relativeAbelianizationMulEquiv F M (QuotientGroup.mk sigma) = AlgEquiv.restrictNormalHom (relativeMaximalAbelianSubextension F M) sigma := rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean index ed83621b8b..8fa254cdab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -357,7 +357,7 @@ theorem unramifiedLocalIntegerUnitsHerbrand_subsingleton [Module.Finite 𝒪[k] 𝒪[ell]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension k ell] - (g : Gal(ell / k)) + (g : Gal(ell/k)) (hg : ∀ σ : Gal(ell / k), σ ∈ Subgroup.zpowers g) : letI := @@ -416,7 +416,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandH0Equiv [Field k] [Field ell] [Algebra k ell] [FiniteDimensional k ell] [ValuativeRel ell] - [MulDistribMulAction (Gal(ell / k)) 𝒪[ell]ˣ] + [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] (e : H ≃* Gal(ell / k)) (σ : G) (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : @@ -440,7 +440,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandHMinusOneEquiv [Field k] [Field ell] [Algebra k ell] [FiniteDimensional k ell] [ValuativeRel ell] - [MulDistribMulAction (Gal(ell / k)) 𝒪[ell]ˣ] + [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] (e : H ≃* Gal(ell / k)) (σ : G) (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean index c34388f3a9..70bd21a50a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -169,7 +169,7 @@ theorem Set.Finite.preimage_finitePlaceBelow (hS : S.Finite) : {W : HeightOneSpectrum (𝓞 L) | finitePlaceBelow (K := K) W ∈ S}.Finite := by - show + change ((finitePlaceBelow (K := K)) ⁻¹' S).Finite exact hS.preimage' (fun v _ => finite_finitePlaceBelow_fibre diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index 19dc3456be..0459851c03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -53,7 +53,7 @@ private theorem mulExact_transport_mulEquiv (eB.toMonoidHom.comp f) (eC.toMonoidHom.comp (g.comp eB.symm.toMonoidHom)) := by intro y - show + change eC (g (eB.symm y)) = 1 ↔ ∃ x, eB (f x) = y constructor @@ -86,14 +86,14 @@ private noncomputable def tateH0FixedCycle (groupCohomology.cochainsIso₀ M) (groupCohomology.cochainsIso₁ M) (by - show + 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 - show LinearMap.ker + change LinearMap.ker (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom exact ⟨Additive.ofMul a.1, by rw [groupCohomology.d₀₁_ker_eq_invariants] @@ -114,7 +114,7 @@ private theorem tateH0FixedCycle_iCycles (tateComplex M).iCycles 0 (tateH0FixedCycle a) = (groupCohomology.cochainsIso₀ M).inv (by - show Additive A + change Additive A exact Additive.ofMul a.1) := by let M := Rep.ofMulDistribMulAction G A let S : ShortComplex (ModuleCat ℤ) := @@ -126,21 +126,21 @@ private theorem tateH0FixedCycle_iCycles (groupCohomology.cochainsIso₀ M) (groupCohomology.cochainsIso₁ M) (by - show + 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 - show LinearMap.ker + 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⟩ - show + change (((((tateComplex M).cyclesIsoSc' (-1) 0 1 (by simp) (by simp)).inv ≫ (tateComplex M).iCycles 0).hom @@ -148,26 +148,26 @@ private theorem tateH0FixedCycle_iCycles (S.moduleCatCyclesIso.inv x)))) = (groupCohomology.cochainsIso₀ M).inv (by - show Additive A + change Additive A exact Additive.ofMul a.1) rw [HomologicalComplex.cyclesIsoSc'_inv_iCycles] - show + change (((ShortComplex.cyclesMap eS.inv ≫ ((tateComplex M).sc' (-1) 0 1).iCycles).hom (S.moduleCatCyclesIso.inv x))) = (groupCohomology.cochainsIso₀ M).inv (by - show Additive A + change Additive A exact Additive.ofMul a.1) rw [ShortComplex.cyclesMap_i] - show + change (((S.moduleCatCyclesIso.inv ≫ S.iCycles ≫ eS.inv.τ₂).hom x)) = (groupCohomology.cochainsIso₀ M).inv (by - show Additive A + change Additive A exact Additive.ofMul a.1) rw [ShortComplex.moduleCatCyclesIso_inv_iCycles_assoc] - show + change (groupCohomology.cochainsIso₀ (Rep.ofMulDistribMulAction G A)).inv (Additive.ofMul a.1) = (groupCohomology.cochainsIso₀ @@ -194,7 +194,7 @@ private theorem tateH0FixedCycle_map apply (ModuleCat.mono_iff_injective ((tateComplex MB).iCycles 0)).1 inferInstance - show + change (((HomologicalComplex.cyclesMap (tateComplex.map φ) 0 ≫ (tateComplex MB).iCycles 0).hom (tateH0FixedCycle a))) = @@ -205,12 +205,12 @@ private theorem tateH0FixedCycle_map apply (ModuleCat.mono_iff_injective (groupCohomology.cochainsIso₀ MB).hom).1 inferInstance - show + change (((groupCohomology.cochainsMap (.id G) φ).f 0 ≫ (groupCohomology.cochainsIso₀ MB).hom).hom ((groupCohomology.cochainsIso₀ MA).inv (by - show Additive A + change Additive A exact Additive.ofMul a.1))) = (groupCohomology.cochainsIso₀ MB).hom ((groupCohomology.cochainsIso₀ MB).inv @@ -232,7 +232,7 @@ private theorem isoZeroBoundary_fixedCycle S.homologyπ (S.moduleCatCyclesIso.inv (by - show LinearMap.ker + change LinearMap.ker (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom exact ⟨Additive.ofMul a.1, by @@ -254,14 +254,14 @@ private theorem isoZeroBoundary_fixedCycle (groupCohomology.cochainsIso₀ M) (groupCohomology.cochainsIso₁ M) (by - show + 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 - show LinearMap.ker + change LinearMap.ker (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom exact ⟨Additive.ofMul a.1, by rw [groupCohomology.d₀₁_ker_eq_invariants] @@ -281,7 +281,7 @@ private theorem isoZeroBoundary_fixedCycle (-1) 0 1 (by simp) (by simp)).inv ((ShortComplex.cyclesMapIso eS).inv y) by rfl] - show + change (ShortComplex.cyclesMapIso eS).hom (((tateComplex M).cyclesIsoSc' (-1) 0 1 (by simp) (by simp)).hom @@ -295,13 +295,13 @@ private theorem isoZeroBoundary_fixedCycle ((tateComplex M).homologyIsoSc' (-1) 0 1 (by simp) (by simp)).hom ≫ ShortComplex.homologyMap eS.hom := by - show + change ShortComplex.homologyMap ((eSc ≪≫ eS).hom) = ShortComplex.homologyMap eSc.hom ≫ ShortComplex.homologyMap eS.hom rw [Iso.trans_hom, ShortComplex.homologyMap_comp] rw [hIso] - show + change ((((tateComplex M).homologyπ 0 ≫ ((tateComplex M).homologyIsoSc' (-1) 0 1 (by simp) (by simp)).hom) ≫ @@ -327,7 +327,7 @@ private theorem tateH0IsoHerbrandH0_fixedCycle ShortComplex.mk M.norm.toModuleCatHom (groupCohomology.d₀₁ M) (Rep.norm_comp_d_eq_zero M) let x : S.moduleCatLeftHomologyData.K := by - show LinearMap.ker + change LinearMap.ker (groupCohomology.d₀₁ (Rep.ofMulDistribMulAction G A)).hom exact ⟨Additive.ofMul a.1, by rw [groupCohomology.d₀₁_ker_eq_invariants] @@ -340,7 +340,7 @@ private theorem tateH0IsoHerbrandH0_fixedCycle ((tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = S.homologyπ y := by exact isoZeroBoundary_fixedCycle a - show + change (tateH0IsoHerbrandH0 (G := G) (A := A)).hom (show tateCohomology M 0 from (tateComplex M).homologyπ 0 (tateH0FixedCycle a)) = @@ -504,7 +504,7 @@ theorem globalFieldNormSubgroup_le_everywhereLocalFieldNormSubgroup globalFieldNormSubgroup K L ≤ everywhereLocalFieldNormSubgroup K L := by rintro x ⟨y, rfl⟩ - show + change IdeleGroup.principalIdele K (Units.map (Algebra.norm K : L →* K) y) ∈ @@ -632,7 +632,7 @@ private theorem principalIdeleHerbrandH0Map_mk Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup.principalSubgroup K L))) := by - show + change (tateH0IsoHerbrandH0 (G := L ≃ₐ[K] L) (A := RelativeIdeleGroup.principalSubgroup K L)).hom cP = _ @@ -641,7 +641,7 @@ private theorem principalIdeleHerbrandH0Map_mk eI cI = (Additive.ofMul (HerbrandH0.mk aI) : Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by - show + change (tateH0IsoHerbrandH0 (G := L ≃ₐ[K] L) (A := RelativeIdeleGroup K L)).hom cI = _ @@ -649,7 +649,7 @@ private theorem principalIdeleHerbrandH0Map_mk have hc : ((tateCohomologyFunctor 0).map f).hom cP = cI := by dsimp only [cP, cI] - show + change ((((tateComplex (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) (RelativeIdeleGroup.principalSubgroup K L))).homologyπ 0) ≫ @@ -686,7 +686,7 @@ private theorem principalIdeleHerbrandH0Map_mk Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by rw [← hPe, eP.symm_apply_apply, ← hIe] exact congrArg eI hc - show + change Additive.toMul (eI (((tateCohomologyFunctor 0).map f).hom (eP.symm @@ -856,7 +856,7 @@ theorem ideleClassToPrincipalConnecting_range_eq_ker have htarget : Function.MulExact connecting principal := by exact mulExact_transport_mulEquiv δm fm eP eI hbase - show MonoidHom.range connecting = MonoidHom.ker principal + change MonoidHom.range connecting = MonoidHom.ker principal exact htarget.monoidHom_ker_eq.symm end IdeleClassConnecting @@ -982,7 +982,7 @@ theorem fieldUnitsHerbrandH0_map_baseFieldUnit_eq_one_of_mem_norm apply (HerbrandH0.mk_eq_one_iff aI).2 obtain ⟨z, hz⟩ := hx refine ⟨z, ?_⟩ - show + change tateNorm (L ≃ₐ[K] L) (RelativeIdeleGroup K L) z = (aI : RelativeIdeleGroup K L) dsimp only [aP, @@ -1005,7 +1005,7 @@ theorem fieldUnitsHerbrandH0_map_baseFieldUnit_eq_one_of_mem_norm (fieldUnitsEquivPrincipalIdeles K L) (fieldUnitsEquivPrincipalIdeles_smul K L) (baseFieldUnitAsFixedUnit K L x) - show + change principalIdeleHerbrandH0Map K L (fieldUnitsHerbrandH0EquivPrincipalIdeles K L (HerbrandH0.mk (baseFieldUnitAsFixedUnit K L x))) = @@ -1077,7 +1077,7 @@ theorem ideleClassToFieldUnitsConnecting_range_eq_ker ext q constructor · rintro ⟨c, rfl⟩ - show + change principalIdeleHerbrandH0Map K L (e (e.symm (ideleClassToPrincipalConnecting K L c))) = 1 @@ -1097,7 +1097,7 @@ theorem ideleClassToFieldUnitsConnecting_range_eq_ker exact hq obtain ⟨c, hc⟩ := heq refine ⟨c, ?_⟩ - show e.symm + change e.symm (ideleClassToPrincipalConnecting K L c) = q rw [hc, e.symm_apply_apply] @@ -1190,7 +1190,7 @@ theorem everywhereLocalFieldNormSubgroup_le_global_of_subsingleton refine ⟨y, ?_⟩ apply Units.ext apply FaithfulSMul.algebraMap_injective K L - show + change algebraMap K L ((Units.map (Algebra.norm K : L →* K) y : Kˣ) : K) = algebraMap K L (x : K) @@ -1277,7 +1277,7 @@ theorem hasseNormDiagonal_injective_iff exact (QuotientGroup.eq_one_iff (IdeleGroup.principalIdele K x)).1 hx - show + change QuotientGroup.mk' (globalFieldNormSubgroup K L) x = 1 exact (QuotientGroup.eq_one_iff x).2 (hlocal hxlocal) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean index 9c738d17ef..45c9dace27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -148,7 +148,7 @@ theorem sUnitPrincipalIdelePowerSubgroup_map IdeleGroup.principalIdele K (y : Kˣ) ∈ idelePowerLocalUnitSubgroup (K := K) n S T := by exact hy - show + change (((sUnitEquivSupportedPrincipalIdeleSubgroup (K := K) S T y : supportedPrincipalIdeleSubgroup (K := K) S T) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean index 6fe4a1a6a1..b6f4846312 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -109,7 +109,7 @@ global reciprocity from the transport between the equal norm quotients. -/ private theorem arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_apply (m : RayClass.Modulus K) - (σ : Gal((rayClassField K m) / K)) : + (σ : Gal((rayClassField K m)/K)) : arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup (K := K) m σ = QuotientGroup.quotientMulEquivOfEq diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean index 6c1006d3b8..48eb03edc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -88,14 +88,14 @@ theorem IsAbelianGalois.of_base_equiv variable {k Ω : Type} [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] - {K : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] (L : FiniteAbelianSubextension K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean index 4b4f4bef6a..ea3f802e2c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean @@ -29,7 +29,7 @@ theorem closedFiniteIndexClassFieldGaloisEquivNormQuotient_apply (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] (σ : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K)) : + (K := K) H hclosed)/K)) : closedFiniteIndexClassFieldGaloisEquivNormQuotient (K := K) H hclosed σ = closedFiniteIndexClassFieldReciprocityValue diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean index 98da499b1f..bf97933575 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean @@ -30,7 +30,7 @@ theorem (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] (σ : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K)) : + (K := K) H hclosed)/K)) : closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient (K := K) H hclosed σ = closedFiniteIndexClassFieldReciprocityValue diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean index a5264aa1a2..27e7d2a9af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean @@ -40,7 +40,7 @@ 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)) : + (σ : Gal(L/K)) : ((globalReciprocityContinuousMulEquiv K L).trans (QuotientGroup.quotientContinuousMulEquivOfEq hNorm)) σ = QuotientGroup.quotientMulEquivOfEq hNorm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean index 9900fc8354..76d183a4af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean @@ -40,7 +40,7 @@ noncomputable abbrev closedFiniteIndexClassFieldReciprocityValue (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] (σ : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K)) : + (K := K) H hclosed)/K)) : IdeleClassGroup K ⧸ H := QuotientGroup.quotientMulEquivOfEq (closedFiniteIndexClassField_ideleClassNorm_range diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean index 70bf1424fe..b59fafa154 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -77,7 +77,7 @@ private theorem eraseRealPlace_isDefiningModulus_of_range_le (hvH : (IdeleGroup.infinitePlaceIdeleClass v.1).range ≤ H) : IsDefiningModulus H (m.eraseRealPlace v) := by let m' : RayClass.Modulus K := m.eraseRealPlace v - show IsDefiningModulus H m' + change IsDefiningModulus H m' let q : IdeleGroup K →* IdeleClassGroup K := QuotientGroup.mk' (IdeleGroup.principalSubgroup K) rw [IsDefiningModulus, RayClass.Modulus.congruenceSubgroup, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean index df933869f1..485200951b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean @@ -46,7 +46,7 @@ theorem isUnramifiedAtFinitePlaces_of_normRange_eq_bigHilbertNormSubgroup apply (ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified (K := K) (L := L)).1 - show + change (ideleClassNormConductorialSubgroup (K := K) (L := L)).narrowFiniteConductor = 0 have hsub : @@ -66,7 +66,7 @@ theorem isUnramifiedAtFinitePlaces_of_normRange_eq_smallHilbertNormSubgroup apply (ideleClassNorm_narrowFiniteConductor_eq_zero_iff_all_finitePlaces_unramified (K := K) (L := L)).1 - show + change (ideleClassNormConductorialSubgroup (K := K) (L := L)).narrowFiniteConductor = 0 have hsub : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index 6e40483da7..3e91f3b10d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -430,7 +430,7 @@ general closed-finite-index reciprocity equivalence. -/ theorem rayClassFieldGaloisContinuousMulEquivRayClassGroup_apply (m : RayClass.Modulus K) - (σ : Gal((rayClassField K m) / K)) : + (σ : Gal((rayClassField K m)/K)) : rayClassFieldGaloisContinuousMulEquivRayClassGroup (K := K) m σ = closedFiniteIndexClassFieldGaloisEquivNormQuotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index 73ad492e16..ce46756463 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -292,7 +292,7 @@ private noncomputable def numberFieldComplexificationTransportCyclotomic : (numberFieldComplexificationCyclotomicEquiv F)).toMonoidHom private theorem numberFieldComplexificationRestriction_commutes - (σ : Gal(numberFieldComplexification F / F)) : + (σ : Gal(numberFieldComplexification F/F)) : numberFieldComplexificationTransportCyclotomic F (numberFieldComplexificationRestriction F σ) = numberFieldComplexificationLayerRestriction F diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean index cac8a5bb8b..9a062f5abf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -13,7 +13,7 @@ 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 ∩ ℚ̃ : ℚ]`, +`f_K = [K ∩ ℚ_tilde : ℚ]`, constructed in `CyclotomicZHatBaseChange`. @@ -203,7 +203,7 @@ theorem exact hQProjection.symm /-- The rational normalization factor is one: -`[ℚ ∩ ℚ̃ : ℚ] = 1`. -/ +`[ℚ ∩ ℚ_tilde : ℚ] = 1`. -/ @[simp] theorem cyclotomicZHatIntersectionDegree_rat : cyclotomicZHatIntersectionDegree ℚ = 1 := @@ -369,7 +369,7 @@ theorem finiteCyclotomicLayer_normArtin_range_eq_fixingSubgroup K E /-- The ordinary norm `N_{K/ℚ}` factors through the determinant norm -from the actual intersection `K ∩ ℚ̃`. This is 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 @@ -438,7 +438,7 @@ theorem simp [b]] /-- The infinite rational Artin symbol of `N_{K/ℚ}(a)` fixes the actual -intersection `K ∩ ℚ̃`. -/ +intersection `K ∩ ℚ_tilde`. -/ theorem rationalCyclotomicZHatGlobalArtin_norm_mem_intersection_fixingSubgroup (a : IdeleGroup K) : @@ -514,7 +514,7 @@ theorem _ = 1 := hfinite /-- The rational Artin symbols of norms from `K` are dense in the -subgroup fixing the actual intersection `K ∩ ℚ̃`. At each finite +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 50c7d49b14..85432c3c0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -23,7 +23,7 @@ closure of `ℚ`. To form its compositum with an arbitrary number field, we fir embed that number field into the same separable closure. The intersection degree below is the normalization integer -`f_K = [K ∩ ℚ̃ : ℚ]`. +`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 @@ -92,7 +92,7 @@ noncomputable instance rationalCyclotomicZHatField_isNormal : rationalCyclotomicZHatField_isAbelianGalois.toIsGalois.to_normal /-- The cyclotomic Galois-group equivalence, transported from the nested -presentation to the copy of `ℚ̃` in `SeparableClosure ℚ`. -/ +presentation to the copy of `ℚ_tilde` in `SeparableClosure ℚ`. -/ noncomputable def rationalCyclotomicZHatFieldGalEquivZHat : (rationalCyclotomicZHatField ≃ₐ[ℚ] rationalCyclotomicZHatField) ≃ₜ* @@ -194,7 +194,7 @@ noncomputable def rationalCyclotomicZHatField /-- The actual global degree datum -`d : Gal(ℚ̄/ℚ) → Multiplicative ZHat`, obtained by restriction to the +`d : Gal(ℚ_bar/ℚ) → Multiplicative ZHat`, obtained by restriction to the cyclotomic `ZHat`-extension. -/ noncomputable def rationalCyclotomicDegreeData : DegreeData @@ -287,7 +287,7 @@ theorem rationalCyclotomicDegreeData_fixedField_inertia : rationalCyclotomicZHatField /-- For every abstract rational fixed field `F`, the field fixed by -its cyclotomic inertia is the genuine compositum `Fℚ̃` in +its cyclotomic inertia is the genuine compositum `Fℚ_tilde` in `SeparableClosure ℚ`. -/ theorem rationalCyclotomicDegreeData_fixedField_fieldInertia @@ -638,14 +638,14 @@ noncomputable instance rationalCyclotomicZHatFieldGal_isMulTorsionFree : variable (K : Type*) [Field K] [NumberField K] -/-- The finite intersection `K ∩ ℚ̃` inside the common separable +/-- The finite intersection `K ∩ ℚ_tilde` inside the common separable closure. -/ def numberFieldCyclotomicZHatIntersection : IntermediateField ℚ (SeparableClosure ℚ) := numberFieldInRationalSeparableClosure K ⊓ rationalCyclotomicZHatField -/-- The intersection `K ∩ ℚ̃`, embedded back into the original number +/-- 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 := @@ -706,7 +706,7 @@ noncomputable instance rationalCyclotomicZHatField_isAbelianGalois /-- The cyclotomic intersection degree -`f_K = [K ∩ ℚ̃ : ℚ]`. -/ +`f_K = [K ∩ ℚ_tilde : ℚ]`. -/ noncomputable def cyclotomicZHatIntersectionDegree : ℕ := Module.finrank ℚ (numberFieldCyclotomicZHatIntersection K) @@ -807,8 +807,8 @@ theorem cyclotomicZHatIntersectionDegree_dvd_finrank : simpa only [cyclotomicZHatIntersectionDegree] using h /-- Under the actual Galois identification with `ZHat`, the -subgroup fixing `K ∩ ℚ̃` is precisely -`f_K ZHat`, where `f_K = [K ∩ ℚ̃ : ℚ]`. -/ +subgroup fixing `K ∩ ℚ_tilde` is precisely +`f_K ZHat`, where `f_K = [K ∩ ℚ_tilde : ℚ]`. -/ theorem rationalCyclotomicZHatFieldGal_fixingSubgroup_image_eq_mulNat_range : (((numberFieldCyclotomicZHatIntersection K).restrict @@ -957,7 +957,7 @@ def numberFieldCyclotomicZHatFiniteIntersection (numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).fieldRange /-- An element of the finite-layer intersection is, in the common -separable closure, an element of the full intersection `K ∩ ℚ̃`. -/ +separable closure, an element of the full intersection `K ∩ ℚ_tilde`. -/ theorem numberFieldCyclotomicZHatFiniteIntersection_coe_mem_intersection (E : @@ -1286,7 +1286,7 @@ theorem r.range).symm _ = J.fixingSubgroup := by rw [hfixedField] -/-- The actual compositum `Kℚ̃` inside `SeparableClosure ℚ`. -/ +/-- The actual compositum `Kℚ_tilde` inside `SeparableClosure ℚ`. -/ def numberFieldCyclotomicZHatCompositum : IntermediateField ℚ (SeparableClosure ℚ) := numberFieldInRationalSeparableClosure K ⊔ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean index e1b11db1f5..7dc67c3f33 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -651,7 +651,7 @@ noncomputable instance /-- 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 ∩ ℚ̃`. -/ +`F ∩ ℚ_tilde`. -/ theorem numberFieldCyclotomicZHatCompositumCoordinate_range_toAddSubgroup (F : Type*) [Field F] [NumberField F] : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean index c2b2769d3c..0961945648 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean @@ -25,7 +25,7 @@ open CyclicCohomology distinguished base subgroup. This is `rationalIdeleClassEquivFixed` at the bottom intermediate field, transported along mathlib's canonical `ℚ ≃ₐ[ℚ] ⊥` equivalence and the identity -`Gal(ℚ̄/⊥) = baseField`. -/ +`Gal(ℚ_bar/⊥) = baseField`. -/ noncomputable def rationalIdeleClassEquivBaseFixed : Additive (IdeleClassGroup ℚ) ≃+ KummerTheory.ambientFixedAddSubgroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index b4d7ae92e9..81349e78a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -870,7 +870,7 @@ noncomputable def ℚ rationalCyclotomicZHatField) (hE : NumberField E) (hAbelian : IsAbelianGalois ℚ E) - (f : (E' ≃ₐ[K] E') →* Gal(E / ℚ)) + (f : (E' ≃ₐ[K] E') →* Gal(E/ℚ)) (hnat : letI : NumberField E' := hE' letI : NumberField E := hE diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean index 81f83a96f4..fcff9238a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -41,13 +41,13 @@ variable the relative Galois group. -/ private theorem numberFieldTowerFiniteQuotientCoordinate_mem_primary (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) - (σ' : Gal(L / K)) + (σ' : Gal(L/K)) (hτσ : numberFieldTowerExtensionQuotientEquivGaloisGroup K L (numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ) = σ') (hprimary : - σ' ∈ CommGroup.primaryComponent (Gal(L / K)) p.1) : + σ' ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) : numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ ∈ CommGroup.primaryComponent @@ -83,12 +83,12 @@ private theorem exists_finitePlacePrimary_localGlobalRepresentative (chosenFinitePlaceExtension (L := L) v).1) (hgenerate : Subgroup.closure - ({σ.1} : Set (Gal(L / K))) = + ({σ.1} : Set (Gal(L/K))) = ⊤) (hprimary : σ.1 ∈ CommGroup.primaryComponent - (Gal(L / K)) p.1) : + (Gal(L/K)) p.1) : ∃ z : (v.adicCompletion K)ˣ, chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = σ.1 ∧ @@ -230,7 +230,7 @@ theorem absoluteValueDecompositionGroup K (chosenFinitePlaceExtension (L := L) v).1) (hgenerate : - Subgroup.closure ({σ.1} : Set (Gal(L / K))) = ⊤) + Subgroup.closure ({σ.1} : Set (Gal(L/K))) = ⊤) (hprimary : σ.1 ∈ CommGroup.primaryComponent (Gal(L / K)) p.1) (x : (v.adicCompletion K)ˣ) @@ -349,7 +349,7 @@ private theorem exists_finitePlaceNormDescent_localGlobalRepresentative (v : IsDedekindDomain.HeightOneSpectrum (𝓞 K)) (W : IsDedekindDomain.HeightOneSpectrum (𝓞 M)) (hWbelow : finitePlaceBelow (K := K) W = v) - (σM : Gal(L / M)) (σG : Gal(L / K)) + (σM : Gal(L/M)) (σG : Gal(L/K)) (hrestrict : ((AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K)) σM = σG) @@ -481,10 +481,10 @@ private theorem exists_finitePlacePrimaryNormDescent_localGlobalRepresentative absoluteValueDecompositionGroup M (chosenFinitePlaceExtension (L := L) W).1) (hgenerate : - Subgroup.closure ({δM.1} : Set (Gal(L / M))) = ⊤) + Subgroup.closure ({δM.1} : Set (Gal(L/M))) = ⊤) (hprimary : δM.1 ∈ CommGroup.primaryComponent (Gal(L / M)) p.1) - (σG : Gal(L / K)) + (σG : Gal(L/K)) (hrestrict : ((AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K)) δM.1 = σG) : @@ -511,7 +511,7 @@ private theorem exists_finitePlacePrimary_cyclicFixedFieldRepresentative absoluteValueDecompositionGroup K (chosenFinitePlaceExtension (L := L) v).1) (hprimary : - δ.1 ∈ CommGroup.primaryComponent (Gal(L / K)) p.1) : + δ.1 ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) : ∃ z : (v.adicCompletion K)ˣ, chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v z = δ.1 ∧ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index ad62b9d86c..f453e402d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -1386,13 +1386,13 @@ through the compatible finite quotient coordinate. -/ theorem numberFieldTowerFiniteQuotientCoordinate_generates_of_galoisGenerator (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) - (σ : Gal(L / K)) + (σ : Gal(L/K)) (hτσ : numberFieldTowerExtensionQuotientEquivGaloisGroup K L (numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ) = σ) - (hσ : Subgroup.closure ({σ} : Set (Gal(L / K))) = ⊤) : + (hσ : Subgroup.closure ({σ} : Set (Gal(L/K))) = ⊤) : Subgroup.closure ({numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ} : @@ -1768,7 +1768,7 @@ theorem exists_finitePlaceCyclotomicAuxiliaryFixedField (chosenFinitePlaceExtension (L := L) v).1) (hσ : Subgroup.closure - ({σ.1} : Set (Gal(L / K))) = + ({σ.1} : Set (Gal(L/K))) = ⊤) : letI _ : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L @@ -1843,12 +1843,12 @@ theorem exists_finitePlacePrimaryCyclotomicAuxiliaryFixedField (chosenFinitePlaceExtension (L := L) v).1) (hgenerate : Subgroup.closure - ({σ.1} : Set (Gal(L / K))) = + ({σ.1} : Set (Gal(L/K))) = ⊤) (hprimary : σ.1 ∈ CommGroup.primaryComponent - (Gal(L / K)) p.1) : + (Gal(L/K)) p.1) : letI _ : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L letI _ : Algebra L (SeparableClosure ℚ) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean index fa2314ff78..443ac29ba7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -76,7 +76,7 @@ noncomputable def automorphismCyclicFixedField (Subgroup.closure ({σ} : Set (Gal(L / K)))) noncomputable local instance automorphismCyclicFixedFieldNumberField - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : NumberField (automorphismCyclicFixedField σ) := NumberField.of_module_finite K (automorphismCyclicFixedField σ) @@ -84,7 +84,7 @@ noncomputable local instance automorphismCyclicFixedFieldNumberField /-- An automorphism, regarded over the fixed field of the cyclic subgroup it generates. -/ noncomputable def automorphismOverCyclicFixedField - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : Gal(L / automorphismCyclicFixedField σ) := IntermediateField.fixingSubgroupEquiv (automorphismCyclicFixedField σ) @@ -100,7 +100,7 @@ omit [NumberField K] [NumberField L] [IsAbelianGalois K L] in field recovers the original automorphism. -/ @[simp] theorem automorphismOverCyclicFixedField_restrictScalars - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : (automorphismOverCyclicFixedField σ).restrictScalars K = σ := by ext x rfl @@ -109,7 +109,7 @@ 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)) : + (σ : Gal(L/K)) : Subgroup.closure ({automorphismOverCyclicFixedField σ} : Set @@ -160,7 +160,7 @@ theorem automorphismOverCyclicFixedField_generates the chosen extension of `v` to that field and taking its centre. -/ noncomputable def automorphismCyclicFixedPlace (v : HeightOneSpectrum (𝓞 K)) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : let M := automorphismCyclicFixedField σ HeightOneSpectrum (𝓞 M) := by dsimp only @@ -178,7 +178,7 @@ base-field place. -/ @[simp] theorem finitePlaceBelow_automorphismCyclicFixedPlace (v : HeightOneSpectrum (𝓞 K)) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : finitePlaceBelow (K := K) (automorphismCyclicFixedPlace v σ) = v := by @@ -196,7 +196,7 @@ place used in the norm--restriction square without making a new valuation choice. -/ theorem finitePlaceBelow_chosenExtensionCentre_eq_automorphismCyclicFixedPlace (v : HeightOneSpectrum (𝓞 K)) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : let M := automorphismCyclicFixedField σ finitePlaceBelow (K := M) (finitePlaceExtensionCentre @@ -229,7 +229,7 @@ cyclic-reduction place whose centre is the original chosen place of `L`. -/ noncomputable def automorphismCyclicFixedTopExtension (v : HeightOneSpectrum (𝓞 K)) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : let M := automorphismCyclicFixedField σ AbsoluteValueExtension (NumberField.HeightOneSpectrum.adicAbv M @@ -255,7 +255,7 @@ as the original chosen extension over the base field. -/ @[simp] theorem automorphismCyclicFixedTopExtension_centre (v : HeightOneSpectrum (𝓞 K)) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : let M := automorphismCyclicFixedField σ finitePlaceExtensionCentre (K := M) (L := L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 57b01117ca..87e2809c04 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -1565,7 +1565,7 @@ private theorem (p : Nat.Primes) (n : ℕ) (sigma : Gal( rationalCyclotomicPrincipalPrimeLevel - (rationalCyclotomicPrincipalPrimeModulus p n) / ℚ)) + (rationalCyclotomicPrincipalPrimeModulus p n)/ℚ)) (a : (ZMod (p.1 ^ (n + 1)))ˣ) (haction : sigma (rationalCyclotomicLevelPrimitiveRoot diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean index 68d5168f68..ecff3ab04d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean @@ -119,7 +119,7 @@ actual norm-residue equivalence, with no additional choice of an abstract group isomorphism. -/ @[simp] theorem globalReciprocityContinuousMulEquiv_apply - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : globalReciprocityContinuousMulEquiv K L σ = Additive.toMul ((globalNormResidueEquiv K L).symm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean index 69810b4247..04e99e07ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -137,7 +137,7 @@ noncomputable def globalReciprocityAbelianizationContinuousMulEquiv : actual finite-Galois norm-residue map. -/ @[simp] theorem globalReciprocityAbelianizationContinuousMulEquiv_apply - (σ : Abelianization (Gal(L / K))) : + (σ : Abelianization (Gal(L/K))) : globalReciprocityAbelianizationContinuousMulEquiv K L σ = Additive.toMul ((globalNormResidueAbelianizationEquiv K L).symm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index 935535fef6..71026bde79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -138,7 +138,7 @@ theorem galEquivZMod_autCongr [IsCyclotomicExtension {m} ℚ A] [IsCyclotomicExtension {m} ℚ B] (e : A ≃ₐ[ℚ] B) - (σ : Gal(A / ℚ)) : + (σ : Gal(A/ℚ)) : IsCyclotomicExtension.Rat.galEquivZMod m B (AlgEquiv.autCongr e σ) = IsCyclotomicExtension.Rat.galEquivZMod @@ -426,7 +426,7 @@ theorem (σ : Gal( KummerTheory.rationalCyclotomicLevel - ⟨m, NeZero.pos m⟩ / ℚ)) : + ⟨m, NeZero.pos m⟩/ℚ)) : rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m σ = QuotientGroup.quotientMulEquivOfEq @@ -689,7 +689,7 @@ standard `galEquivZMod` map literally. -/ @[simp] theorem rationalCyclotomicGaloisContinuousMulEquivZModUnits_apply - (σ : Gal(CyclotomicField m ℚ / ℚ)) : + (σ : Gal(CyclotomicField m ℚ/ℚ)) : rationalCyclotomicGaloisContinuousMulEquivZModUnits m σ = IsCyclotomicExtension.Rat.galEquivZMod @@ -702,7 +702,7 @@ cyclotomic norm-range equality. -/ @[simp] theorem rationalCyclotomicGaloisContinuousMulEquivRayClassGroup_apply - (σ : Gal(CyclotomicField m ℚ / ℚ)) : + (σ : Gal(CyclotomicField m ℚ/ℚ)) : rationalCyclotomicGaloisContinuousMulEquivRayClassGroup m σ = QuotientGroup.quotientMulEquivOfEq diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean index 902f622809..cc365f1368 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -36,7 +36,7 @@ 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ˣ) : + [Fintype (Gal(L/K))] (x : Lˣ) : Additive.toMul (unitsNormLinearMap K L (Additive.ofMul x)) = tateNorm (Gal(L / K)) Lˣ x := by have hnorm : @@ -133,7 +133,7 @@ private def mulEquivMultiplicativeToEquiv /-- Additive quotient map from fixed units to invariant units modulo norms. -/ def additiveFixedUnitToInvariantsNormQuotientHom - [Fintype (Gal(L / K))] : + [Fintype (Gal(L/K))] : Additive (fixedSubgroup (Gal(L / K)) Lˣ) →+ (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := additiveEquivToQuotientHom (additiveFixedUnitsEquivInvariants K L) @@ -141,7 +141,7 @@ def additiveFixedUnitToInvariantsNormQuotientHom /-- Send a fixed unit to its invariant-unit class modulo norms. -/ def fixedUnitToInvariantsNormQuotientMonoidHom - [Fintype (Gal(L / K))] : + [Fintype (Gal(L/K))] : fixedSubgroup (Gal(L / K)) Lˣ →* Multiplicative (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := @@ -151,7 +151,7 @@ def fixedUnitToInvariantsNormQuotientMonoidHom /-- 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ˣ) : + [Fintype (Gal(L/K))] (x : fixedSubgroup (Gal(L / K)) Lˣ) : Multiplicative.toAdd (fixedUnitToInvariantsNormQuotientMonoidHom K L x) = (unitsTateH0NormSubmodule K L).mkQ @@ -161,7 +161,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_apply /-- 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))] : + [Fintype (Gal(L/K))] : kernelOfAdditiveQuotientHom (unitsTateH0NormSubmodule K L) (fixedUnitToInvariantsNormQuotientMonoidHom K L) = (tateNormSubgroup (Gal(L / K)) Lˣ).subgroupOf @@ -207,7 +207,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_ker /-- Every invariant-unit class modulo norms has a multiplicatively fixed representative. -/ theorem fixedUnitToInvariantsNormQuotientMonoidHom_surjective - [Fintype (Gal(L / K))] : + [Fintype (Gal(L/K))] : Function.Surjective (fixedUnitToInvariantsNormQuotientMonoidHom K L) := by intro q rcases Submodule.mkQ_surjective (unitsTateH0NormSubmodule K L) @@ -230,7 +230,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_surjective /-- The multiplicative Herbrand quotient is the invariant-unit quotient by norms. -/ def herbrandH0MulEquivInvariantsNormQuotient - [Fintype (Gal(L / K))] := + [Fintype (Gal(L/K))] := quotientMulEquivOfSurjectiveAdditiveQuotient (unitsTateH0NormSubmodule K L) ((tateNormSubgroup (Gal(L / K)) Lˣ).subgroupOf @@ -241,7 +241,7 @@ def herbrandH0MulEquivInvariantsNormQuotient /-- The multiplicative Herbrand quotient of field units is mathlib's degree-zero Tate cohomology. -/ -def herbrandH0EquivTateCohomologyZero [Fintype (Gal(L / K))] : +def herbrandH0EquivTateCohomologyZero [Fintype (Gal(L/K))] : HerbrandH0 (Gal(L / K)) Lˣ ≃ tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0 := (mulEquivMultiplicativeToEquiv @@ -251,7 +251,7 @@ def herbrandH0EquivTateCohomologyZero [Fintype (Gal(L / K))] : /-- 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))] : + [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) @@ -266,7 +266,7 @@ theorem unitsRhoSub_toMul_eq_sigmaMinusOne /-- 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))] : +def additiveNormKernelEquivUnitsNormKer [Fintype (Gal(L/K))] : Additive (normKernelSubgroup (Gal(L / K)) Lˣ) ≃+ LinearMap.ker (unitsNormLinearMap K L) where toFun x := ⟨Additive.ofMul @@ -290,7 +290,7 @@ def additiveNormKernelEquivUnitsNormKer [Fintype (Gal(L / K))] : /-- The actual additive differential `ρ(g)-1`, with codomain restricted to the kernel of the norm. -/ -def unitsRhoSubToNormKerLinearMap [Fintype (Gal(L / K))] +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 @@ -310,7 +310,7 @@ def unitsRhoSubToNormKerLinearMap [Fintype (Gal(L / K))] /-- 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)) : + [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) := @@ -320,7 +320,7 @@ def additiveNormKernelToUnitsBoundaryQuotientHom /-- Multiplicative form of the standard boundary quotient map. -/ def normKernelToUnitsBoundaryQuotientMonoidHom - [Fintype (Gal(L / K))] (g : Gal(L / K)) : + [Fintype (Gal(L/K))] (g : Gal(L / K)) : normKernelSubgroup (Gal(L / K)) Lˣ →* Multiplicative (LinearMap.ker (unitsNormLinearMap K L) ⧸ @@ -331,7 +331,7 @@ def normKernelToUnitsBoundaryQuotientMonoidHom /-- 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)) : + [Fintype (Gal(L/K))] (g : Gal(L / K)) : kernelOfAdditiveQuotientHom (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) (normKernelToUnitsBoundaryQuotientMonoidHom K L g) = @@ -388,7 +388,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_ker /-- 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)) : + [Fintype (Gal(L/K))] (g : Gal(L / K)) : Function.Surjective (normKernelToUnitsBoundaryQuotientMonoidHom K L g) := by intro q @@ -415,7 +415,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_surjective /-- 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)) : + [Fintype (Gal(L/K))] (g : Gal(L / K)) : HerbrandHMinusOne (Gal(L / K)) Lˣ g ≃* Multiplicative (LinearMap.ker (unitsNormLinearMap K L) ⧸ @@ -431,7 +431,7 @@ def herbrandHminusOneMulEquivUnitsBoundaryQuotient /-- Type-level comparison with the standard boundary quotient. -/ def herbrandHminusOneEquivUnitsBoundaryQuotient - [Fintype (Gal(L / K))] (g : Gal(L / K)) : + [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) := @@ -441,7 +441,7 @@ def herbrandHminusOneEquivUnitsBoundaryQuotient /-- 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)) + [FiniteDimensional K L] (g : Gal(L/K)) (hg : ∀ x : Gal(L / K), x ∈ Subgroup.zpowers g) : tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1) ≅ ModuleCat.of ℤ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean index 3b6ed60097..ff9db70554 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean @@ -22,7 +22,7 @@ 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) : + (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)) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index 37e3732f83..9bdcb66487 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -89,7 +89,7 @@ private theorem localIntegerUnitsHerbrandQuotient_eq_one /-- Finiteness of actual unit Tate `H⁰`, produced from the same local normal-basis witness as the cardinality theorem. -/ theorem localFieldUnitsTateH0FiniteOfGenerator - (g : Gal(L / K)) + (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 @@ -97,7 +97,7 @@ theorem localFieldUnitsTateH0FiniteOfGenerator /-- 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)) + (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 ∧ @@ -108,7 +108,7 @@ theorem localFieldUnits_tate_card_of_generator /-- States the theorem `localFieldUnitsTateH0FiniteOfIsCyclic`. -/ theorem localFieldUnitsTateH0FiniteOfIsCyclic - [IsCyclic (Gal(L / K))] : + [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), @@ -117,7 +117,7 @@ theorem localFieldUnitsTateH0FiniteOfIsCyclic /-- 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))] : +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean index 4af0b69b12..9cd3530b32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -49,7 +49,7 @@ noncomputable def chosenNormalBasisIntegerLatticeBasis : /-- The integral lattice basis has the same underlying vectors as the chosen normal basis. -/ @[simp] -theorem chosenNormalBasisIntegerLatticeBasis_apply (σ : Gal(L / K)) : +theorem chosenNormalBasisIntegerLatticeBasis_apply (σ : Gal(L/K)) : ((chosenNormalBasisIntegerLatticeBasis K L σ : chosenNormalBasisIntegerLattice K L) : L) = IsGalois.normalBasis K L σ := by simp [chosenNormalBasisIntegerLatticeBasis, LinearEquiv.coe_ofEq_apply] @@ -351,7 +351,7 @@ omit [FiniteDimensional K L] [IsGalois K L] in @[simp] theorem chosenNormalBasisPiResidueInverseIndexAddEquiv_apply (f : Gal(L / K) → (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K]))) - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : chosenNormalBasisPiResidueInverseIndexAddEquiv K L f σ = integerRingModMaximalIdealAddEquivResidue K (f σ⁻¹) := rfl @@ -369,7 +369,7 @@ noncomputable def chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv (n : Nat) /-- Computes right-regular residue coordinates of a scaled lattice representative. -/ @[simp] theorem chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow - (n : Nat) (x : chosenNormalBasisIntegerLattice K L) (σ : Gal(L / K)) : + (n : Nat) (x : chosenNormalBasisIntegerLattice K L) (σ : Gal(L/K)) : chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv K L n (chosenNormalBasisLatticeSuccQuotMk K L n (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)) σ = @@ -387,7 +387,7 @@ theorem chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow /-! ### 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)) : +def galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv (τ : Gal(L/K)) : chosenNormalBasisIntegerLattice K L ≃ₗ[𝒪[K]] chosenNormalBasisIntegerLattice K L where toFun x := ⟨τ (x : L), @@ -420,7 +420,7 @@ 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) : + (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : ((galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x : chosenNormalBasisIntegerLattice K L) : L) = τ (x : L) := rfl @@ -438,7 +438,7 @@ 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) : + (τ υ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L (τ * υ) x = galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L υ x) := by @@ -450,7 +450,7 @@ 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) : + (τ σ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : (chosenNormalBasisIntegerLatticeBasis K L).equivFun (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x) σ = (chosenNormalBasisIntegerLatticeBasis K L).equivFun x (τ⁻¹ * σ) := by @@ -484,7 +484,7 @@ theorem chosenNormalBasisIntegerLatticeBasis_equivFun_galoisGroup /-- The lattice uniformizer submodule is stable under every Galois automorphism. -/ theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_galoisGroup - (τ : Gal(L / K)) : + (τ : Gal(L/K)) : (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ : chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] @@ -533,7 +533,7 @@ theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_galoisGroup /-- The actual Galois action on the fixed quotient `M / π_K M`. -/ noncomputable def galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv - (τ : Gal(L / K)) : + (τ : Gal(L/K)) : (chosenNormalBasisIntegerLattice K L ⧸ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) ≃ₗ[𝒪[K]] (chosenNormalBasisIntegerLattice K L ⧸ @@ -547,7 +547,7 @@ noncomputable def galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv /-- 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) : + (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv K L τ (Submodule.Quotient.mk x) = Submodule.Quotient.mk @@ -557,7 +557,7 @@ theorem galoisGroupChosenNormalBasisIntegerLatticeQuotLinearEquiv_mk /-- 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)) : + (n : Nat) (τ : Gal(L/K)) : chosenNormalBasisLatticeSuccQuot K L n ≃+ chosenNormalBasisLatticeSuccQuot K L n := (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n).toAddEquiv.trans @@ -567,7 +567,7 @@ noncomputable def galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv /-- 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) : + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ (chosenNormalBasisLatticeSuccQuotMk K L n (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x)) = @@ -588,7 +588,7 @@ theorem galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv_mk_mulPow /-- Removing the common uniformizer power intertwines the two quotient Galois actions. -/ @[simp] theorem chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGroup - (n : Nat) (τ : Gal(L / K)) + (n : Nat) (τ : Gal(L/K)) (q : chosenNormalBasisLatticeSuccQuot K L n) : chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n (galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ q) = @@ -602,7 +602,7 @@ theorem chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_galoisGr /-- 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) : + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : ((chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n (galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv K L τ x) : chosenBaseUniformizerPowSubmodule K L n @@ -663,7 +663,7 @@ noncomputable def galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction /-- 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) : + (n : Nat) (τ : Gal(L/K)) (x : chosenNormalBasisIntegerLattice K L) : letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n τ • chosenNormalBasisLatticeSuccQuotMk K L n (chosenNormalBasisIntegerLatticeMulPowLinearEquiv K L n x) = @@ -717,7 +717,7 @@ theorem chosenNormalBasisLatticeSuccQuot_herbrandH0_subsingleton (n : Nat) : /-- Cyclic Herbrand `H⁻¹` vanishes on every additive normal-basis lattice graded piece. -/ theorem chosenNormalBasisLatticeSuccQuot_herbrandHMinusOne_subsingleton - (n : Nat) (τ : Gal(L / K)) + (n : Nat) (τ : Gal(L/K)) (hgen : ∀ g : Gal(L / K), g ∈ Subgroup.zpowers τ) : letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n letI := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean index 02ba94d940..d943df1a3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean @@ -38,7 +38,7 @@ variable (K L : Type u) [Field K] [Field L] [Algebra 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)) + (g : Gal(L/K)) (hgen : ∀ sigma : Gal(L / K), sigma ∈ Subgroup.zpowers g) : ∃ c : Nat, ∀ n : Nat, c ≤ n → ∀ (V : Subgroup 𝒪[L]ˣ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean index 2d2833d8b6..72862dafc3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -93,7 +93,7 @@ variable (K L : Type u) [Field K] [Field L] [Algebra K L] /-- 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} + (n : Nat) (sigma : Gal(L/K)) {x : L} (hx : x ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L)) : sigma x ∈ chosenBaseUniformizerPowSubmodule K L n @@ -121,7 +121,7 @@ variable [ValuativeRel 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]ˣ} + (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 @@ -154,7 +154,7 @@ def chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction theorem chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction_smul (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) - (sigma : Gal(L / K)) (a : V) : + (sigma : Gal(L/K)) (a : V) : letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV ((sigma • a : V) : 𝒪[L]ˣ) = letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L @@ -242,7 +242,7 @@ theorem chosenNormalBasisIntegerUnitsQuotientMap_apply theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) - (sigma : Gal(L / K)) (a : V) : + (sigma : Gal(L/K)) (a : V) : letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V (sigma • a) = @@ -253,7 +253,7 @@ theorem chosenNormalBasisPrincipalUnitSubgroupInclusion_equivariant theorem chosenNormalBasisIntegerUnitsQuotientMap_equivariant (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) - (sigma : Gal(L / K)) (a : 𝒪[L]ˣ) : + (sigma : Gal(L/K)) (a : 𝒪[L]ˣ) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV chosenNormalBasisIntegerUnitsQuotientMap (L := L) V (sigma • a) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean index ed9d771bfe..863c5a24b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -35,7 +35,7 @@ variable (K L : Type u) [Field K] [Field L] [Algebra K L] 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]ˣ) + (n : Nat) (sigma : Gal(L/K)) (u : 𝒪[L]ˣ) (hu : u ∈ chosenNormalBasisPrincipalUnitSet K L n) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n @@ -102,7 +102,7 @@ theorem chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction_smul_mk (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1)) - (sigma : Gal(L / K)) (u : Vn) : + (sigma : Gal(L/K)) (u : Vn) : letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n Vn hVn letI := chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean index e93e2a9929..9eb23e54f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -174,7 +174,7 @@ 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]ˣ) + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean index fc7aad70c0..33b9d127a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -47,7 +47,7 @@ def galoisGroupFieldUnitsMulDistribMulAction @[simp] theorem galoisGroupFieldUnitsMulDistribMulAction_smul (K L : Type u) [Field K] [Field L] [Algebra K L] - (σ : Gal(L / K)) (x : Lˣ) : + (σ : Gal(L/K)) (x : Lˣ) : letI := galoisGroupFieldUnitsMulDistribMulAction K L σ • x = Units.mapEquiv σ.toMulEquiv x := rfl @@ -89,7 +89,7 @@ theorem galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[L]ˣ) : + (σ : Gal(L/K)) (x : 𝒪[L]ˣ) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L σ • x = Units.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv x := @@ -111,7 +111,7 @@ def galoisGroupValueGroupMulDistribMulAction @[simp] theorem galoisGroupValueGroupMulDistribMulAction_smul (K L : Type u) [Field K] [Field L] [Algebra K L] - (σ : Gal(L / K)) (n : Multiplicative Int) : + (σ : Gal(L/K)) (n : Multiplicative Int) : letI := galoisGroupValueGroupMulDistribMulAction K L σ • n = n := rfl @@ -122,7 +122,7 @@ theorem integerUnitsToFieldUnits_galoisGroup_equivariant [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[L]ˣ) : + (σ : Gal(L/K)) (x : 𝒪[L]ˣ) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupFieldUnitsMulDistribMulAction K L integerUnitsToFieldUnits L (σ • x) = @@ -142,7 +142,7 @@ theorem valuationMap_unitsMapEquiv_galoisGroup [IsNonarchimedeanLocalField L] [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : Lˣ) : + (σ : Gal(L/K)) (x : Lˣ) : valuationMap L (Additive.ofMul (Units.mapEquiv σ.toMulEquiv x)) = valuationMap L (Additive.ofMul x) := by @@ -209,7 +209,7 @@ theorem valuationUnitsMulHom_galoisGroup_equivariant [IsNonarchimedeanLocalField L] [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : Lˣ) : + (σ : Gal(L/K)) (x : Lˣ) : letI := galoisGroupFieldUnitsMulDistribMulAction K L letI := galoisGroupValueGroupMulDistribMulAction K L valuationUnitsMulHom L (σ • x) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean index d1964fd4b8..31ed6f999c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean @@ -65,10 +65,10 @@ end OpenFiniteIndexSubgroup 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) (hnormal : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H + (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)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index 2fb473340d..7289bd66e1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -530,7 +530,7 @@ theorem lubinTateUniformizerDiagonalCompositumField_isGalois 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)) : + (δ : Gal(C/B)) : AlgEquiv.restrictNormalHom B (MulSemiringAction.toAlgAut Gal(C / B) K C δ) = 1 := by @@ -543,7 +543,7 @@ private theorem explicitRestrictNormalHom_toAlgAut_eq_one 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)) + (σ τ : Gal(C/K)) (ρ : Gal(A/K)) (hσ : AlgEquiv.restrictNormalHom A σ = ρ) (hτ : AlgEquiv.restrictNormalHom A τ = ρ) : AlgEquiv.restrictNormalHom A (σ * τ⁻¹) = 1 := by @@ -552,7 +552,7 @@ private theorem explicitRestrictNormalHom_mul_inv_eq_one 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)) + (σ : Gal(C/K)) (hσ : AlgEquiv.restrictNormalHom A σ = 1) : σ ∈ A.fixingSubgroup := by rw [IntermediateField.mem_fixingSubgroup_iff] @@ -565,7 +565,7 @@ private theorem explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one 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)) + (A B : IntermediateField K C) (σ : Gal(C/K)) (hA : σ ∈ A.fixingSubgroup) (hB : σ ∈ B.fixingSubgroup) (hSup : A ⊔ B = ⊤) : σ = 1 := by @@ -578,7 +578,7 @@ private theorem explicit_eq_one_of_mem_fixingSubgroup_of_sup_eq_top 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)) + (σ τ : Gal(C/K)) (hA : AlgEquiv.restrictNormalHom A σ = AlgEquiv.restrictNormalHom A τ) (hB : AlgEquiv.restrictNormalHom B σ = @@ -606,8 +606,8 @@ private theorem explicitAlgEquiv_eq_of_restrict_eq_of_sup_eq_top 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 : ℕ) + [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) @@ -638,7 +638,7 @@ private theorem exists_explicitAlgEquiv_with_disjoint_restrictions (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)) : + (hInf : A ⊓ B = ⊥) (σA : Gal(A/K)) (σB : Gal(B/K)) : ∃ σ : Gal(C / K), AlgEquiv.restrictNormalHom A σ = σA ∧ AlgEquiv.restrictNormalHom B σ = σB := by @@ -835,7 +835,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) - (σ : Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u) / K)) + (σ : Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u)/K)) (hσUnramified : let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean index 95feacbaac..05203d0fe3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -65,7 +65,7 @@ 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 ⧸ + [Finite ((baseField (Gal(Ω/K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / K))) H (le_baseField H))] [FiniteDimensional K (abstractFixedField K Ω H)] [Algebra.IsSeparable K (abstractFixedField K Ω H)] @@ -109,7 +109,7 @@ 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 ⧸ + [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H (le_baseField H))] [FiniteDimensional K @@ -174,7 +174,7 @@ 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 ⧸ + [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H (le_baseField H))] [FiniteDimensional K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean index f3caac92da..f00e1882e2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean @@ -37,7 +37,7 @@ 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))) : + (H : ClosedSubgroup (Gal(Ω/k))) : Additive (abstractFixedField k Ω H)ˣ ≃+ ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) H where toFun x := ⟨intermediateFieldUnitsToGaloisAmbient k Ω @@ -81,7 +81,7 @@ omit [IsGalois k Ω] in /-- States the theorem `abstractFixedFieldUnitsEquivGaloisFixed_coe`. -/ @[simp] theorem abstractFixedFieldUnitsEquivGaloisFixed_coe - (H : ClosedSubgroup (Gal(Ω / k))) + (H : ClosedSubgroup (Gal(Ω/k))) (x : Additive (abstractFixedField k Ω H)ˣ) : ((abstractFixedFieldUnitsEquivGaloisFixed k Ω H x).1 : Additive Ωˣ) = @@ -92,7 +92,7 @@ theorem abstractFixedFieldUnitsEquivGaloisFixed_coe /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) : Additive (abstractRelativeFixedField k Ω hLK)ˣ ≃+ ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) L := by @@ -103,7 +103,7 @@ omit [IsGalois k Ω] in /-- States the theorem `abstractRelativeFixedFieldUnitsEquivGaloisFixed_coe`. -/ @[simp] theorem abstractRelativeFixedFieldUnitsEquivGaloisFixed_coe - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (x : Additive (abstractRelativeFixedField k Ω hLK)ˣ) : ((abstractRelativeFixedFieldUnitsEquivGaloisFixed @@ -115,7 +115,7 @@ theorem abstractRelativeFixedFieldUnitsEquivGaloisFixed_coe /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : (extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) @@ -130,7 +130,7 @@ omit [IsGalois k Ω] in /-- States the theorem `abstractRelativeUnitsEquiv_extensionUnitsEquiv`. -/ @[simp] theorem abstractRelativeUnitsEquiv_extensionUnitsEquiv - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) (x : (extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) @@ -148,7 +148,7 @@ theorem abstractRelativeUnitsEquiv_extensionUnitsEquiv /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) (σ : K.toSubgroup) @@ -203,7 +203,7 @@ theorem abstractExtensionQuotientEquivGaloisGroup_mk_apply_val /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) (x : Additive (abstractRelativeFixedField k Ω hLK)ˣ) @@ -234,7 +234,7 @@ theorem relativeCosetAction_abstractRelativeFixedFieldUnit_val /-- The carrier comparison intertwines the descended quotient action with the actual relative Galois action. -/ theorem abstractExtensionFixedRepresentationUnitsEquiv_action - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) @@ -276,7 +276,7 @@ theorem abstractExtensionFixedRepresentationUnitsEquiv_action 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := hnormal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean index 1a17cd5610..b9a6895d30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -59,7 +59,7 @@ theorem abelianizedGaloisConjugationOfEmbeddings_eq_refl 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))) + (D : ClassFormation.DegreeData (Gal(SeparableClosure K/K))) (v : ClassFormation.ValuationData D (galoisAmbientUnitsRep K (SeparableClosure K))) (hcf : ClassFormation.SatisfiesClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean index e6c070e681..a4e257a71f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean @@ -303,10 +303,10 @@ 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))) + (Gal(SeparableClosure K/K))) (hnormal : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H.field + (baseField (Gal(SeparableClosure K/K))) H.field (le_baseField H.field)).Normal) : let E := abstractFixedField K (SeparableClosure K) H.field @@ -346,10 +346,10 @@ theorem abstractFixedField_isUnramifiedValuedExtension (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - (Gal(SeparableClosure K / K))) + (Gal(SeparableClosure K/K))) (hnormal : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H.field + (baseField (Gal(SeparableClosure K/K))) H.field (le_baseField H.field)).Normal) (hunramified : H.toFiniteAbstractExtension.IsUnramified @@ -454,10 +454,10 @@ theorem localUpperRamificationGroup_abstractFixedField_eq_bot (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - (Gal(SeparableClosure K / K))) + (Gal(SeparableClosure K/K))) (hnormal : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H.field + (baseField (Gal(SeparableClosure K/K))) H.field (le_baseField H.field)).Normal) (hunramified : H.toFiniteAbstractExtension.IsUnramified diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean index 7cc4f9a548..a22abb03e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean @@ -139,8 +139,8 @@ theorem filteredLocalReciprocity_descends (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))) + (upperE : ℝ → Subgroup (Gal(E/K))) + (upperF : ℝ → Subgroup (Gal(F/K))) (hupper : ∀ t, Subgroup.map (intermediateFieldRestrictNormalHom E F hEF) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean index e0684d9b62..f52d5b851a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -30,14 +30,14 @@ 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))) : +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))) : + (H : ClosedSubgroup (Gal(Ω/k))) : closedFixingSubgroup k Ω (abstractFixedField k Ω H) = H := by ext σ change σ ∈ (abstractFixedField k Ω H).fixingSubgroup ↔ σ ∈ H @@ -49,7 +49,7 @@ omit [IsGalois k Ω] in finite quotient of the ambient absolute Galois group by the same subgroup. -/ theorem ambientQuotientFiniteOfAbstractFinite (H : ClosedSubgroup (Gal(Ω / k))) - (hfinite : Finite ((baseField (Gal(Ω / k))).toSubgroup ⧸ + (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 @@ -67,7 +67,7 @@ omit [IsGalois k Ω] in an open subgroup of the absolute Galois group. -/ theorem abstractFiniteClosedSubgroup_isOpen (H : ClosedSubgroup (Gal(Ω / k))) - (hfinite : Finite ((baseField (Gal(Ω / k))).toSubgroup ⧸ + (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) H (le_baseField H))) : IsOpen H.carrier := by let : Finite (Gal(Ω / k) ⧸ H.toSubgroup) := @@ -80,7 +80,7 @@ theorem abstractFiniteClosedSubgroup_isOpen is an actual finite field extension. -/ theorem abstractFixedField_finiteDimensional (H : ClosedSubgroup (Gal(Ω / k))) - (hfinite : Finite ((baseField (Gal(Ω / k))).toSubgroup ⧸ + (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 @@ -91,7 +91,7 @@ theorem abstractFixedField_finiteDimensional omit [IsGalois k Ω] in /-- Inclusion of abstract subgroups reverses to inclusion of their concrete fixed fields. -/ -theorem abstractFixedField_le {K L : ClosedSubgroup (Gal(Ω / k))} +theorem abstractFixedField_le {K L : ClosedSubgroup (Gal(Ω/k))} (hLK : L.toSubgroup ≤ K.toSubgroup) : abstractFixedField k Ω K ≤ abstractFixedField k Ω L := IntermediateField.fixedField_le hLK @@ -99,7 +99,7 @@ theorem abstractFixedField_le {K L : ClosedSubgroup (Gal(Ω / k))} /-- 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 : ClosedSubgroup (Gal(Ω/k))) : H.toSubgroup ≃* Gal(Ω / abstractFixedField k Ω H) := (MulEquiv.subgroupCongr (InfiniteGalois.fixingSubgroup_fixedField H).symm).trans @@ -108,14 +108,14 @@ def abstractSubgroupEquivGaloisGroup /-- States the theorem `abstractSubgroupEquivGaloisGroup_apply`. -/ @[simp] theorem abstractSubgroupEquivGaloisGroup_apply - (H : ClosedSubgroup (Gal(Ω / k))) (σ : H.toSubgroup) (x : Ω) : + (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))} + {K L : ClosedSubgroup (Gal(Ω/k))} (hLK : L.toSubgroup ≤ K.toSubgroup) : IntermediateField (abstractFixedField k Ω K) Ω := IntermediateField.extendScalars (abstractFixedField_le k Ω hLK) @@ -123,7 +123,7 @@ abbrev abstractRelativeFixedField /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) : (extensionSubgroup K L hLK).map (abstractSubgroupEquivGaloisGroup k Ω K).toMonoidHom = @@ -166,7 +166,7 @@ theorem map_extensionSubgroup_abstractSubgroupEquiv /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := by @@ -180,7 +180,7 @@ theorem abstractRelativeFixingSubgroup_normal /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : IsGalois (abstractFixedField k Ω K) @@ -192,7 +192,7 @@ theorem abstractRelativeFixedField_isGalois /-- Restriction through the lower fixed field, followed by quotienting by the upper fixing subgroup. -/ def abstractRelativeToAmbientQuotient - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal @@ -208,7 +208,7 @@ def abstractRelativeToAmbientQuotient /-- The kernel of the preceding quotient map is the exact abstract class-formation relative subgroup. -/ theorem abstractRelativeToAmbientQuotient_ker - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal @@ -233,7 +233,7 @@ theorem abstractRelativeToAmbientQuotient_ker /-- The quotient map from the abstract lower subgroup is surjective. -/ theorem abstractRelativeToAmbientQuotient_surjective - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal @@ -255,7 +255,7 @@ theorem abstractRelativeToAmbientQuotient_surjective ordinary quotient of the lower absolute Galois group by the upper fixing subgroup. -/ def abstractExtensionQuotientEquivAmbient - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := hnormal @@ -277,7 +277,7 @@ def abstractExtensionQuotientEquivAmbient /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hnormal : (extensionSubgroup K L hLK).Normal) : letI := hnormal @@ -304,7 +304,7 @@ 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 ⧸ + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : @@ -337,7 +337,7 @@ 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 ⧸ + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : @@ -366,7 +366,7 @@ 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 ⧸ + (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean index ce7ecdf22c..f24316c8c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean @@ -57,7 +57,7 @@ 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)) + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L / K), sigma ∈ Subgroup.zpowers g) : UnitsTateCardinalityData K L := by let : UniformSpace K := IsTopologicalAddGroup.rightUniformSpace K @@ -185,7 +185,7 @@ theorem finiteTowerUnits_tate_card_of_generator [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)) + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L / K), sigma ∈ Subgroup.zpowers g) : UnitsTateCardinalityData K L := by let : UniformSpace k := IsTopologicalAddGroup.rightUniformSpace k diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean index 99d95e72a4..e92f431966 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -128,7 +128,7 @@ 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))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) [FiniteDimensional K (abstractFixedField K (SeparableClosure K) H.field)] [ValuativeRel (abstractFixedField K (SeparableClosure K) H.field)] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index ce8a432fec..40816b5acb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -38,7 +38,7 @@ 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))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : IntermediateField (decompositionResidueField K (localSeparableValuationSubring K)) (selectedResidueField (localSeparableValuationSubring K)) := by @@ -54,14 +54,14 @@ noncomputable def localAbstractFixedResidueIntermediateField 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))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : Algebra (decompositionResidueField K (localSeparableValuationSubring K)) (localAbstractFixedResidueIntermediateField K H) := (localAbstractFixedResidueIntermediateField K H).algebra noncomputable local instance localAbstractFixedResidueIntermediateFieldSMul - (H : ClosedSubgroup (Gal(SeparableClosure K / K))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : SMul (decompositionResidueField K (localSeparableValuationSubring K)) (localAbstractFixedResidueIntermediateField K H) := @@ -69,7 +69,7 @@ noncomputable local instance localAbstractFixedResidueIntermediateFieldSMul (localAbstractFixedResidueIntermediateFieldAlgebra K H) noncomputable local instance localAbstractFixedResidueIntermediateFieldModule - (H : ClosedSubgroup (Gal(SeparableClosure K / K))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : Module (decompositionResidueField K (localSeparableValuationSubring K)) (localAbstractFixedResidueIntermediateField K H) := @@ -80,7 +80,7 @@ noncomputable local instance localAbstractFixedResidueIntermediateFieldModule 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))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : decompositionGroup (abstractFixedField K (SeparableClosure K) H) (localSeparableValuationSubring K) = ⊤ := by let E := abstractFixedField K (SeparableClosure K) H @@ -99,7 +99,7 @@ theorem localAbstractFixedDecompositionGroup_eq_top 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) (sigma : H.toSubgroup) (x : selectedResidueField (localSeparableValuationSubring K)) : localSeparableResidueAlgAction K sigma.1 x = @@ -125,7 +125,7 @@ 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 : ClosedSubgroup (Gal(SeparableClosure K/K))) : H.toSubgroup.map (localSeparableResidueAlgAction K).toMonoidHom = (localAbstractFixedResidueIntermediateField K H).fixingSubgroup := by let E := abstractFixedField K (SeparableClosure K) H @@ -211,7 +211,7 @@ theorem localAbstractFixedResidueAction_map_eq_fixingSubgroup /-- 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) (sigma : H.toSubgroup) : localSeparableResidueAlgAction K sigma.1 ∈ (localAbstractFixedResidueIntermediateField K H).fixingSubgroup := by @@ -222,7 +222,7 @@ theorem localAbstractFixedResidueAction_mem_fixingSubgroup residue subfield selected by `H` inside the common residue algebraic closure. -/ noncomputable def localAbstractFixedResidueActionOverIntermediateField - (H : ClosedSubgroup (Gal(SeparableClosure K / K))) : + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : H.toSubgroup →* (selectedResidueField (localSeparableValuationSubring K) ≃ₐ[ localAbstractFixedResidueIntermediateField K H] @@ -243,7 +243,7 @@ noncomputable def localAbstractFixedResidueActionOverIntermediateField not the underlying automorphism of the selected residue field. -/ @[simp] theorem localAbstractFixedResidueActionOverIntermediateField_apply - (H : ClosedSubgroup (Gal(SeparableClosure K / K))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) (sigma : H.toSubgroup) (x : selectedResidueField (localSeparableValuationSubring K)) : localAbstractFixedResidueActionOverIntermediateField K H sigma x = @@ -257,7 +257,7 @@ 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 ⧸ + ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H (le_baseField H))] : @@ -301,7 +301,7 @@ finite-field residue datum. -/ noncomputable def localAbstractFixedResidueFiniteGaloisIntermediateField (H : ClosedSubgroup (Gal(SeparableClosure K / K))) [Finite - ((baseField (Gal(SeparableClosure K / K))).toSubgroup ⧸ + ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H (le_baseField H))] : @@ -333,7 +333,7 @@ noncomputable def localAbstractFixedResidueFiniteGaloisIntermediateField 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 : FiniteAbstractField (Gal(SeparableClosure K/K))) : (H.residueDegree (localResidueDatum K) : ℕ) = Module.finrank (decompositionResidueField K (localSeparableValuationSubring K)) @@ -391,7 +391,7 @@ 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))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) (sigma : H.field.toSubgroup) : let F := localAbstractFixedResidueIntermediateField K H.field letI : Algebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index e35f3ec1fa..f574ff91c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -41,16 +41,16 @@ private local instance abelianizationQuotientTopologicalSpace group. This is the multiplicative form of `abstractFixedFieldNormResidueSymbol`. -/ noncomputable def abstractFixedFieldNormResidueMonoidHom - (D : DegreeData (Gal(Ω / k))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K L : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : (abstractFixedField k Ω K)ˣ →* @@ -63,7 +63,7 @@ noncomputable def abstractFixedFieldNormResidueMonoidHom /-- The ordinary fixed-field norm on native multiplicative unit groups. -/ def abstractFixedFieldNormUnitsMonoidHom - (K K' : ClosedSubgroup (Gal(Ω / k))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) : (abstractRelativeFixedField k Ω hK'K)ˣ →* (abstractFixedField k Ω K)ˣ := @@ -72,7 +72,7 @@ def abstractFixedFieldNormUnitsMonoidHom /-- Inclusion of native multiplicative fixed-field unit groups. -/ def abstractFixedFieldUnitsInclusionMonoidHom - (K K' : ClosedSubgroup (Gal(Ω / k))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) : (abstractFixedField k Ω K)ˣ →* (abstractFixedField k Ω K')ˣ := @@ -81,7 +81,7 @@ def abstractFixedFieldUnitsInclusionMonoidHom /-- Restriction on native multiplicative finite abelianizations. -/ noncomputable def abstractFixedFieldAbelianizedRestrictionMonoidHom - (K K' L L' : ClosedSubgroup (Gal(Ω / 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) @@ -100,7 +100,7 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMonoidHom /-- Transfer on native multiplicative finite abelianizations. -/ noncomputable def abstractFixedFieldAbelianizedTransferMonoidHom - (K K' L : ClosedSubgroup (Gal(Ω / k))) + (K K' L : ClosedSubgroup (Gal(Ω/k))) (hLK' : L.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hLnormal : @@ -132,12 +132,12 @@ noncomputable def abstractFixedFieldAbelianizedTransferMonoidHom subgroup pulls back to the ordinary field-norm subgroup. -/ theorem abstractFixedFieldUnitsEquiv_finiteNormSubgroup_preimage [IsSepClosed Ω] - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) @@ -185,17 +185,17 @@ theorem abstractFixedFieldUnitsEquiv_finiteNormSubgroup_preimage /-- The kernel of the additive fixed-field norm-residue symbol is the ordinary norm subgroup, written additively. -/ theorem abstractFixedFieldNormResidueSymbol_ker - (D : DegreeData (Gal(Ω / k))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) [IsSepClosed Ω] - (K L : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : (abstractFixedFieldNormResidueSymbol @@ -233,17 +233,17 @@ theorem abstractFixedFieldNormResidueSymbol_ker /-- The kernel of the multiplicative fixed-field norm-residue homomorphism is the ordinary norm subgroup. -/ theorem abstractFixedFieldNormResidueMonoidHom_ker - (D : DegreeData (Gal(Ω / k))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) [IsSepClosed Ω] - (K L : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : (abstractFixedFieldNormResidueMonoidHom @@ -265,16 +265,16 @@ noncomputable def abstractFixedFieldNormResidueMap [ValuativeRel k] [TopologicalSpace k] [IsNonarchimedeanLocalField k] [IsSepClosed Ω] - (D : DegreeData (Gal(Ω / k))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K L : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : letI : FiniteDimensional k (abstractFixedField k Ω K) := @@ -322,11 +322,11 @@ noncomputable def abstractFixedFieldNormUnitsMap (K K' : ClosedSubgroup (Gal(Ω / k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] [hK'absolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K' (le_baseField K'))] [hK'Kfinite : Finite @@ -375,11 +375,11 @@ noncomputable def abstractFixedFieldUnitsInclusionMap (K K' : ClosedSubgroup (Gal(Ω / k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] [hK'absolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K' (le_baseField K'))] : letI : FiniteDimensional k (abstractFixedField k Ω K) := @@ -418,7 +418,7 @@ noncomputable def abstractFixedFieldUnitsInclusionMap /-- Abelianized restriction, continuously bundled for the finite native Krull quotient topologies. -/ noncomputable def abstractFixedFieldAbelianizedRestrictionMap - (K K' L L' : ClosedSubgroup (Gal(Ω / 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) @@ -428,7 +428,7 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMap [hL'K'finite : Finite (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] [hK'absolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K' (le_baseField K'))] : Abelianization @@ -454,7 +454,7 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMap /-- Abelianized transfer, continuously bundled for the finite native Krull quotient topologies. -/ noncomputable def abstractFixedFieldAbelianizedTransferMap - (K K' L : ClosedSubgroup (Gal(Ω / k))) + (K K' L : ClosedSubgroup (Gal(Ω/k))) (hLK' : L.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hLnormal : @@ -463,7 +463,7 @@ noncomputable def abstractFixedFieldAbelianizedTransferMap (K.toSubgroup ⧸ extensionSubgroup K L (hLK'.trans hK'K))] [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : letI : (extensionSubgroup K' L hLK').Normal := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean index 696fc97ab7..0b31b31e20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean @@ -40,7 +40,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : ∃ x : Fˣ, localArtinMonoidHom F E x = z ∧ ambientEmbeddedNormResidueAbelianElement K F E j e x = z := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean index eeb87c959e..0ebe8cc889 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -242,7 +242,7 @@ theorem (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) : + Gal(SeparableClosure K/K)) : let L := abstractFixedField K (SeparableClosure K) H.field letI : FiniteDimensional K L := @@ -283,7 +283,7 @@ units. -/ theorem relativeNorm_intrinsicAbstractBase_abstractFixedFieldUnit (F : Type) [Field F] - (S : ClosedSubgroup Gal(SeparableClosure F / F)) + (S : ClosedSubgroup Gal(SeparableClosure F/F)) (hSB : S.toSubgroup ≤ (intrinsicAbstractBase F).toSubgroup) [Finite ((intrinsicAbstractBase F).toSubgroup ⧸ @@ -351,13 +351,13 @@ 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)) + (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 ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup (baseField Gal(SeparableClosure K / K)) H (le_baseField H))] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean index a281dc4ed0..2468f19215 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -38,7 +38,7 @@ noncomputable def ambientEmbeddedPrimeTransportValue [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : Abelianization Gal(E / F) := by let i := j.comp (IsScalarTower.toAlgHom K F E) @@ -116,7 +116,7 @@ noncomputable def ambientEmbeddedPrimeSymbolProperty [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : Prop := by + (z : Abelianization Gal(E/F)) : Prop := by let i := j.comp (IsScalarTower.toAlgHom K F E) letI : Algebra F (SeparableClosure K) := @@ -239,7 +239,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : let i := j.comp (IsScalarTower.toAlgHom K F E) letI : Algebra F (SeparableClosure F) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean index fc0b141c34..64dafce8db 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -78,7 +78,7 @@ noncomputable def ambientEmbeddedPrimeWitness [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : Fˣ := by + (z : Abelianization Gal(E/F)) : Fˣ := by let i := j.comp (IsScalarTower.toAlgHom K F E) letI : Algebra F (SeparableClosure K) := @@ -269,7 +269,7 @@ noncomputable def ambientEmbeddedPrimeTarget [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : Abelianization Gal(E / F) := by let i := j.comp (IsScalarTower.toAlgHom K F E) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean index 41189f81c7..d7f12c58aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -41,7 +41,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : localArtinMonoidHom F E (ambientEmbeddedPrimeWitness K F E j e z) = z := by @@ -336,7 +336,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : ambientEmbeddedPrimeSymbolProperty K F E j e z := by let i := j.comp (IsScalarTower.toAlgHom K F E) @@ -648,7 +648,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : ambientEmbeddedPrimeTransportValue K F E j e z = ambientEmbeddedPrimeTarget K F E j e z := by have hsymbol := @@ -675,7 +675,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : ambientEmbeddedPrimeTarget K F E j e z = z := by let i := j.comp (IsScalarTower.toAlgHom K F E) @@ -817,7 +817,7 @@ theorem [FiniteDimensional F E] [IsAbelianGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : ambientEmbeddedNormResidueAbelianElement K F E j e (ambientEmbeddedPrimeWitness K F E j e z) = z := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean index 0e18da5091..ba391e9646 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -27,12 +27,12 @@ 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)) + (K L : ClosedSubgroup Gal(Ω/k)) (hLK : L.toSubgroup ≤ K.toSubgroup) [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite - ((baseField Gal(Ω / k)).toSubgroup ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] : (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK).map @@ -94,12 +94,12 @@ 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)) + (K L : ClosedSubgroup Gal(Ω/k)) (hLK : L.toSubgroup ≤ K.toSubgroup) [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite - ((baseField Gal(Ω / k)).toSubgroup ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] : FiniteNormQuotient (galoisAmbientUnitsRep k Ω) K L hLK ≃+ @@ -186,12 +186,12 @@ 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)) + (K L : ClosedSubgroup Gal(Ω/k)) (hLK : L.toSubgroup ≤ K.toSubgroup) [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite - ((baseField Gal(Ω / k)).toSubgroup ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] (a : ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K) : @@ -242,30 +242,30 @@ prime element is the prescribed Frobenius quotient class. -/ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] [IsSepClosed Ω] - (D : DegreeData Gal(Ω / k)) + (D : DegreeData Gal(Ω/k)) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K L : ClosedSubgroup Gal(Ω / 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 ⧸ + ((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) + Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK) (hσ : D.frobeniusRestriction ((⟨K, hKabsolute⟩ : FiniteAbstractField - Gal(Ω / k)).toFiniteResidueAbstractField D) L hLK σ = q) + Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK σ = q) (π : ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) (D.frobeniusFixedField ((⟨K, hKabsolute⟩ : FiniteAbstractField - Gal(Ω / k)).toFiniteResidueAbstractField D) + Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK σ)) (hπ : let KF : FiniteAbstractField Gal(Ω / k) := @@ -354,17 +354,17 @@ 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)) + (D : DegreeData Gal(Ω/k)) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K L : ClosedSubgroup Gal(Ω / 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 ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] (x y : (abstractFixedField k Ω K)ˣ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean index c76dc7f4e4..6df7476a93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -273,7 +273,7 @@ finite fixed field to the ambient separable closure. -/ abbrev intrinsicFixedFieldSeparableClosureEquiv (K : Type) [Field K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) := + Gal(SeparableClosure K/K)) := let F := abstractFixedField K (SeparableClosure K) H.field @AlgEquiv F (SeparableClosure F) (SeparableClosure K) _ _ _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean index 4c0d0370e9..a3d93525b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -99,7 +99,7 @@ theorem intrinsicBase_normalizedDegree_eq_ambientFixedField (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) : + Gal(SeparableClosure K/K)) : let F := abstractFixedField K (SeparableClosure K) H.field letI : Algebra F (SeparableClosure F) := (separableClosure F (AlgebraicClosure F)).algebra @@ -146,7 +146,7 @@ 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)) : + Gal(SeparableClosure K/K)) : let F := abstractFixedField K (SeparableClosure K) H.field letI : Algebra F (SeparableClosure F) := (separableClosure F (AlgebraicClosure F)).algebra @@ -172,7 +172,7 @@ equivalence is conjugation followed by the standard fixed-field subgroup equival theorem intrinsicBaseEquivAmbientFixedField_apply_val (K : Type) [Field K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) : + Gal(SeparableClosure K/K)) : let F := abstractFixedField K (SeparableClosure K) H.field letI : Algebra F (SeparableClosure F) := (separableClosure F (AlgebraicClosure F)).algebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index a15edd12d5..0473edeb2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -120,7 +120,7 @@ separable-closure equivalence is continuous. -/ theorem intrinsicBaseEquivAmbientFixedField_continuous (K : Type) [Field K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) : + Gal(SeparableClosure K/K)) : let F := abstractFixedField K (SeparableClosure K) H.field letI : Algebra F (SeparableClosure F) := (separableClosure F (AlgebraicClosure F)).algebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean index 0eff578a10..3bef64c75f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean @@ -28,7 +28,7 @@ noncomputable def intrinsicBaseContinuousEquivAmbientFixedField (K : Type) [Field K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) + Gal(SeparableClosure K/K)) (e : intrinsicFixedFieldSeparableClosureEquiv K H) : (intrinsicAbstractBase (abstractFixedField K (SeparableClosure K) H.field)).toSubgroup ≃ₜ* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index db380e8c49..77cb528372 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -59,19 +59,19 @@ theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction extensionSubgroup upper.base.field upper.extension.field upper.extension.below)] [_hHabsolute : Finite - ((baseField Gal(SeparableClosure K / K)).toSubgroup ⧸ + ((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 ⧸ + ((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)) + (restrictActual : Gal(L' / K') →* Gal(L/K)) (hbase : ∀ x : L, jUpper (algebraMap L L' x) = jLower x) (hcompat : ∀ (τ : Gal(L' / K')) (x : L), @@ -221,12 +221,12 @@ theorem AmbientEmbeddedFixedFieldPresentation.fixedFieldNormResidueTransport extensionSubgroup upper.base.field upper.extension.field upper.extension.below)] [_hHabsolute : Finite - ((baseField Gal(SeparableClosure K / K)).toSubgroup ⧸ + ((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 ⧸ + ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup (baseField Gal(SeparableClosure K / K)) upper.base.field (le_baseField upper.base.field))] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean index 8c6a91c7a6..c44fe353a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -145,13 +145,13 @@ noncomputable def intrinsicFixedFieldConcreteSymbolValue (separableClosureUnits_isClassFormation F) x private def intrinsicFixedFieldConcretePrimeComparison - (x : Fˣ) (z : Abelianization Gal(E / F)) : Prop := + (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 := + (x : Fˣ) (z : Abelianization Gal(E/F)) : Prop := abstractFixedFieldNormResidueSymbol K (SeparableClosure K) (localResidueDatum K) @@ -182,7 +182,7 @@ def intrinsicFixedFieldAmbientFrobeniusAbelianization K H J hJH e σ))) private structure IntrinsicFixedFieldPrimeComparisonData - (z : Abelianization Gal(E / F)) where + (z : Abelianization Gal(E/F)) where xPrime : Fˣ concrete : intrinsicFixedFieldConcretePrimeComparison @@ -835,7 +835,7 @@ private theorem intrinsicFixedFieldFrobeniusPrimeNorm_ambient private noncomputable def intrinsicFixedFieldPrimeRepresentative - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : (EI).extensionQuotient := Classical.choose (QuotientGroup.mk_surjective @@ -844,7 +844,7 @@ private noncomputable def intrinsicFixedFieldPrimeRepresentative omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in private theorem intrinsicFixedFieldPrimeRepresentative_abelianization - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : (qF).abelianizationCongr (Abelianization.of (intrinsicFixedFieldPrimeRepresentative @@ -864,7 +864,7 @@ private theorem intrinsicFixedFieldPrimeRepresentative_abelianization _ = z := (qF).abelianizationCongr.apply_symm_apply z private noncomputable def intrinsicFixedFieldPrimeFrobeniusLift - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : intrinsicFixedFieldFrobeniusElements K H J hJH e := Classical.choose ((localResidueDatum F).frobeniusRestriction_surjective @@ -873,7 +873,7 @@ private noncomputable def intrinsicFixedFieldPrimeFrobeniusLift K H J hJH e z)) private theorem intrinsicFixedFieldPrimeFrobeniusLift_restriction - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : (localResidueDatum F).frobeniusRestriction RF (EI).field (EI).below (intrinsicFixedFieldPrimeFrobeniusLift @@ -887,14 +887,14 @@ private theorem intrinsicFixedFieldPrimeFrobeniusLift_restriction K H J hJH e z)) private noncomputable def intrinsicFixedFieldPrimeComparisonWitness - (z : Abelianization Gal(E / F)) : Fˣ := + (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)) : + (z : Abelianization Gal(E/F)) : intrinsicFixedFieldConcretePrimeComparison K H J hJH e (intrinsicFixedFieldPrimeComparisonWitness @@ -1062,7 +1062,7 @@ private theorem private theorem intrinsicFixedFieldPrimeFrobeniusSourceRestrictionResult_eq - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : intrinsicFixedFieldFrobeniusSourceRestrictionResult K H J hJH e (intrinsicFixedFieldPrimeFrobeniusLift @@ -1078,7 +1078,7 @@ private theorem K H J hJH e z) private theorem intrinsicFixedFieldPrimeFrobeniusLift_ambientRestriction - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : intrinsicFixedFieldFrobeniusAmbientRestrictionResult K H J hJH e (intrinsicFixedFieldPrimeFrobeniusLift @@ -1107,7 +1107,7 @@ private theorem intrinsicFixedFieldPrimeFrobeniusLift_ambientRestriction K H J hJH e z private theorem intrinsicFixedFieldPrimeComparisonWitness_ambient - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : intrinsicFixedFieldAmbientPrimeComparison K H J hJH e (intrinsicFixedFieldPrimeComparisonWitness @@ -1153,7 +1153,7 @@ private theorem intrinsicFixedFieldPrimeComparisonWitness_ambient K H J hJH e z))) private noncomputable def intrinsicFixedFieldPrimeComparison - (z : Abelianization Gal(E / F)) : + (z : Abelianization Gal(E/F)) : IntrinsicFixedFieldPrimeComparisonData K H J hJH e z := { xPrime := @@ -1170,7 +1170,7 @@ private noncomputable def intrinsicFixedFieldPrimeComparison 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)) : + (z : Abelianization Gal(E/F)) : ∃ x : Fˣ, concreteNormResidueSymbolOfEmbedding F E iFE diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 603140c4bd..ceaa754a95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -28,13 +28,13 @@ open RamificationTheory.HilbertRamification.ValuationSubring private abbrev finiteFixedField (K : Type) [Field K] - (H : FiniteAbstractField (Gal(SeparableClosure K / K))) : + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) : Type := abstractFixedField K (SeparableClosure K) H.field local instance finiteFixedFieldSeparableClosureAlgebra (K : Type) [Field K] - (H : FiniteAbstractField (Gal(SeparableClosure K / K))) : + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) : Algebra (finiteFixedField K H) (SeparableClosure (finiteFixedField K H)) := (separableClosure (finiteFixedField K H) @@ -91,7 +91,7 @@ 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))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) (x : (abstractFixedField K (SeparableClosure K) H.field)ˣ) : letI : FiniteDimensional K (abstractFixedField K (SeparableClosure K) H.field) := @@ -725,7 +725,7 @@ 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))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) (e : SeparableClosure (finiteFixedField K H) ≃ₐ[ finiteFixedField K H] SeparableClosure K) : letI : FiniteDimensional K @@ -792,7 +792,7 @@ residue field. -/ private theorem exists_abstractFixedFieldResidueEquiv (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (H : FiniteAbstractField (Gal(SeparableClosure K / K))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) [FiniteDimensional K (finiteFixedField K H)] [NontriviallyNormedField (finiteFixedField K H)] [ValuativeRel (finiteFixedField K H)] @@ -924,7 +924,7 @@ private theorem exists_abstractFixedFieldResidueEquiv private theorem residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEquiv (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (H : FiniteAbstractField (Gal(SeparableClosure K / K))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) [FiniteDimensional K (finiteFixedField K H)] [NontriviallyNormedField (finiteFixedField K H)] [ValuativeRel (finiteFixedField K H)] @@ -1027,7 +1027,7 @@ field. -/ theorem localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (H : FiniteAbstractField (Gal(SeparableClosure K / K))) + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) (e : SeparableClosure (finiteFixedField K H) ≃ₐ[ finiteFixedField K H] SeparableClosure K) (sigma : Gal(SeparableClosure (finiteFixedField K H) / diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean index 24931cb768..c1185453c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -29,7 +29,7 @@ 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))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) : Additive (abstractFixedField k Ω K)ˣ →+ Additive (abstractFixedField k Ω K')ˣ := @@ -42,7 +42,7 @@ 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))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) (x : Additive (abstractFixedField k Ω K)ˣ) : abstractFixedFieldUnitsEquivGaloisFixed k Ω K' @@ -59,17 +59,17 @@ theorem abstractFixedFieldUnitsEquiv_inclusion obtained from the abstract class-formation symbol through the canonical fixed-unit and relative-Galois identifications. -/ noncomputable def abstractFixedFieldNormResidueSymbol - (D : DegreeData (Gal(Ω / k))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K L : ClosedSubgroup (Gal(Ω / 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 ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : Additive (abstractFixedField k Ω K)ˣ →+ @@ -93,7 +93,7 @@ noncomputable def abstractFixedFieldNormResidueSymbol /-- The ordinary field norm on units between two concrete fixed fields. -/ def abstractFixedFieldNormUnits - (K K' : ClosedSubgroup (Gal(Ω / k))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) : Additive (abstractRelativeFixedField k Ω hK'K)ˣ →+ Additive (abstractFixedField k Ω K)ˣ := @@ -105,7 +105,7 @@ def abstractFixedFieldNormUnits fixed-field square, transported through the canonical quotient/Galois equivalences. -/ noncomputable def abstractFixedFieldAbelianizedRestriction - (K K' L L' : ClosedSubgroup (Gal(Ω / 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) @@ -130,7 +130,7 @@ noncomputable def abstractFixedFieldAbelianizedRestriction /-- 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))) + (K K' L L' : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) @@ -172,11 +172,11 @@ 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))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K K' L L' : ClosedSubgroup (Gal(Ω / 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) @@ -285,7 +285,7 @@ theorem abstractFixedFieldNormResidueSymbol_norm_restriction fixed-field tower, transported through the two canonical quotient/Galois equivalences. -/ noncomputable def abstractFixedFieldAbelianizedTransfer - (K K' L : ClosedSubgroup (Gal(Ω / k))) + (K K' L : ClosedSubgroup (Gal(Ω/k))) (hLK' : L.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hLnormal : @@ -324,11 +324,11 @@ 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))) + (D : DegreeData (Gal(Ω/k))) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom (galoisAmbientUnitsRep k Ω)) - (K K' L : ClosedSubgroup (Gal(Ω / k))) + (K K' L : ClosedSubgroup (Gal(Ω/k))) (hLK' : L.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hLnormal : @@ -337,7 +337,7 @@ theorem abstractFixedFieldNormResidueSymbol_transfer_inclusion (K.toSubgroup ⧸ extensionSubgroup K L (hLK'.trans hK'K))] [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ + ((baseField (Gal(Ω/k))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))] : letI : (extensionSubgroup K' L hLK').Normal := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index a127704c1a..70eca1bf8f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -40,7 +40,7 @@ noncomputable local instance finiteSeparableAlgHomFintypeRelative /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) : (K.toSubgroup ⧸ extensionSubgroup K L hLK) → (abstractRelativeFixedField k Ω hLK →ₐ[ @@ -76,7 +76,7 @@ omit [IsSepClosed Ω] in /-- States the theorem `abstractFixedFieldCosetToAlgHom_mk`. -/ @[simp] theorem abstractFixedFieldCosetToAlgHom_mk - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (σ : K.toSubgroup) : abstractFixedFieldCosetToAlgHom k Ω K L hLK (QuotientGroup.mk σ) = @@ -85,7 +85,7 @@ theorem abstractFixedFieldCosetToAlgHom_mk rfl private theorem abstractFixedFieldCosetToAlgHom_surjective - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) [FiniteDimensional (abstractFixedField k Ω K) (abstractRelativeFixedField k Ω hLK)] : @@ -124,7 +124,7 @@ private theorem abstractFixedFieldCosetToAlgHom_surjective omit [IsSepClosed Ω] in private theorem abstractFixedFieldCosetToAlgHom_injective - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) : Function.Injective (abstractFixedFieldCosetToAlgHom k Ω K L hLK) := by @@ -154,7 +154,7 @@ private theorem abstractFixedFieldCosetToAlgHom_injective /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) [FiniteDimensional (abstractFixedField k Ω K) (abstractRelativeFixedField k Ω hLK)] : @@ -168,7 +168,7 @@ def abstractFixedFieldCosetEquivAlgHom omit [IsSepClosed Ω] in /-- States the theorem `relativeCosetAction_abstractFixedFieldUnit_val`. -/ theorem relativeCosetAction_abstractFixedFieldUnit_val - (K L : ClosedSubgroup (Gal(Ω / k))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (x : (abstractRelativeFixedField k Ω hLK)ˣ) (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) : @@ -187,12 +187,12 @@ theorem relativeCosetAction_abstractFixedFieldUnit_val 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) [hfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite - ((baseField Gal(Ω / k)).toSubgroup ⧸ + ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup (baseField Gal(Ω / k)) K (le_baseField K))] (x : (abstractRelativeFixedField k Ω hLK)ˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean index f6e96a11fe..85e0b63fd7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -219,7 +219,7 @@ noncomputable def residueAbsoluteFrobeniusMulEquiv : (residueAbsoluteFrobenius_algebraicClosure_bijective k) /-- Arithmetic Frobenius gives a topological group equivalence -`ℤ̂ ≃ Gal(k̄/k)`. -/ +`ℤ̂ ≃ Gal(k_bar/k)`. -/ noncomputable def residueAbsoluteFrobeniusEquiv : ZHatMul ≃ₜ* Field.absoluteGaloisGroup k where toMulEquiv := residueAbsoluteFrobeniusMulEquiv k @@ -234,7 +234,7 @@ noncomputable def residueAbsoluteFrobeniusEquiv : /-- **Finite local reciprocity, absolute residue degree.** The inverse of arithmetic Frobenius coordinates, as a continuous surjective homomorphism -`Gal(k̄/k) → ℤ̂`. -/ +`Gal(k_bar/k) → ℤ̂`. -/ noncomputable def residueAbsoluteDegree : Field.absoluteGaloisGroup k →ₜ* ZHatMul := ContinuousMonoidHom.toContinuousMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean index c59605fb1b..562943cba8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean @@ -127,7 +127,7 @@ theorem SemilinearBaseCompatible.conjugation_apply [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) : + (sigma : Gal(L/K)) (x : L) : semilinearGaloisGroupCongr K K' L L' eK eL h.commutes sigma (eL x) = eL (sigma x) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index 1778d3d840..b5f0cfa152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -98,7 +98,7 @@ private theorem abstractBaseFrobeniusLift_degree : /-- 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)) + (sigma : Gal((SeparableClosure K)/K)) (hsigma : localResidueDegree K sigma = Multiplicative.ofAdd (1 : ZHat)) : localSeparableResidueAlgAction K sigma = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean index b93d3ca34a..7c939532d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -100,7 +100,7 @@ noncomputable def galoisGroupEquivAbelianizationOfUnramifiedValuation : /-- The cyclic Galois-group equivalence is the canonical map to the abelianization. -/ @[simp] theorem galoisGroupEquivAbelianizationOfUnramifiedValuation_apply - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : galoisGroupEquivAbelianizationOfUnramifiedValuation K L σ = Abelianization.of σ := rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index 3f60ba9ec6..7c10a71502 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -68,7 +68,7 @@ theorem galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure_smul [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) : + (sigma : Gal(L/K)) (a : principalUnits L n) : letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n sigma • a = galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma a := rfl @@ -193,7 +193,7 @@ private theorem integerUnits_herbrandQuotient_eq_one [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) : + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L / K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L ∃ hU : HerbrandQuotientDefined Gal(L / K) 𝒪[L]ˣ g, @herbrandQuotient Gal(L / K) 𝒪[L]ˣ _ _ _ @@ -248,7 +248,7 @@ private theorem unramified_integerUnits_herbrand_subsingleton [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) : + (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 @@ -292,7 +292,7 @@ private theorem unramified_principalUnits_herbrand_subsingleton [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)) + (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)) ∧ @@ -393,7 +393,7 @@ theorem unramified_units_tateCohomology_and_norm_surjective_for_generator [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) : + (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)) ∧ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean index c90ca581f1..e3796b9de1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean @@ -32,7 +32,7 @@ variable {K : Type u} {Omega : Type v} 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)) : + [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean index fcb718e450..2a0ba6778b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean @@ -197,7 +197,7 @@ noncomputable def laurentValuativeIntegerEquiv { toFun := fun x => ⟨x, by have hxrel : (x : L) ≤ᵥ (1 : L) := wL.vle_iff_le.mpr x.property - show vL (x : L) ≤ 1 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean index 23284222da..de496eee66 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -547,7 +547,7 @@ theorem equalCharacteristicFiniteUnramifiedFrobenius_coeff /-- 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⸩)) : + (σ : 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)) σ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean index 733a912e32..34a1d6d00b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -996,7 +996,7 @@ private theorem (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (u : F.valuationSubringˣ) (n : ℕ) (σ : - Gal(standardLubinTateChangedLevelCompositumField hπ u n / K)) + Gal(standardLubinTateChangedLevelCompositumField hπ u n/K)) (hne : valuationSubringAutOfUniqueExtension (standardLubinTateChangedLevelCompositumCompleteDVF_hasUniqueDVFValuationExtension @@ -1186,7 +1186,7 @@ private theorem hπ u n - beta)) (σ : - Gal(standardLubinTateChangedLevelCompositumField hπ u n / K)) + Gal(standardLubinTateChangedLevelCompositumField hπ u n/K)) (hfix : σ (beta : standardLubinTateChangedLevelCompositumField hπ u n) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean index 8ac0e5925a..5760af1eb6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -123,7 +123,7 @@ theorem standardLubinTateLevelField_gal_comm (F : LocalField.{u, v} K) {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ τ : Gal((standardLubinTateLevelField hπ n) / K)) : + (σ τ : Gal((standardLubinTateLevelField hπ n)/K)) : σ * τ = τ * σ := by let e := standardLubinTateUnitParameterEquivGal F hπ n apply e.symm.injective diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean index 6e1429dbca..fc368db37d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -225,7 +225,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) (x : standardLubinTateLevelField hπ n) : x ∈ (standardLubinTateLevelCompleteDVF hπ n).valuation.valuationSubring ↔ σ x ∈ @@ -268,7 +268,7 @@ private noncomputable def {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) : + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring ≃+* (standardLubinTateLevelCompleteDVF hπ n).valuationSubring := higherPrincipalUnitGroup.valuationSubringRingEquivOfPreserves @@ -283,7 +283,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) (x : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring) : ((standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ x : @@ -297,7 +297,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) : + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : Continuous (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ) := by let target := standardLubinTateLevelCompleteDVF hπ n @@ -323,7 +323,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) : + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ : (standardLubinTateLevelCompleteDVF hπ n).valuationSubring →+* (standardLubinTateLevelCompleteDVF hπ n).valuationSubring).comp @@ -340,7 +340,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) : + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : PowerSeries.HasEval (standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ (standardLubinTatePrimitivePointInteger hπ n)) := by @@ -368,7 +368,7 @@ private theorem {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) - (σ : Gal((standardLubinTateLevelField hπ n) / K)) + (σ : Gal((standardLubinTateLevelField hπ n)/K)) (a : F.valuationSubring) : standardLubinTateLevelAutomorphismIntegerRingEquiv hπ n σ (standardLubinTateEndomorphismValue hπ n a) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean index c8ab580651..0b7e0acfff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean @@ -63,7 +63,7 @@ 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)) : + (σ : Gal((standardLubinTateLevelField hπ n)/K)) : σ ∈ standardLubinTateRealLowerRamificationGroup hπ n (i : ℝ) ↔ ((i + 1 : ℕ) : ℕ∞) ≤ IsDiscreteValuationRing.addVal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean index c46d7d3cf0..8f3016bb15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -910,7 +910,7 @@ 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)) + (n : ℕ) (σ : Gal(standardLubinTateLevelField hπ n/K)) (hne : valuationSubringAutOfUniqueExtension (standardLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean index 4c1416f044..47165fa89b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -618,7 +618,7 @@ private theorem padicMultiplicativePrimitiveRoot_unitAction private theorem padicMultiplicativeLevelAlgEquiv_mem_valuationSubring_iff (p : ℕ) [Fact p.Prime] (n : ℕ) (σ : Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p])) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) (x : standardLubinTateLevelField (padicMultiplicativeLubinTateSeries_isUniformizer p) n) : x ∈ (standardLubinTateLevelCompleteDVF @@ -673,7 +673,7 @@ private noncomputable def padicMultiplicativeLevelAutomorphismIntegerRingEquiv (p : ℕ) [Fact p.Prime] (n : ℕ) (σ : Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p])) : + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : (standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring ≃+* (standardLubinTateLevelCompleteDVF @@ -689,7 +689,7 @@ private theorem padicMultiplicativeLevelAutomorphismIntegerRingEquiv_apply (p : ℕ) [Fact p.Prime] (n : ℕ) (σ : Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p])) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) (x : (standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) : ((padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ x : @@ -705,7 +705,7 @@ private theorem padicMultiplicativeLevelAutomorphismIntegerRingEquiv_continuous (p : ℕ) [Fact p.Prime] (n : ℕ) (σ : Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p])) : + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : Continuous (padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ) := by let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p let target := standardLubinTateLevelCompleteDVF hπ n @@ -733,7 +733,7 @@ private theorem padicMultiplicativeLevelAutomorphismIntegerRingEquiv_comp_coefficientHom (p : ℕ) [Fact p.Prime] (n : ℕ) (σ : Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p])) : + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p])) : (padicMultiplicativeLevelAutomorphismIntegerRingEquiv p n σ : (standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring →+* diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean index 267e139537..52853307f8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -58,7 +58,7 @@ noncomputable def cyclic_H1_iso_HminusOne {k G : Type} [CommRing k] [Group G] /-- 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)) + [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) := @@ -68,7 +68,7 @@ noncomputable def unitsH1IsoTateHminusOne (K L : Type) [Field K] [Field L] 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)) + [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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index ff6fc07418..30bcde87f1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -61,7 +61,7 @@ theorem chosenNormalBasisIntegerLattice_eq_span : rfl /-- Every normal-basis vector lies in the `𝒪_K`-span lattice `M`. -/ -theorem normalBasis_mem_integerLattice (σ : Gal(L / K)) : +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 σ) @@ -86,7 +86,7 @@ theorem chosenNormalBasisIntegerLattice_field_span_eq_top : /-- The normal-basis lattice `M` is stable under the actual `Gal(L / K)` action. -/ theorem galoisGroup_apply_mem_chosenNormalBasisIntegerLattice - (τ : Gal(L / K)) {x : L} + (τ : Gal(L/K)) {x : L} (hx : x ∈ chosenNormalBasisIntegerLattice K L) : τ x ∈ chosenNormalBasisIntegerLattice K L := by refine Submodule.span_induction @@ -416,7 +416,7 @@ theorem exists_chosenBaseUniformizerPow_mul_mul_mem_of_fg_of_field_span_eq_top exact hleft x hxS y hyP · simp · intro x z _ _ hx hz - convert M.add_mem hx hz using 1 ; ring + convert M.add_mem hx hz using 1; ring · intro a x _ hx have hscaled : algebraMap 𝒪[K] L a * @@ -1894,7 +1894,7 @@ theorem chosenNormalBasisPrincipalUnitSet_mul_error_mem_succ {n : Nat} chosenBaseUniformizerPowSubmodule K L (n + 1) (chosenNormalBasisIntegerLattice K L) rw [hunit] - convert hxy using 1 ; ring + convert hxy using 1; ring omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] in diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean index c6fda048ec..c10ac7cc9a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -270,7 +270,7 @@ def galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) : + (n : Nat) (σ : Gal(L/K)) : IntegerUnitsModPrincipalUnitsAtLevel L n ≃* IntegerUnitsModPrincipalUnitsAtLevel L n := integerUnitsModPrincipalUnitsMapEquivOfIntegerRingEquiv L n @@ -283,7 +283,7 @@ theorem galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure_mk [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (u : 𝒪[L]ˣ) : + (n : Nat) (σ : Gal(L/K)) (u : 𝒪[L]ˣ) : galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ (integerUnitsModPrincipalUnitsAtLevelMk L n u) = integerUnitsModPrincipalUnitsAtLevelMk L n @@ -383,7 +383,7 @@ theorem galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralC [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (x : IntegerUnitsModPrincipalUnitsAtLevel L n) : + (n : Nat) (σ : Gal(L/K)) (x : IntegerUnitsModPrincipalUnitsAtLevel L n) : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n σ • x = galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ x := @@ -396,7 +396,7 @@ theorem integerUnitsModPrincipalUnitsSuccMap_galoisGroup_of_isIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) + (n : Nat) (σ : Gal(L/K)) (x : IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L (n + 1) @@ -427,7 +427,7 @@ theorem principalUnitsSuccQuotToIntegerUnitsModPrincipalUnitsSucc_galoisGroup_of [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (x : PrincipalUnitsSuccQuot L n) : + (n : Nat) (σ : Gal(L/K)) (x : PrincipalUnitsSuccQuot L n) : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L (n + 1) @@ -519,7 +519,7 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandH0_finite_of_isNonarchimede [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) : + [Fintype (Gal(L/K))] (n : Nat) : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := by @@ -534,7 +534,7 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandHMinusOne_finite_of_isNonar [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)) : + [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 @@ -550,7 +550,7 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandQuotient_eq_one_of_isNonarc [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)) + [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) := @@ -571,7 +571,7 @@ theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_exact_multiplicative_ [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - [Fintype (Gal(L / K))] (n : Nat) (σ : Gal(L / K)) + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L / K)) (hgen : ∀ g : Gal(L / K), g ∈ Subgroup.zpowers σ) (hA0 : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n @@ -668,7 +668,7 @@ theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_eq_one_of_isIntegralC [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - [Fintype (Gal(L / K))] (n : Nat) (σ : Gal(L / K)) + [Fintype (Gal(L/K))] (n : Nat) (σ : Gal(L / K)) (hgen : ∀ g : Gal(L / K), g ∈ Subgroup.zpowers σ) (hA0 : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean index 8fbc30289b..aa72d56efb 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -210,7 +210,7 @@ theorem deltaClass_mul (g h : G) : square G := TwoSidedIdeal.subset_span ⟨_, hg, _, hh, rfl⟩ convert hprod using 1 - show + change (deltaElement G (g * h) : IntegralGroupRing G) - ((deltaElement G g : IntegralGroupRing G) + (deltaElement G h : IntegralGroupRing G)) = @@ -262,17 +262,17 @@ theorem deltaAbelianization_deltaPreimage Multiplicative.ofAdd (QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩) := by apply Multiplicative.toAdd.injective - show + change Multiplicative.toAdd (deltaAbelianization G (deltaPreimage G x)) = QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ rw [deltaPreimage, map_prod] simp_rw [map_zpow, deltaAbelianization_of] - show + change ∑ g ∈ x.coeff.support, x.coeff g • deltaClass G g = QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ - show + change ∑ g ∈ x.coeff.support, x.coeff g • QuotientAddGroup.mk' (squareInIdeal G) @@ -280,7 +280,7 @@ theorem deltaAbelianization_deltaPreimage QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ simp_rw [← map_zsmul] rw [← map_sum] - show + change QuotientAddGroup.mk' (squareInIdeal G) (deltaCombinationElement G x) = QuotientAddGroup.mk' (squareInIdeal G) ⟨x, hx⟩ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean index b5595ee8da..80406e950a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -182,7 +182,7 @@ theorem relativeDeltaClass_one (H : Subgroup G) : relativeDeltaClass H 1 = 0 := by apply (QuotientAddGroup.eq_zero_iff _).2 rw [mem_mixedProductInNumerator_iff] - show embeddedDelta H 1 ∈ mixedAugmentationProduct H + change embeddedDelta H 1 ∈ mixedAugmentationProduct H rw [embeddedDelta_eq] simp @@ -193,7 +193,7 @@ theorem relativeDeltaClass_mul relativeDeltaClass H h + relativeDeltaClass H k := by apply (QuotientAddGroup.eq_iff_sub_mem).2 rw [mem_mixedProductInNumerator_iff] - show + change embeddedDelta H (h * k) - (embeddedDelta H h + embeddedDelta H k) ∈ mixedAugmentationProduct H @@ -262,7 +262,7 @@ theorem transversalComponent_mul_right T.2.toLeftFun g := by exact congrArg T.2.leftQuotientEquiv hcoset apply Subtype.ext - show + change (T.2.toLeftFun (g * (h : G)) : G)⁻¹ * (g * (h : G)) = ((T.2.toLeftFun g : G)⁻¹ * g) * (h : G) @@ -366,7 +366,7 @@ theorem transversalLinearization_mul_eq_zero rw [map_sum] apply Finset.sum_eq_zero intro h hh - show + change transversalLinearization H T ((x.coeff g • (deltaElement G g : IntegralGroupRing G)) * @@ -554,7 +554,7 @@ theorem relativeDeltaAbelianization_surjective apply Multiplicative.toAdd.injective apply (QuotientAddGroup.eq_iff_sub_mem).2 rw [mem_mixedProductInNumerator_iff] - show + change subgroupRingMap H (yH : IntegralGroupRing H) - (z : IntegralGroupRing G) ∈ mixedAugmentationProduct H @@ -815,7 +815,7 @@ theorem mk_singleMulEmbeddedDeltaElement_eq_relativeDeltaClass relativeDeltaClass H h := by apply (QuotientAddGroup.eq_iff_sub_mem).2 rw [mem_mixedProductInNumerator_iff] - show + change MonoidAlgebra.single r 1 * embeddedDelta H h - embeddedDelta H h ∈ mixedAugmentationProduct H diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 9377d3b597..34c9bba8d5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -164,7 +164,7 @@ theorem wordExponent_of {X : Type*} (x : X) : @[simp] theorem wordExponent_inv {X : Type*} (w : FreeGroup X) : wordExponent w⁻¹ = -wordExponent w := by - show + change FreeAbelianGroup.toFinsupp (-Additive.ofMul (Abelianization.of w)) = -FreeAbelianGroup.toFinsupp @@ -175,7 +175,7 @@ theorem wordExponent_inv {X : Type*} (w : FreeGroup X) : theorem wordExponent_mul {X : Type*} (u v : FreeGroup X) : wordExponent (u * v) = wordExponent u + wordExponent v := by - show + change FreeAbelianGroup.toFinsupp (Additive.ofMul (Abelianization.of u) + Additive.ofMul (Abelianization.of v)) = @@ -1037,7 +1037,7 @@ theorem eq_coeff_one_smul_groupNormElement x.coeff q) (hz q) have hcoeff : z.coeff q = z.coeff 1 := by simpa using hq.symm - show + change z.coeff q = z.coeff 1 * (groupNormElement Q).coeff q rw [hcoeff] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean index a43ec1474b..9d1820ef17 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean @@ -248,7 +248,7 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic (fun x : dvrHigherUnitQuotientInverseLimit (chosenPrincipalUnitPadicUniformizer F) => by intro i j hij - show higherUnitQuotientTransition F hij + change higherUnitQuotientTransition F hij (uniformizerHigherUnitQuotientEquiv F j (dvrHigherUnitQuotientInverseLimit_eval (chosenPrincipalUnitPadicUniformizer F) j x)) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean index 27e80ba88a..7ab6d81e2c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean @@ -817,7 +817,7 @@ theorem galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_ [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L σ = galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ := rfl diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index 922133976e..341e59e054 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -35,7 +35,7 @@ theorem galoisGroup_mem_integerRing_of_isIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[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 @@ -52,7 +52,7 @@ def galoisGroupIntegerRingEquivOfIsIntegralClosure (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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : 𝒪[L] ≃+* 𝒪[L] where toFun x := ⟨σ (x : L), galoisGroup_mem_integerRing_of_isIntegralClosure K L σ x⟩ @@ -83,7 +83,7 @@ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_apply [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[L]) : + (σ : Gal(L/K)) (x : 𝒪[L]) : ((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x : 𝒪[L]) : L) = σ (x : L) := rfl @@ -95,7 +95,7 @@ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_symm_apply [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[L]) : + (σ : Gal(L/K)) (x : 𝒪[L]) : (((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).symm x : 𝒪[L]) : L) = σ.symm (x : L) := rfl @@ -135,7 +135,7 @@ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_integerRingMap [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[K]) : + (σ : Gal(L/K)) (x : 𝒪[K]) : galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (integerRingMapOfValuationExtension K L x) = integerRingMapOfValuationExtension K L x := by @@ -149,7 +149,7 @@ theorem galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure_integerRingMa [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (σ : Gal(L / K)) (x : 𝒪[K]) : + (σ : Gal(L/K)) (x : 𝒪[K]) : letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L σ • integerRingMapOfValuationExtension K L x = integerRingMapOfValuationExtension K L x := by @@ -300,7 +300,7 @@ def galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) : + (n : Nat) (σ : Gal(L/K)) : principalUnits L n ≃* principalUnits L n := principalUnitsMapEquivOfIntegerRingEquiv L n (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) @@ -312,7 +312,7 @@ theorem galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure_apply [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (u : principalUnits L n) : + (n : Nat) (σ : Gal(L/K)) (u : principalUnits L n) : ((galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u : principalUnits L n) : 𝒪[L]ˣ) = Units.mapEquiv @@ -343,7 +343,7 @@ def galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) : + (n : Nat) (σ : Gal(L/K)) : MaximalIdealPowSuccQuot L n ≃+ MaximalIdealPowSuccQuot L n := maximalIdealPowSuccQuotMapEquivOfIntegerRingEquiv L n (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) @@ -355,7 +355,7 @@ theorem galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure_mk [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) + (n : Nat) (σ : Gal(L/K)) (a : ((𝓂[L] ^ n : Ideal 𝒪[L]) : Type u)) : galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ (maximalIdealPowSuccQuotMk L n a) = @@ -448,7 +448,7 @@ theorem galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure_sm [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (x : MaximalIdealPowSuccQuot L n) : + (n : Nat) (σ : Gal(L/K)) (x : MaximalIdealPowSuccQuot L n) : letI := galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure K L n σ • x = galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x := rfl @@ -506,7 +506,7 @@ theorem galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsI [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) + (n : Nat) (σ : Gal(L/K)) (x : Multiplicative (MaximalIdealPowSuccQuot L n)) : letI := galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure K L n @@ -520,7 +520,7 @@ def galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) : + (n : Nat) (σ : Gal(L/K)) : PrincipalUnitsSuccQuot L n ≃* PrincipalUnitsSuccQuot L n := principalUnitsSuccQuotMapEquivOfIntegerRingEquiv L n (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) @@ -532,7 +532,7 @@ theorem galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure_apply [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (u : principalUnits L n) : + (n : Nat) (σ : Gal(L/K)) (u : principalUnits L n) : galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ (QuotientGroup.mk u) = QuotientGroup.mk @@ -603,7 +603,7 @@ theorem galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure_ [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (σ : Gal(L / K)) (x : PrincipalUnitsSuccQuot L n) : + (n : Nat) (σ : Gal(L/K)) (x : PrincipalUnitsSuccQuot L n) : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n σ • x = galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ x := rfl @@ -671,7 +671,7 @@ theorem galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure_ [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)) : + (n : Nat) (σ : Gal(L/K)) (x : Additive (PrincipalUnitsSuccQuot L n)) : letI := galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure K L n σ • x = Additive.ofMul (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ @@ -685,7 +685,7 @@ theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuot_galoisGroup_of_isIntegra [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (hn : 1 ≤ n) (σ : Gal(L / K)) + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) (x : MaximalIdealPowSuccQuot L n) : galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ (principalUnitsSuccQuotOfMaximalIdealPowSuccQuot L n hn x) = @@ -701,7 +701,7 @@ theorem principalUnitsSuccQuotOfMaximalIdealPowSuccQuotAdd_galoisGroup_of_isInte [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (hn : 1 ≤ n) (σ : Gal(L / K)) + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) (x : MaximalIdealPowSuccQuot L n) : Additive.ofMul (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ @@ -718,7 +718,7 @@ theorem maximalIdealPowSuccQuotAddEquivPrincipalUnitsSuccQuot_galoisGroup_of_isI [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (hn : 1 ≤ n) (σ : Gal(L / K)) + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) (x : MaximalIdealPowSuccQuot L n) : letI := galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure K L n letI := galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure K L n @@ -739,7 +739,7 @@ theorem maximalIdealPowSuccQuotMulEquivPrincipalUnitsSuccQuot_galoisGroup_of_isI [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] - (n : Nat) (hn : 1 ≤ n) (σ : Gal(L / K)) + (n : Nat) (hn : 1 ≤ n) (σ : Gal(L/K)) (x : Multiplicative (MaximalIdealPowSuccQuot L n)) : letI := galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsIntegralClosure diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean index 0361f826d8..207de758ae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -33,7 +33,7 @@ the local class-field calculation reduces the product of conjugates modulo the m 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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : 𝓀[L] ≃+* 𝓀[L] := IsLocalRing.ResidueField.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) @@ -44,7 +44,7 @@ its conjugate. -/ 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]) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) (x : 𝒪[L]) : galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ (IsLocalRing.residue 𝒪[L] x) = IsLocalRing.residue 𝒪[L] @@ -56,7 +56,7 @@ theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_integerUnitsToResidueUni (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]ˣ) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) (u : 𝒪[L]ˣ) : Units.mapEquiv (galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ).toMulEquiv (integerUnitsToResidueUnits L u) = integerUnitsToResidueUnits L @@ -69,7 +69,7 @@ theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_integerUnitsToResidueUni 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]) : + [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 @@ -86,7 +86,7 @@ theorem galoisGroupResidueFieldEquivOfIsIntegralClosure_algebraMap (K L : Type u 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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] where __ := galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ commutes' := galoisGroupResidueFieldEquivOfIsIntegralClosure_algebraMap K L σ @@ -116,7 +116,7 @@ automorphism. -/ 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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L σ = galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ := rfl @@ -193,7 +193,7 @@ theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_stabilizerH (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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure K L σ ∈ (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).ker := by @@ -223,7 +223,7 @@ theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_mem_maximal (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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ σ ∈ galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L := by rw [galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_stabilizerHom] @@ -248,7 +248,7 @@ 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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ ∀ x : 𝒪[L], IsLocalRing.residue 𝒪[L] @@ -276,7 +276,7 @@ theorem galoisGroupResidueAlgEquivHomOfIsIntegralClosure_mem_ker_iff_sub_mem_max (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)) : + [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : σ ∈ (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L).ker ↔ ∀ x : 𝒪[L], galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x - x ∈ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index a1055dfef9..5990f7f58c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -546,7 +546,7 @@ def ofFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : @[simp] theorem ofFiniteExtension_apply (i : L →ₐ[K] AlgebraicClosure K) - (σ : Gal(AlgebraicClosure K / AlgHom.fieldRange i)) : + (σ : Gal(AlgebraicClosure K/AlgHom.fieldRange i)) : ofFiniteExtension K i σ = σ.restrictScalars K := rfl @@ -674,7 +674,7 @@ def quotientEquivGalFieldRangeOfNormalFiniteExtension [FiniteDimensional K L] @[simp] theorem quotientEquivGalFieldRangeOfNormalFiniteExtension_mk' [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) - [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K / K)) : + [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K/K)) : quotientEquivGalFieldRangeOfNormalFiniteExtension K i (QuotientGroup.mk' (AlgHom.fieldRange i).fixingSubgroup σ) = AlgEquiv.restrictNormalHom (AlgHom.fieldRange i) σ := @@ -693,7 +693,7 @@ def quotientEquivGalOfNormalFiniteExtension [FiniteDimensional K L] @[simp] theorem quotientEquivGalOfNormalFiniteExtension_mk' [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) - [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K / 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index 12331ef9ec..d69b243c2f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -321,7 +321,7 @@ 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(SeparableClosure K/K)) : Gal(AlgebraicClosure K / K) := by letI : Algebra (SeparableClosure K) (AlgebraicClosure K) := (separableClosure K (AlgebraicClosure K)).val.toRingHom.toAlgebra @@ -384,7 +384,7 @@ def restrictToSeparableClosure @[simp] theorem separableClosureExtensionAlgEquiv_restricts (K : Type u) [Field K] - (τ : Gal(SeparableClosure K / K)) (x : SeparableClosure K) : + (τ : Gal(SeparableClosure K/K)) (x : SeparableClosure K) : separableClosureExtensionAlgEquiv K τ x = τ x := by dsimp [separableClosureExtensionAlgEquiv] let : Algebra (SeparableClosure K) (AlgebraicClosure K) := @@ -409,7 +409,7 @@ theorem separableClosureExtensionAlgEquiv_restricts /-- States the theorem `restrictToSeparableClosure_extension`. -/ @[simp] theorem restrictToSeparableClosure_extension - (K : Type u) [Field K] (τ : Gal(SeparableClosure K / K)) : + (K : Type u) [Field K] (τ : Gal(SeparableClosure K/K)) : AlgEquiv.separableClosure (separableClosureExtensionAlgEquiv K τ) = τ := by ext x exact separableClosureExtensionAlgEquiv_restricts K τ x @@ -417,7 +417,7 @@ theorem restrictToSeparableClosure_extension /-- States the theorem `extension_restrictToSeparableClosure`. -/ @[simp] theorem extension_restrictToSeparableClosure - (K : Type u) [Field K] (σ : Gal(AlgebraicClosure K / K)) : + (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 @@ -529,7 +529,7 @@ theorem finiteDimensional_separablePartInAbsoluteSeparableClosure theorem separableClosureExtension_mem_fixingSubgroup_of_mem_separablePart (K : Type u) [Field K] (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] - (τ : Gal(SeparableClosure K / K)) + (τ : Gal(SeparableClosure K/K)) (hτ : τ ∈ (separablePartInAbsoluteSeparableClosure K E).fixingSubgroup) : separableClosureExtensionAlgEquiv K τ ∈ E.fixingSubgroup := by let Esep : IntermediateField K E := separableClosure K E @@ -637,7 +637,7 @@ def ofIntermediateFieldInExtension @[simp] theorem ofIntermediateFieldInExtension_apply {K : Type u} {M : Type v} [Field K] [Field M] [Algebra K M] - (E : IntermediateField K M) (σ : Gal(M / E)) : + (E : IntermediateField K M) (σ : Gal(M/E)) : ofIntermediateFieldInExtension E σ = σ.restrictScalars K := rfl @@ -683,7 +683,7 @@ def ofIntermediateField (E : IntermediateField K (AlgebraicClosure K)) : @[simp] theorem ofIntermediateField_apply (E : IntermediateField K (AlgebraicClosure K)) - (σ : Gal(AlgebraicClosure K / E)) : + (σ : Gal(AlgebraicClosure K/E)) : ofIntermediateField K E σ = σ.restrictScalars K := rfl @@ -717,7 +717,7 @@ theorem ofIntermediateField_injective /-- States the theorem `ofIntermediateField_eq_iff`. -/ theorem ofIntermediateField_eq_iff (E : IntermediateField K (AlgebraicClosure K)) - (σ τ : Gal(AlgebraicClosure K / E)) : + (σ τ : Gal(AlgebraicClosure K/E)) : ofIntermediateField K E σ = ofIntermediateField K E τ ↔ σ = τ := ⟨fun h => ofIntermediateField_injective K E h, fun h => by rw [h]⟩ @@ -874,7 +874,7 @@ theorem openSubgroupOfFiniteIntermediateField_toSubgroup @[simp] theorem mem_openSubgroupOfFiniteIntermediateField (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] - (σ : Gal(AlgebraicClosure K / K)) : + (σ : Gal(AlgebraicClosure K/K)) : σ ∈ openSubgroupOfFiniteIntermediateField K E ↔ ∀ x ∈ E, σ x = x := by rw [← IntermediateField.mem_fixingSubgroup_iff E σ] @@ -919,7 +919,7 @@ theorem openSubgroupOfFiniteIntermediateFieldSup_toSubgroup theorem mem_openSubgroupOfFiniteIntermediateFieldSup (E F : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] [FiniteDimensional K F] - (σ : Gal(AlgebraicClosure K / K)) : + (σ : Gal(AlgebraicClosure K/K)) : σ ∈ openSubgroupOfFiniteIntermediateFieldSup K E F ↔ σ ∈ openSubgroupOfFiniteIntermediateField K E ∧ σ ∈ openSubgroupOfFiniteIntermediateField K F := by @@ -943,7 +943,7 @@ theorem range_ofIntermediateField_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)) : + (σ : Gal(AlgebraicClosure K/K)) : σ ∈ MonoidHom.range (ofIntermediateField K (E ⊔ F)) ↔ σ ∈ E.fixingSubgroup ∧ σ ∈ F.fixingSubgroup := by rw [range_ofIntermediateField_sup, Subgroup.mem_inf] @@ -997,7 +997,7 @@ theorem openSubgroupOfFiniteIntermediateFieldEquiv_apply @[simp] theorem coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] - (σ : Gal(AlgebraicClosure K / E)) : + (σ : Gal(AlgebraicClosure K/E)) : ((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm σ : Gal(AlgebraicClosure K / K)) = ofIntermediateField K E σ := @@ -1097,7 +1097,7 @@ theorem isOpen_range_ofIntermediateField /-- States the theorem `mem_range_ofIntermediateField_iff`. -/ theorem mem_range_ofIntermediateField_iff (E : IntermediateField K (AlgebraicClosure K)) - (σ : Gal(AlgebraicClosure K / K)) : + (σ : Gal(AlgebraicClosure K/K)) : σ ∈ MonoidHom.range (ofIntermediateField K E) ↔ σ ∈ E.fixingSubgroup := by rw [range_ofIntermediateField] @@ -1157,7 +1157,7 @@ def quotientEquivGalOfNormalIntermediateField @[simp] theorem quotientEquivGalOfNormalIntermediateField_mk' (E : IntermediateField K (AlgebraicClosure K)) [Normal K E] - (σ : Gal(AlgebraicClosure K / K)) : + (σ : Gal(AlgebraicClosure K/K)) : quotientEquivGalOfNormalIntermediateField K E (QuotientGroup.mk' E.fixingSubgroup σ) = AlgEquiv.restrictNormalHom E σ := by @@ -1264,14 +1264,14 @@ theorem closedSubgroupOfOpenSubgroup_toSubgroup /-- The finite fixed field attached to an open subgroup of `G_K`. -/ def fixedFieldOfOpenSubgroup - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (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))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenSubgroup K H = IntermediateField.fixedField H.toSubgroup := rfl @@ -1280,7 +1280,7 @@ theorem fixedFieldOfOpenSubgroup_def open subgroup, as a subgroup of `G_K`. -/ theorem fixingSubgroup_fixedFieldOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : (fixedFieldOfOpenSubgroup K H).fixingSubgroup = H.toSubgroup := by exact InfiniteGalois.fixingSubgroup_fixedField (closedSubgroupOfOpenSubgroup K H) @@ -1288,7 +1288,7 @@ theorem fixingSubgroup_fixedFieldOfOpenSubgroup /-- Open subgroups of `G_K` have finite fixed fields. -/ theorem finiteDimensional_fixedFieldOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / 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 ?_ @@ -1298,7 +1298,7 @@ theorem finiteDimensional_fixedFieldOfOpenSubgroup /-- Provides the instance `instFiniteDimensional`. -/ instance fixedFieldOfOpenSubgroup.instFiniteDimensional [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : FiniteDimensional K (fixedFieldOfOpenSubgroup K H) := finiteDimensional_fixedFieldOfOpenSubgroup K H @@ -1318,7 +1318,7 @@ open subgroup back to that open subgroup. -/ @[simp] theorem openSubgroupOfFiniteIntermediateField_fixedFieldOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : openSubgroupOfFiniteIntermediateField K (fixedFieldOfOpenSubgroup K H) = H := by apply OpenSubgroup.toSubgroup_injective @@ -1334,14 +1334,14 @@ private theorem intermediateField_eq_of_fixingSubgroup_eq /-- The open-subgroup fixed-field construction is antitone. -/ theorem fixedFieldOfOpenSubgroup_le_of_le - (H J : OpenSubgroup (Gal(AlgebraicClosure K / K))) (hHJ : H ≤ J) : + (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))) : + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenSubgroup K H ≤ fixedFieldOfOpenSubgroup K J ↔ J ≤ H := by constructor · intro h @@ -1359,7 +1359,7 @@ theorem fixedFieldOfOpenSubgroup_le_iff fields. -/ theorem fixedFieldOfOpenSubgroup_inf [IsGalois K (AlgebraicClosure K)] - (H J : OpenSubgroup (Gal(AlgebraicClosure K / 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 @@ -1372,7 +1372,7 @@ theorem fixedFieldOfOpenSubgroup_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))) : + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenSubgroup K (H ⊔ J) = fixedFieldOfOpenSubgroup K H ⊓ fixedFieldOfOpenSubgroup K J := by ext x @@ -1411,7 +1411,7 @@ 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))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : OpenSubgroup (Gal(AlgebraicClosure K / K)) := by let E : IntermediateField K (AlgebraicClosure K) := fixedFieldOfOpenSubgroup K H @@ -1472,8 +1472,8 @@ finite fixed field. -/ @[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenSubgroup K (conjugateOpenSubgroupOfOpenSubgroup K σ H) = (fixedFieldOfOpenSubgroup K H).map @@ -1492,8 +1492,8 @@ to the conjugate of the compositum of their fixed fields. -/ @[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_inf [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H J : OpenSubgroup (Gal(AlgebraicClosure K / 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 @@ -1506,8 +1506,8 @@ conjugate of the intersection of the fixed fields. -/ @[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_sup [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H J : OpenSubgroup (Gal(AlgebraicClosure K / 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 @@ -1519,7 +1519,7 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_sup @[simp] theorem conjugateOpenSubgroupOfOpenSubgroup_one [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : conjugateOpenSubgroupOfOpenSubgroup K 1 H = H := by apply OpenSubgroup.toSubgroup_injective rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] @@ -1530,8 +1530,8 @@ theorem conjugateOpenSubgroupOfOpenSubgroup_one @[simp] theorem conjugateOpenSubgroupOfOpenSubgroup_inf [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H J : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊓ J) = conjugateOpenSubgroupOfOpenSubgroup K σ H ⊓ conjugateOpenSubgroupOfOpenSubgroup K σ J := by @@ -1547,8 +1547,8 @@ theorem conjugateOpenSubgroupOfOpenSubgroup_inf @[simp] theorem conjugateOpenSubgroupOfOpenSubgroup_sup [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H J : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (σ : Gal(AlgebraicClosure K/K)) + (H J : OpenSubgroup (Gal(AlgebraicClosure K/K))) : conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊔ J) = conjugateOpenSubgroupOfOpenSubgroup K σ H ⊔ conjugateOpenSubgroupOfOpenSubgroup K σ J := by @@ -1564,7 +1564,7 @@ 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))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : OpenNormalSubgroup (Gal(AlgebraicClosure K / K)) where toOpenSubgroup := ⟨H.toSubgroup.normalCore, by @@ -1597,14 +1597,14 @@ theorem openNormalCoreOfOpenSubgroup_le /-- The fixed field of an open normal subgroup is a finite Galois intermediate field. -/ def fixedFieldOfOpenNormalSubgroup - (H : OpenNormalSubgroup (Gal(AlgebraicClosure K / K))) : + (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))) : + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenNormalSubgroup K H = IntermediateField.fixedField H.toSubgroup := rfl @@ -1612,14 +1612,14 @@ theorem fixedFieldOfOpenNormalSubgroup_def /-- Provides the instance `instFiniteDimensional`. -/ instance fixedFieldOfOpenNormalSubgroup.instFiniteDimensional [IsGalois K (AlgebraicClosure K)] - (H : OpenNormalSubgroup (Gal(AlgebraicClosure K / 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))) : + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : IsGalois K (fixedFieldOfOpenNormalSubgroup K H) := by refine (InfiniteGalois.normal_iff_isGalois (K := AlgebraicClosure K) (fixedFieldOfOpenNormalSubgroup K H)).1 ?_ @@ -1630,7 +1630,7 @@ theorem isGalois_fixedFieldOfOpenNormalSubgroup /-- Provides the instance `instNormal`. -/ instance fixedFieldOfOpenNormalSubgroup.instNormal [IsGalois K (AlgebraicClosure K)] - (H : OpenNormalSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) : Normal K (fixedFieldOfOpenNormalSubgroup K H) := by have : IsGalois K (fixedFieldOfOpenNormalSubgroup K H) := isGalois_fixedFieldOfOpenNormalSubgroup K H @@ -1640,7 +1640,7 @@ instance fixedFieldOfOpenNormalSubgroup.instNormal of `G_K`. -/ def quotientOpenNormalSubgroupEquivGalFixedField [IsGalois K (AlgebraicClosure K)] - (H : OpenNormalSubgroup (Gal(AlgebraicClosure K / 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)) := @@ -1654,7 +1654,7 @@ def quotientOpenNormalSubgroupEquivGalFixedField @[simp] theorem quotientOpenNormalSubgroupEquivGalFixedField_mk' [IsGalois K (AlgebraicClosure K)] - (H : OpenNormalSubgroup (Gal(AlgebraicClosure K / K))) + (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) (σ : Gal(AlgebraicClosure K / K)) : quotientOpenNormalSubgroupEquivGalFixedField K H (QuotientGroup.mk' H.toSubgroup σ) = @@ -1674,7 +1674,7 @@ theorem quotientOpenNormalSubgroupEquivGalFixedField_mk' fields to taking the normal closure. -/ theorem fixedFieldOfOpenNormalCoreOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenNormalSubgroup K (openNormalCoreOfOpenSubgroup K H) = IntermediateField.normalClosure K (fixedFieldOfOpenSubgroup K H) @@ -1737,8 +1737,8 @@ expressed on fixed fields. -/ @[simp] theorem fixedFieldOfOpenNormalCoreOfConjugateOpenSubgroupOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : fixedFieldOfOpenNormalSubgroup K (openNormalCoreOfOpenSubgroup K (conjugateOpenSubgroupOfOpenSubgroup K σ H)) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean index 4ec3135659..32142c8c8a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -168,7 +168,7 @@ theorem inertiaUnitQuotientClass_mul_right_unit A.principalUnitGroup := inertia_automorphismUnitQuotient_mem_principalUnitGroup_of_mem_unitGroup (K := K) A σ hu - show + change (QuotientGroup.mk (automorphismUnitQuotient K A (σ : decompositionGroup K A) (x * u)) : Lˣ ⧸ A.principalUnitGroup) = @@ -209,7 +209,7 @@ theorem inertiaUnitQuotientClass_mul_right_algebraMapUnit (Units.map (algebraMap K L).toMonoidHom a) = 1 := automorphismUnitQuotient_algebraMapUnit (K := K) A (σ : decompositionGroup K A) a - show + change (QuotientGroup.mk (automorphismUnitQuotient K A (σ : decompositionGroup K A) (x * Units.map (algebraMap K L).toMonoidHom a)) : @@ -297,7 +297,7 @@ def valueDisplacementHom automorphismUnitQuotient_one_arg] exact A.unitGroup.one_mem map_mul' x y := by - show + change QuotientGroup.mk' A.unitGroup (automorphismUnitQuotient K A σ (x * y)) = QuotientGroup.mk' A.unitGroup @@ -630,7 +630,7 @@ def inertiaUnitQuotientHom automorphismUnitQuotient_one_arg] exact A.principalUnitGroup.one_mem map_mul' x y := by - show + change QuotientGroup.mk' A.principalUnitGroup (automorphismUnitQuotient K A (σ : decompositionGroup K A) (x * y)) = @@ -860,7 +860,7 @@ def valueTrivialInertiaCharacterHom apply QuotientGroup.monoidHom_ext apply MonoidHom.ext intro x - show + change valueModuloBaseToResidueUnits K A (σ * τ) (QuotientGroup.mk' (baseUnitValueClassSubgroup K A) (QuotientGroup.mk' A.unitGroup x)) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean index bb8933cc86..5c0155dfdb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean @@ -47,7 +47,7 @@ theorem (htarget : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension base target) - (σ : Gal(M / K)) (a : middle.valuationSubring) : + (σ : Gal(M/K)) (a : middle.valuationSubring) : valuationSubringAutOfUniqueExtension (base := base) (target := target) htarget σ (integerMap middle target a) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean index 99d059a22d..0ae06232c9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean @@ -64,7 +64,7 @@ theorem galoisGroupEquivOfBaseRingEquiv_apply [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) : + (σ : Gal(E/B)) (x : E) : galoisGroupEquivOfBaseRingEquiv B K E e he σ x = σ x := rfl @@ -84,7 +84,7 @@ private theorem upperRamificationGroup_map_baseChange (huniqK : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension (base := baseK) (target := target)) - (q : Gal(E / B) ≃* Gal(E / K)) + (q : Gal(E / B) ≃* Gal(E/K)) (hq : ∀ σ x, q σ x = σ x) (t : ℝ) : Subgroup.map q.toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index 189f2aff05..f61184838d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -345,7 +345,7 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr [IsGalois K L] [IsGalois K M] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (H : Subgroup Gal(L / K)) [H.Normal] + (H : Subgroup Gal(L/K)) [H.Normal] (e : IntermediateField.fixedField H ≃ₐ[K] M) (t : ℝ) : Subgroup.map (AlgEquiv.autCongr e).toMonoidHom @@ -590,7 +590,7 @@ private theorem fixedFieldUpperRamificationGroup_eq_local [FiniteDimensional K L] [IsGalois K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (H : Subgroup Gal(L / K)) [H.Normal] + (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : fixedFieldUpperRamificationGroup (chosenLocalExtensionCompleteDVF_hasUniqueDVFValuationExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean index 4a52c9a669..e366786022 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean @@ -20,7 +20,7 @@ namespace Valuations variable {K : Type*} [Field K] -/-- The additive exponential valuation `- log |x|`, with value `∞` at zero. -/ +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean index ff404055a6..a105d2b566 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean @@ -54,7 +54,7 @@ theorem minpoly_map_aeval_one_tmul Polynomial.aeval (1 ⊗ₜ[K] pb.gen : A ⊗[K] L) ((minpoly K pb.gen).map (algebraMap K A)) = 0 := by rw [Polynomial.aeval_map_algebraMap] - show Polynomial.aeval + 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] From d196ba50095f341d3feff9aeec1f62b000515dec Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 00:39:25 +0000 Subject: [PATCH 10/33] Document and generalize the complete class field theory import --- .../Degree/Fields.lean | 15 +- .../Degree/Frobenius.lean | 3 +- .../Degree/FrobeniusFixedField.lean | 25 +- .../Degree/NormConjugation.lean | 3 +- .../Degree/NormLaws.lean | 1 - .../Degree/Valuation.lean | 7 +- .../Degree/ValuationLaws.lean | 3 +- .../Reciprocity/ClassFieldCandidate.lean | 9 +- .../CanonicalUnramifiedNormQuotient.lean | 3 +- .../DoubleCosetOrbitGeometry.lean | 1 - .../FiniteIntermediateCompositum.lean | 3 +- .../FrobeniusClosureCommutation.lean | 4 +- .../Construction/FrobeniusDescent.lean | 7 +- .../FrobeniusPowerFixedField.lean | 2 +- .../FrobeniusQuotientDescent.lean | 2 +- .../Construction/FrobeniusSemigroup.lean | 1 - .../Construction/MainFiniteReciprocity.lean | 26 +- .../ConjugatePrimeNorm.lean | 3 +- .../MainMultiplicativity/CorrectionSum.lean | 2 +- .../Construction/MainNaturality.lean | 2 +- .../Construction/MainTransfer.lean | 6 +- .../Construction/MainTransferFrobenius.lean | 2 +- .../MainTransferFrobeniusGeometry.lean | 2 +- .../Construction/ReciprocityDefinition.lean | 3 +- .../Construction/ReciprocityIndependence.lean | 3 +- .../Construction/UnitCohomologyAxiom.lean | 1 - .../Construction/UnramifiedNormQuotient.lean | 11 +- .../Reciprocity/Core.lean | 11 +- .../FiniteAbelianClassification.lean | 12 +- .../FiniteAbelianSubextension.lean | 2 +- .../Reciprocity/FiniteGaloisSubextension.lean | 2 +- .../Reciprocity/IntermediateExtension.lean | 6 +- .../Reciprocity/Main.lean | 3 +- .../Reciprocity/MaximalUnramifiedSymbol.lean | 11 +- .../Reciprocity/NormTopology.lean | 3 +- .../Reciprocity/TotallyRamified.lean | 3 +- .../RestrictionCosets.lean | 2 +- .../Reciprocity/ValuationContinuity.lean | 8 +- .../Algebra/AbelianGaloisEquiv.lean | 2 +- .../Adele/FinitePlaceTensorBlock.lean | 10 + .../FiniteRestrictedProductBaseChange.lean | 2 +- .../Adele/InfinitePlaceTensorBlock.lean | 8 + .../Adele/IntegralLocalFactor.lean | 4 +- .../FinitePlaceCompletion.lean | 12 +- .../LocalTensorDecomposition.lean | 8 +- .../AdeleBaseChange.lean | 10 +- .../Completion/ChosenLocalization.lean | 40 +- .../Completion/Comparison.lean | 22 +- .../Completion/ExtensionIndex.lean | 32 +- .../Completion/IntegerRingComparison.lean | 22 +- .../CompletionToIdeal.lean | 7 +- .../IdealToCompletion.lean | 11 +- .../UnramifiedComparison/LocalNorm.lean | 3 +- .../RamificationIndex.lean | 4 +- .../FiniteAbelianCompositum.lean | 2 +- .../Galois/CyclicPrimeSubextension.lean | 27 +- .../Idele/BaseChange.lean | 2 +- .../Idele/ClassGroup/AlgEquiv.lean | 7 +- .../Idele/ClassGroup/BaseChange.lean | 3 - .../ConnectedComponentQuotientCongr.lean | 1 - .../Idele/ClassGroup/NormComparison.lean | 2 +- .../Idele/ClassGroup/Tower.lean | 4 - .../ClassGroup/TowerAlgEquivNaturality.lean | 1 - .../Idele/ClassGroup/TowerBaseChange.lean | 2 - .../Idele/Cohomology/Decomposition.lean | 4 +- .../Idele/Cohomology/Herbrand.lean | 4 +- .../Cohomology/SPlaces/Herbrand/Factors.lean | 11 +- .../SPlaces/Herbrand/FamilyCardinality.lean | 4 +- .../SPlaces/Herbrand/FamilyFinite.lean | 4 +- .../Cohomology/SPlaces/Herbrand/Local.lean | 11 +- .../LocalInduction/Equiv.lean | 3 +- .../Idele/Cohomology/SupportedBridge.lean | 21 +- .../Idele/Extension/BaseChange.lean | 4 +- .../Idele/Extension/ClassGroup.lean | 2 - .../Idele/Extension/EmbeddingNorm.lean | 16 +- .../Idele/Extension/GaloisDescent.lean | 2 +- .../Idele/Extension/GaloisNorm.lean | 10 +- .../Idele/Extension/IdealClass.lean | 3 - .../Idele/Extension/IdeleClassBaseChange.lean | 1 - .../Idele/Extension/IdeleNorm.lean | 1 - .../Idele/Extension/IdeleNormComponents.lean | 32 +- .../Idele/Extension/LocalComponent.lean | 3 - .../Idele/Extension/LocalNorm.lean | 12 +- .../AlgebraicNumberTheory/Idele/IdealMap.lean | 5 +- .../Idele/NormApproximation/FinitePlaces.lean | 32 +- .../AlgebraicNumberTheory/Idele/NormCore.lean | 3 +- .../Idele/NormOneCompact.lean | 45 +- .../Idele/NormTopology/ArchimedeanNorm.lean | 2 +- .../Idele/NormTopology/Continuity.lean | 20 +- .../Idele/NormTopology/ExtensionBehavior.lean | 11 +- .../NormTopology/FiniteNormArithmetic.lean | 6 +- .../Idele/PositiveArchimedeanSection.lean | 25 +- .../Idele/PrincipalCore.lean | 2 - .../Idele/PrincipalNorm.lean | 3 - .../Relative/FiniteIntegralNormPreimage.lean | 12 +- .../Idele/Relative/FinitePlaceTensorNorm.lean | 1 - .../Idele/SinglePlace.lean | 43 +- .../NumberField/FiniteUnramifiedTower.lean | 4 +- .../MathlibUnramifiedInterface.lean | 12 +- .../NumberField/PlaceEquiv.lean | 2 +- .../PowerResidueSymbols/Ideal.lean | 32 +- .../QuadraticReciprocity.lean | 3 +- .../Ramification/Splitting/FinitePlace.lean | 18 +- .../Splitting/FinitePlaceIdeal.lean | 11 +- .../Ramification/Splitting/NormalClosure.lean | 37 +- .../Splitting/PrimeOrderFixedField.lean | 22 +- .../RayClass/Approximation.lean | 25 +- .../AlgebraicNumberTheory/RayClass/Basic.lean | 2 +- .../RayClass/FullModulus.lean | 51 ++- .../AlgebraicNumberTheory/RayClass/Ideal.lean | 64 ++- .../RayClass/IdealNorm.lean | 35 +- .../RayClass/Narrow.lean | 36 +- .../RayClass/PrimeGeneration.lean | 3 +- .../RayClass/Rational.lean | 82 +++- .../RayClass/Topology.lean | 49 ++- .../SUnit/GaloisAction.lean | 72 ++- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 37 +- .../SUnit/LogLattice.lean | 73 ++- .../EmbedsInRayClassField.lean | 2 +- .../FractionalIdealNormExponentMap.lean | 6 +- .../IsUnramifiedOutsideModulus.lean | 2 +- .../NarrowRayClassModulus.lean | 3 +- .../RayClassIdealModulusProjection.lean | 9 +- .../RayClassIdealNorm.lean | 7 +- .../RayClassModulus.lean | 2 +- .../ArithmeticFrobeniusAt.lean | 3 +- .../FinitePrimeSplitsCompletely.lean | 4 +- .../IsUnramifiedAtFinitePlaces.lean | 4 +- ...mberFieldFractionalIdealFactorization.lean | 14 +- .../NumberFieldFractionalIdealGroup.lean | 2 +- .../FiniteAbelianExtension.lean | 2 +- .../FinitePlaceTensorNormSubgroup.lean | 2 +- .../HasseArf/InverseHerbrandFunction.lean | 6 +- .../GlobalInfinitePlaceHilbertSymbol.lean | 2 +- .../LocalClassFieldTheory/FieldNormHom.lean | 2 +- .../NormTheorems/IsNormAtFinitePlace.lean | 2 +- .../NormTheorems/IsNormAtInfinitePlace.lean | 4 +- .../CyclicIdeleClassNormIndex.lean | 21 +- .../ClassFieldAxiom/HasseNormPrinciple.lean | 23 +- .../ArchimedeanPowerIndex.lean | 14 +- .../FinitePlacePowerIndex.lean | 8 +- .../LocalResidueArithmetic.lean | 10 +- .../NormContainment.lean | 4 +- .../PrimePowerKummerIndex.lean | 6 +- .../SupportedIdeleIndex.lean | 8 +- .../SupportedPrincipalQuotient.lean | 21 +- .../IdelePowerLocalUnitNormContainment.lean | 18 +- .../IdelePowerLocalUnitSubgroup.lean | 9 +- .../KummerLocalNormContainment.lean | 8 +- .../ClassFieldAxiom/MathlibNormInterface.lean | 8 +- .../BasePlaceSelection.lean | 12 +- .../SUnitKummerPrimeSelection/Conclusion.lean | 4 +- .../CoordinatePlaces.lean | 8 +- .../DecompositionFields.lean | 6 +- .../FinitePlaceDecomposition.lean | 8 +- .../SUnitKummerPrimeSelection/PrimeSet.lean | 5 +- .../RestrictionKernel.lean | 8 +- .../ClassFieldAxiom/SUnitLocalPowerMap.lean | 6 +- .../SupportedIdelePowerLocalUnitQuotient.lean | 10 +- .../CofinitelySplitFiniteExtension.lean | 5 +- .../CyclicPrimePowerFullDecomposition.lean | 11 +- .../IdeleClassHerbrandSupportedFinal.lean | 29 +- .../AbelianConductorExactness.lean | 23 +- .../AbelianConductorRamification.lean | 7 +- .../AbelianLocalConductorComparison.lean | 11 +- .../AbelianNormConductor.lean | 6 +- .../ArithmeticClassFieldCorrespondence.lean | 11 +- ...rithmeticHilbertClassFieldReciprocity.lean | 19 +- .../ArithmeticRayClassFieldReciprocity.lean | 10 +- .../ArithmeticUnramifiedPrimeArtin.lean | 11 +- .../BigHilbertClassFieldMathlibArtin.lean | 23 +- .../BigHilbertClassFieldNaturality.lean | 24 +- .../BigHilbertClassFieldOverOriginalBase.lean | 13 +- .../ClassFieldRealization.lean | 2 +- ...osedFiniteIndexClassFieldConstruction.lean | 10 +- .../ClosedFiniteIndexClassFieldNormRange.lean | 8 +- ...sedFiniteIndexClassFieldOriginalField.lean | 12 +- .../Algebraic/Construction.lean | 4 +- .../Algebraic/Evaluation.lean | 4 +- .../Degree.lean | 3 +- .../GlobalNormResidue.lean | 6 +- .../Topological/Construction.lean | 4 +- .../Topological/Evaluation.lean | 3 +- .../Topological/EvaluationValue.lean | 4 +- .../GlobalClassFields/Conductor.lean | 23 +- .../ConductorInfinitePart.lean | 14 +- .../GlobalClassFields/ConductorLattice.lean | 15 +- .../ConductorLocalComparison.lean | 14 +- .../ConductorRayClassMaximality.lean | 3 - .../CyclicConductorUniqueness.lean | 1 - .../CyclotomicKummerNormDescent.lean | 43 +- .../FiniteAbelianClassFieldContainment.lean | 29 +- ...FiniteAbelianClassFieldCorrespondence.lean | 2 +- ...elianClassFieldCorrespondenceTopology.lean | 21 +- .../FiniteIndexNormClassField.lean | 26 +- .../FinitePlaceArtinQuotient.lean | 9 +- .../FullConductorRayClassField.lean | 3 +- .../HilbertClassFieldComparison.lean | 2 - .../HilbertClassFieldMaximalSubextension.lean | 1 - .../HilbertClassFieldRealization.lean | 22 +- .../BigActual.lean | 12 +- .../BigOriginal.lean | 12 +- .../SmallActual.lean | 12 +- .../SmallOriginal.lean | 12 +- .../Transport.lean | 10 +- .../HilbertNormCharacterization.lean | 1 - ...finiteAbelianClassFieldCorrespondence.lean | 11 +- .../GlobalClassFields/KummerNormDescent.lean | 4 +- .../MathlibGlobalReciprocity.lean | 6 +- .../GlobalClassFields/NormConductor.lean | 41 +- .../NormRayClassMaximality.lean | 1 - .../GlobalClassFields/NormTowerConductor.lean | 2 - .../PowerCongruenceCore.lean | 4 +- .../PublicIdealArtinKernelComparison.lean | 8 +- .../PublicIdealNormArtinKernel.lean | 7 +- .../PublicIdealNormQuotientComparison.lean | 6 +- .../PublicRayClassComparison.lean | 27 +- .../RationalRayPrimeClass.lean | 13 +- .../RayClassFieldRealization.lean | 47 +- .../RayClassModulusProjection.lean | 16 +- .../GlobalClassFields/RayClassPrimeIdele.lean | 3 - .../RayClassSubgroupFieldAntitone.lean | 4 +- .../RayClassSubgroupPrimeArtin.lean | 7 +- .../RayFrobeniusRigidity.lean | 7 +- .../GlobalClassFields/RayPrimeGeneration.lean | 3 +- .../SUnitKummerNormCore.lean | 11 +- .../SUnitKummerNormRealization.lean | 4 +- .../SmallHilbertClassField.lean | 1 - .../SmallHilbertClassFieldMathlibArtin.lean | 16 +- .../SmallHilbertClassFieldNaturality.lean | 1 - ...mallHilbertClassFieldOverOriginalBase.lean | 13 +- .../SmallHilbertNormCharacterization.lean | 1 - .../UnramifiedPrimeArtin.lean | 10 +- .../UnramifiedPrimeNormClass.lean | 11 +- .../ArithmeticIdealArtin.lean | 16 +- .../ArithmeticIdealDecompositionLaw.lean | 6 +- .../IdealClassFieldTheory/IdealArtinMap.lean | 1 - .../IdealArtinQuotient.lean | 2 - .../IdealDecompositionLaw.lean | 18 +- .../IdealClassFieldTheory/IdealFrobenius.lean | 6 +- .../IdealNormArtinExactness.lean | 24 +- .../PrincipalIdealTheorem.lean | 1 - .../PrincipalIdealTransfer.lean | 28 +- .../MembershipTypes.lean | 10 +- .../SmallHilbertPrincipalization.lean | 30 +- .../SmallHilbertTowerRealization.lean | 69 ++- .../AbstractFixedFieldGlobalNormResidue.lean | 8 +- .../Reciprocity/ArithmeticNormalization.lean | 10 +- .../InfinitePlaceCompatibility.lean | 30 +- .../InfinitePlaceOverfield.lean | 62 ++- .../NumberFieldComplexification.lean | 65 ++- .../OverextensionArtin.lean | 30 +- .../RamifiedOverextension.lean | 25 +- .../RationalComplexification.lean | 42 +- .../CyclotomicAbstractFixedFieldArtin.lean | 59 ++- .../CyclotomicIdeleClassValuation.lean | 13 +- .../Reciprocity/CyclotomicIdeleValue.lean | 4 +- .../CyclotomicIdeleValueTopology.lean | 1 - .../Reciprocity/CyclotomicPrincipalIdele.lean | 53 ++- ...lotomicUnramifiedGeometricRestriction.lean | 2 + ...micUnramifiedLocalGlobalCompatibility.lean | 3 + .../Reciprocity/CyclotomicZHatBaseChange.lean | 34 +- .../Reciprocity/FiniteGaloisRealization.lean | 1 - .../FiniteGaloisRealizationNormQuotient.lean | 1 - .../Reciprocity/FiniteIdeleArtin.lean | 21 +- .../Reciprocity/FiniteLocalFamily.lean | 12 +- .../FinitePlaceAdicHilbertComparison.lean | 10 +- .../FinitePlaceAdicLocalField.lean | 3 + .../FinitePlaceArtin/Conjugation.lean | 13 +- .../FinitePlaceArtin/Construction.lean | 53 ++- .../Reciprocity/FinitePlaceArtin/Core.lean | 11 +- .../CrossLocalRestriction.lean | 29 +- .../FinitePlaceArtin/NormRestriction.lean | 138 +++++- .../FinitePlaceArtin/TowerRestriction.lean | 18 +- .../UnramifiedNormalization.lean | 4 +- .../FinitePlaceCyclotomicFrobeniusLift.lean | 8 +- .../Reciprocity/GlobalArtin.lean | 15 +- .../Reciprocity/GlobalArtinCompatibility.lean | 15 +- ...GlobalArtinFiniteSupportApproximation.lean | 17 +- .../Reciprocity/GlobalHilbertSymbol/Core.lean | 21 +- .../FinitePlaceCharacterComparison.lean | 65 ++- .../FinitePlaceComparison.lean | 14 +- .../FinitePlaceFiniteSupport.lean | 3 +- .../FinitePlaceLocalGlobal.lean | 18 +- .../GlobalHilbertSymbol/InfinitePlace.lean | 6 +- .../InfinitePlaceCharacter.lean | 8 +- .../InfinitePlaceNegative.lean | 4 +- .../InfinitePlaceNegativeRoot.lean | 3 +- .../InfinitePlaceNegativeUnit.lean | 7 +- .../InfinitePlacePositive.lean | 4 +- .../InfinitePlaceRamification.lean | 3 +- .../InfinitePlaceRealComparison.lean | 6 +- .../InfinitePlaceRealSquare.lean | 4 +- .../Reciprocity/GlobalNormResidue.lean | 1 - .../GlobalNormResidueAbelianization.lean | 3 - ...alNormResidueAbelianizationNaturality.lean | 2 +- .../GlobalNormResidueNaturality.lean | 2 +- .../Reciprocity/HilbertProductFormula.lean | 6 +- .../IdeleClassDirectLimitCore.lean | 1 - .../IdeleClassDirectLimitExtension.lean | 12 +- .../IdeleClassDirectLimitExtensionNorm.lean | 8 +- .../IdeleClassDirectLimitFiniteLevel.lean | 3 +- .../IdeleClassDirectLimitFiniteLevelCore.lean | 6 +- ...leClassDirectLimitFiniteTowerNormCore.lean | 12 +- ...eClassDirectLimitFiniteTowerNormProof.lean | 7 + .../IdeleClassDirectLimitNormQuotient.lean | 2 +- .../Reciprocity/InfiniteGlobalArtin.lean | 41 +- .../InfiniteGlobalArtinDescent.lean | 10 +- .../InfiniteGlobalArtinSurjectivity.lean | 17 +- ...InfiniteLocalGlobalArtinCompatibility.lean | 1 - .../Reciprocity/InfinitePlaceArtin.lean | 29 +- .../FinitePadicAuxiliaryField.lean | 24 +- .../SeparableClosurePadicLift.lean | 2 +- .../MathlibHilbertProductFormula.lean | 4 +- .../MaximalAbelianGlobalArtin.lean | 8 +- .../Reciprocity/MaximalAbelianKernel.lean | 9 +- .../Reciprocity/PowerResidueReciprocity.lean | 130 +++++- .../Reciprocity/ProductFormula.lean | 10 +- .../RationalCyclotomicArithmeticProduct.lean | 46 +- .../RationalCyclotomicCharacterRigidity.lean | 8 +- .../RationalCyclotomicFinitePlaceArtin.lean | 287 +++++++++++- .../RationalCyclotomicLocalization.lean | 1 - ...ationalCyclotomicPrincipalAwayProduct.lean | 51 ++- ...ationalCyclotomicPrincipalPrimeFactor.lean | 8 +- .../RationalCyclotomicPrincipalProduct.lean | 29 +- .../RationalCyclotomicRayNorm.lean | 27 +- .../RationalCyclotomicZHatRigidity.lean | 9 +- .../RationalPrimeFactorization.lean | 51 ++- .../RationalPrincipalLocalUnit.lean | 23 +- ...ionalQuadraticPowerResidueReciprocity.lean | 69 ++- ...ogicalGlobalNormResidueAbelianization.lean | 2 +- .../ClassFieldTheory/HasseArf.lean | 29 +- .../GlobalPadicPrimePowInertiaBound.lean | 3 +- ...tionalCyclotomicArithmeticReciprocity.lean | 27 +- .../RationalRayClassFieldCyclotomic.lean | 66 ++- .../KroneckerWeber/Setup.lean | 4 +- .../Concrete/CyclotomicPrimeBaseChange.lean | 4 +- .../Concrete/FinitePlaceDecomposition.lean | 5 +- .../Concrete/SUnitKummerUnramified.lean | 11 +- .../Concrete/SUnitPreparation/Core.lean | 9 +- .../EnlargedSUnitRestriction.lean | 21 +- .../FiniteRadicalSupport.lean | 26 +- .../FullSUnitKummerExtension.lean | 19 +- .../SUnitLocalPowerKernel.lean | 16 +- .../SUnitPreparation/SUnitPowerQuotient.lean | 32 +- .../SimpleExtensionLocalBehavior.lean | 13 +- .../ArchimedeanNormQuotient.lean | 29 +- .../ClassFormation/CohomologyBridge.lean | 6 +- .../ClassFormation/LocalBlocks/Family/H0.lean | 2 +- .../LocalBlocks/Family/HMinusOne.lean | 2 +- .../LocalBlocks/FamilyClassAxiom.lean | 15 +- .../ClassFormation/LocalBlocks/Tensor.lean | 16 +- .../LocalBlocks/TensorNorm.lean | 8 +- .../ClassFormation/NormalBasis.lean | 6 +- .../NormalBasisFiniteQuotient.lean | 3 +- .../NormalBasisGaloisAction.lean | 3 +- .../NormalBasisGradedLifting.lean | 3 +- .../NormalBasisInfiniteProduct.lean | 12 +- .../NormalBasisRecursiveLifting.lean | 6 +- .../ClassFormation/PrincipalUnitGraded.lean | 6 +- .../ClassFormation/Valuation.lean | 3 +- .../ClassFormation/ValueGroupCohomology.lean | 3 +- .../Finite/CyclotomicNorm/PrincipalUnits.lean | 109 +++-- .../Finite/Existence/CharacteristicZero.lean | 8 +- .../Finite/Existence/EqualCharacteristic.lean | 8 +- .../Existence/FiniteUnramifiedField.lean | 4 +- .../Existence/NormSubgroupRingEquiv.lean | 1 + .../Existence/NormSubgroupSurjectivity.lean | 5 +- .../Existence/UnramifiedNormSubgroup.lean | 8 +- .../AbstractFixedFieldNorm.lean | 3 +- .../ConcreteReciprocityCanonical.lean | 3 +- .../ConcreteReciprocityPrimeNorm.lean | 15 +- .../ConcreteReciprocityTransport.lean | 3 +- .../ConjugationNaturality.lean | 17 +- .../Filtered/FiniteAbelian.lean | 16 +- .../FiniteAbstractFixedField.lean | 10 +- .../FiniteGaloisRealization.lean | 3 +- .../FiniteResidueFrobenius.lean | 2 - .../FiniteSubgroupResidueDegree.lean | 4 + .../FixedFieldContinuousNaturality.lean | 16 +- .../AmbientNormResidue.lean | 8 +- .../AmbientPrimeNormTransport.lean | 2 +- .../EmbeddedExtensionQuotient.lean | 3 +- .../EmbeddedInertiaComparison.lean | 3 +- .../FixedFieldNormQuotient.lean | 5 +- .../FixedFieldSpecialization.lean | 3 +- .../IntrinsicBaseEquivalence.lean | 5 +- .../EmbeddedFrobeniusTransport.lean | 4 +- .../NormRestriction.lean | 2 +- .../PrimeComparison.lean | 54 ++- .../LocalReciprocity/FixedFieldLocalData.lean | 1 + .../FixedFieldRelativeNorm.lean | 4 +- ...ntermediateFieldNormResidueNaturality.lean | 3 +- .../IntrinsicAbsoluteData.lean | 2 + .../LocalReciprocity/LocalResidueDatum.lean | 2 + .../Finite/LocalReciprocity/Main.lean | 3 +- .../LocalReciprocity/MathlibInterface.lean | 4 + .../Finite/LocalReciprocity/NormResidue.lean | 4 +- .../ResidueAbsoluteFrobenius.lean | 1 - .../SeparableFixedFieldNorm.lean | 4 +- .../SeparableNormProduct.lean | 3 +- .../LocalReciprocity/SeparableUnitsNorm.lean | 3 +- .../TopologicalReciprocity.lean | 22 +- .../UnramifiedNormalization.lean | 21 +- .../UnramifiedReciprocity.lean | 2 +- .../UnramifiedResidueUniqueness.lean | 3 +- .../LocalReciprocity/ValuationSemilinear.lean | 3 +- .../Finite/Unramified/All.lean | 3 +- .../Finite/Unramified/Norm.lean | 9 +- .../Finite/Unramified/PrincipalUnits/All.lean | 3 +- .../Unramified/PrincipalUnits/Basic.lean | 3 +- .../Unramified/PrincipalUnits/Lift.lean | 16 +- .../Unramified/PrincipalUnits/NormSide.lean | 14 +- .../Unramified/PrincipalUnits/Trace.lean | 7 +- .../Finite/Unramified/ResidueNorm.lean | 12 +- .../Finite/UnramifiedConductor.lean | 4 +- .../Infinite/AbsoluteArtin.lean | 1 - .../Infinite/AbsoluteFiniteQuotients.lean | 2 + ...AbstractProfiniteCompletionComparison.lean | 2 +- .../Infinite/FiniteReciprocityDiagram.lean | 2 + .../LocalMultiplicativeCompletion.lean | 18 +- .../Infinite/ProfiniteCompletion.lean | 4 +- .../Infinite/ProfiniteLocalReciprocity.lean | 6 +- .../LocalHilbertPairingNondegeneracy.lean | 2 - .../Kummer/MaximalLocalKummerPairing.lean | 1 - .../Kummer/PowerResidueTameFormula.lean | 25 +- .../LubinTateTransport.lean | 6 +- .../StandardArtinComparison.lean | 2 +- .../Unramified/CanonicalExtension.lean | 70 +-- .../CompletedLevel/ChangedCompletedLevel.lean | 27 +- .../ChangedCompletedPrimitiveAction.lean | 7 +- .../ChangedPolynomialEvaluation.lean | 2 +- .../CompletedLevel/ChangedUniformizer.lean | 11 +- .../CompletedFrobeniusBaseEquiv.lean | 10 +- .../CompletedFrobeniusContinuity.lean | 10 +- .../CompletedFrobeniusFixedField.lean | 7 +- .../CompletedFrobeniusFixedFieldAlgebra.lean | 7 +- ...FrobeniusFixedFieldCoefficientDescent.lean | 4 + .../CompletedFrobeniusFixedFieldDegree.lean | 13 +- ...ompletedFrobeniusFixedFieldGeneration.lean | 4 + ...ompletedFrobeniusFixedFieldPowerBasis.lean | 2 + ...CompletedFrobeniusFixedFieldPrimitive.lean | 5 +- .../CompletedFrobeniusFixedNorm.lean | 13 +- .../CompletedFrobeniusLift.lean | 1 + .../CompletedLevel/CompletedLevel.lean | 23 +- .../CompletedPrimitiveAction.lean | 3 +- .../CompletedPrimitiveIrreducible.lean | 5 +- .../DirectBracketAtCompletedLevel.lean | 11 +- .../DirectLubinTateBracket.lean | 3 +- .../DirectLubinTateBracketRecursion.lean | 3 +- .../DirectTargetLevelEmbedding.lean | 6 +- .../DirectThetaAtCompletedLevel.lean | 6 +- .../DirectThetaFrobeniusFixed.lean | 12 +- .../CompletedLevel/ThetaAtCompletedLevel.lean | 4 + .../CompletedLevel/ThetaLocalInverse.lean | 2 + .../Existence/LaurentLocalField.lean | 2 +- .../Existence/LaurentModel.lean | 2 - .../FiniteLevel/DivisionPolynomial.lean | 6 +- .../FiniteLevel/FreeRankOne.lean | 14 +- .../FiniteLevel/PrimitiveIrreducible.lean | 3 +- .../FormalModule/AmbientBracketAction.lean | 1 - .../FormalModule/LubinTateAction.lean | 1 - .../FormalModule/LubinTateEndomorphism.lean | 2 +- .../Frobenius/CoefficientFrobenius.lean | 10 +- .../Frobenius/CompletedUnramifiedField.lean | 11 +- .../Frobenius/LaurentSeriesFrobenius.lean | 21 +- .../HigherUnitFixedFieldEmbedding.lean | 3 +- .../HigherUnitFixedFieldEquiv.lean | 3 +- .../HigherUnitFixedFieldMembership.lean | 9 +- .../HigherUnitFixedFieldSurjective.lean | 3 +- .../HigherUnitFrobeniusFixed.lean | 5 +- .../NormSubgroup/HigherUnitLevelMapFixed.lean | 9 +- .../NormSubgroup/HigherUnits.lean | 9 +- .../NormSubgroup/HigherUnitsNorm.lean | 3 +- .../NormSubgroup/LevelAlgebra.lean | 6 +- .../NormSubgroup/UniformizerNorm.lean | 2 +- .../NormSubgroup/UnitTransport.lean | 3 +- .../Ramification/DisplacementValuation.lean | 2 +- .../Ramification/LowerGroups.lean | 3 +- .../Ramification/PrimitivePoint.lean | 10 +- .../Theta/ThetaEvaluation.lean | 1 + .../Theta/ThetaFirstIdentity.lean | 3 +- .../Theta/ThetaSeries.lean | 6 +- .../FiniteLevel/ChangedLevelCompositum.lean | 5 +- .../FiniteLevel/DivisionPolynomial.lean | 1 - .../FiniteParameterFiltration.lean | 6 +- .../FiniteLevel/FiniteParameters.lean | 2 +- .../LubinTate/FiniteLevel/LevelAbelian.lean | 1 - .../LubinTate/FiniteLevel/LevelValuation.lean | 3 +- .../LubinTate/FiniteLevel/PrimitiveRoot.lean | 3 +- .../FormalModule/DegreeStabilization.lean | 52 ++- .../FormalModule/RecursiveCorrection.lean | 27 +- .../LubinTate/FormalModule/Reduction.lean | 7 +- .../FormalModule/StandardFormalGroup.lean | 17 +- .../Padic/ChangedUniformizerCoefficient.lean | 1 - .../CompletedSeries.lean | 3 +- .../DefectCorrection.lean | 3 +- .../IntertwinerConstruction.lean | 7 +- .../ScalarCompatibility.lean | 3 +- .../ScalarEndomorphisms.lean | 4 +- .../CompletedChangedStandardCompositum.lean | 2 +- .../CompletedChangedStandardResidue.lean | 8 +- ...CompletedChangedUniformizerFixedField.lean | 4 + .../LubinTate/Padic/CompletedLevel.lean | 9 +- .../Padic/CompletedResidueFrobenius.lean | 1 - .../Padic/CompletedUnramifiedField.lean | 1 - .../CompletedCoefficientEvaluation.lean | 2 +- .../Dedekind/PadicValuationInertia.lean | 10 +- .../RamificationIndexComparison.lean | 2 +- .../EmbedsInRayClassFieldIffConductorLe.lean | 3 +- .../ExistsRayArtinModulusProjection.lean | 8 +- .../FractionalIdealNormPrimeExponent.lean | 3 +- .../RayArtinModulusProjection.lean | 9 +- .../RayClassFieldDegree.lean | 3 +- .../RayClassFieldPrimeSplitting.lean | 3 +- .../RayClassFieldReciprocity.lean | 3 +- ...sIdealArtinKerEqNormRangeSupPrincipal.lean | 3 +- ...ClassIdealModulusProjectionSurjective.lean | 7 +- .../RayClassIdealNormImageEqArtinKer.lean | 3 +- .../RayClassSubgroupEmbedding.lean | 6 +- .../RayClassSubgroupExistence.lean | 3 +- .../RayClassSubgroupPrimeSplitting.lean | 3 +- .../RayClassSubgroupQuotientEquivMk.lean | 1 - .../RayPrincipalIdealPrimeTo.lean | 3 +- .../BigHilbertClassFieldArtinEquiv.lean | 5 +- .../BigHilbertClassFieldDegree.lean | 3 +- .../BigHilbertClassFieldPrimeSplitting.lean | 3 +- ...sFieldPrimeSplittingPositivePrincipal.lean | 3 +- .../SmallHilbertClassFieldArtinEquiv.lean | 5 +- .../SmallHilbertClassFieldPrimeSplitting.lean | 3 +- ...niteAbelianReciprocityQuotientEquivMk.lean | 1 - .../FinitePlaceCompletionLocalArtin.lean | 2 +- .../RealLowerRamificationGroupCanonical.lean | 6 +- .../UpperRamificationGroupEventuallyBot.lean | 3 +- ...nLocalReciprocityQuotientEquivOfArtin.lean | 2 +- .../CompletionTensorNormDecomposition.lean | 4 +- ...etionTensorNormDecompositionCanonical.lean | 4 +- .../ComplexInfinitePlaceAllNorm.lean | 2 +- .../GlobalNormIsEverywhereLocalNorm.lean | 2 +- .../NormTheorems/TensorNormBaseChange.lean | 2 +- .../Cyclic/GaloisCohomology.lean | 4 +- .../Herbrand/HerbrandLowDegree/Basic.lean | 4 +- .../Herbrand/HerbrandLowDegree/Product.lean | 4 +- .../HerbrandLowDegree/TateComparison.lean | 9 + .../Cyclic/Herbrand/Induced.lean | 22 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 36 +- .../Cyclic/Herbrand/Permutation/Lattice.lean | 19 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 8 +- .../Cyclic/Herbrand/Permutation/Module.lean | 19 +- .../Herbrand/PrincipalUnits/QuotientReps.lean | 3 +- .../PrincipalUnits/QuotientTower.lean | 5 +- .../Cyclic/Herbrand/Product.lean | 4 +- .../Cyclic/NormKernelVanishing.lean | 15 +- .../GroupTheory/Augmentation.lean | 1 - .../GroupTheory/Quotient.lean | 2 - .../Transfer/RelativeAugmentation.lean | 5 +- .../GroupTheory/Transfer/Witt.lean | 38 +- .../Abstract/KummerAbelianAssembly.lean | 3 +- .../Abstract/KummerAbelianCyclicFactors.lean | 3 +- .../Kummer/Abstract/KummerCyclicOperator.lean | 6 +- .../Kummer/Abstract/KummerGlobalOperator.lean | 3 +- .../Kummer/Concrete/FiniteCharacterEquiv.lean | 3 +- .../Kummer/Concrete/FiniteSupport.lean | 2 +- .../Kummer/Concrete/InfiniteContinuity.lean | 2 +- .../Kummer/Concrete/RadicalExtension.lean | 4 +- .../Kummer/Concrete/RadicalQuotient.lean | 2 +- .../Kummer/Concrete/RestrictedFinite.lean | 2 +- .../Kummer/Concrete/RootCharacters.lean | 4 +- .../PrimePowerKernelCoordinates.lean | 14 +- .../Kummer/Concrete/SimpleExtensionNorm.lean | 63 ++- .../CyclotomicTorsionQuotient.lean | 3 +- .../ProfiniteIntegers/ProfiniteInteger.lean | 3 - .../TotallyDisconnectedQuotients.lean | 4 +- .../LocalField/Analytic/Arithmetic.lean | 3 +- .../Analytic/ContinuousFieldUnitLog.lean | 81 ++-- .../Analytic/DenominatorValuation.lean | 2 +- .../Analytic/FieldUnitLogExtension.lean | 66 ++- .../LocalField/Analytic/LogExpAdditivity.lean | 20 +- .../LocalField/Analytic/LogExpContinuity.lean | 78 ++-- .../Analytic/LogExpSeries/ExpConvergence.lean | 6 +- .../Analytic/LogExpSeries/FormalProduct.lean | 3 +- .../Analytic/LogExpSeries/Homomorphisms.lean | 263 ++++++----- .../LogExpSeries/InverseEstimates.lean | 3 +- .../LogExpSeries/PrincipalUnitExp.lean | 67 ++- .../LogExpSeries/PrincipalUnitLog.lean | 152 ++++--- .../Analytic/LogExpSeries/SeriesTerms.lean | 3 +- .../Analytic/PrincipalUnitExpLogEquiv.lean | 11 +- .../EqualCharacteristicLaurent.lean | 97 ++-- .../DiscreteValuationField/FieldNorm.lean | 18 +- .../FieldUnitDecomposition.lean | 201 +++++---- .../FieldUnitFactors.lean | 28 +- .../FieldUnitPowerIndexFormulas.lean | 21 +- .../FieldUnitStructure.lean | 19 +- .../FiniteCoefficientLaurent.lean | 5 +- .../IwasawaPrincipalUnits.lean | 414 ++++++++++++------ .../MixedCharacteristicQp.lean | 176 +++++--- .../MixedCharacteristicStructure/Core.lean | 81 ++-- .../DeepPrincipalUnits.lean | 102 +++-- .../IntegralLattice.lean | 163 ++++--- .../DiscreteValuationField/Norm/Basic.lean | 16 +- .../Norm/Quotients.lean | 87 ++-- .../NormFiltration.lean | 26 +- .../DiscreteValuationField/PadicField.lean | 3 +- .../PadicModuleStructure.lean | 5 +- .../PadicPowerIndex.lean | 82 +++- .../DiscreteValuationField/PowerIndex.lean | 407 +++++++++++++---- ...PrincipalUnitInverseLimitSurjectivity.lean | 6 +- .../AdicPadicModule.lean | 31 +- .../AdicProdiscreteComparison.lean | 1 - .../PrincipalUnitPadicAction/Core.lean | 49 ++- .../FiniteQuotientPadicModule.lean | 4 +- .../InverseLimitCore.lean | 53 ++- .../InverseLimitTopology.lean | 61 ++- .../ProdiscretePadicModule.lean | 5 +- .../WithZeroValuationTopology.lean | 18 +- .../PrincipalUnits/AutomorphismTransport.lean | 2 +- .../PrincipalUnits/Core.lean | 6 +- .../PrincipalUnits/ResidueQuotient.lean | 2 +- .../PrincipalUnits/ResidueRoots.lean | 2 +- .../TeichmullerDecomposition.lean | 2 +- .../DiscreteValuationField/Units.lean | 110 ++--- .../CompleteRangeRestriction.lean | 44 +- .../LocalFieldRangeRestriction.lean | 9 +- .../RangeRestrictedTopology.lean | 51 ++- .../UniformizerIntegerValuation.lean | 37 +- .../ValuationSubringUnitMap.lean | 3 +- .../ValuedExtensionUnitMap.lean | 9 +- .../DiscreteValuationField/ValueGroup.lean | 9 +- .../WithZeroValuationTopology.lean | 12 +- .../GroupTheory/ContinuousQuotientEquiv.lean | 2 +- .../GroupTheory/IntegerMultipleSubgroup.lean | 4 +- .../LocalField/GroupTheory/PowerIndex.lean | 28 +- .../NonarchimedeanLocalField/Basic.lean | 2 - .../GaloisIntegerRing.lean | 3 +- .../IdealQuotients.lean | 1 - .../MultiplicativeDecomposition.lean | 1 - .../NonarchimedeanLocalField/Norm.lean | 3 +- .../NormSubgroupFunctoriality.lean | 4 +- .../PowerClassFiniteness.lean | 4 +- .../PrincipalUnitQuotients.lean | 10 +- .../ProfiniteUnits.lean | 2 +- .../ResidueExtension.lean | 3 +- .../SeparableNormValuation.lean | 4 +- .../UniformizerPrincipalQuotient.lean | 6 +- .../UnramifiedFrobenius.lean | 10 +- .../ValuationExactSequence.lean | 9 +- .../ValuedTopology.lean | 2 +- .../TotallyRamified/EisensteinPolynomial.lean | 3 +- .../TotallyRamified/EisensteinRelation.lean | 1 + .../Cyclotomic/TotallyRamified/Existence.lean | 4 +- .../TotallyRamified/IntegralClosure.lean | 1 + .../TotallyRamified/IntegralTranslate.lean | 1 + .../TotallyRamified/PrimeElement.lean | 1 + .../TotallyRamified/RamificationIndex.lean | 4 +- .../TotallyRamified/ValuationRingEquiv.lean | 6 +- .../Unramified/ArithmeticFrobenius.lean | 117 ++--- .../LocalField/Padic/PrincipalUnits.lean | 76 ++-- .../LocalField/Padic/UnitDecomposition.lean | 8 +- .../LocalField/Unramified/BaseChangeCore.lean | 82 ++-- .../Unramified/BasicInvariants.lean | 42 +- .../LocalField/Unramified/Definitions.lean | 69 ++- .../LocalField/Unramified/FiniteSupport.lean | 9 +- .../HenselianAlgebraicExtension.lean | 6 +- .../LocalField/Unramified/MaximalResidue.lean | 6 +- .../Unramified/MaximalSubextension.lean | 24 +- .../Unramified/RamificationIndexTower.lean | 2 +- .../Unramified/ResidueEmbedding.lean | 15 +- .../LocalField/Unramified/ResidueLifting.lean | 12 +- .../LocalField/Unramified/Separable.lean | 107 ++--- .../Ramification/Different.lean | 103 +++-- .../AbsoluteGalois/AbsoluteRamification.lean | 63 ++- .../FiniteExtensionCorrespondence.lean | 32 +- .../FiniteLevelValuationRestriction.lean | 2 +- .../InfiniteGaloisCorrespondence.lean | 14 +- .../GaloisValuation/Ramification.lean | 24 +- .../Ramification/Herbrand/Average.lean | 29 +- .../Ramification/Herbrand/FixedField.lean | 39 +- .../Ramification/Herbrand/Function.lean | 2 + .../Ramification/Herbrand/Quotient.lean | 21 +- .../Ramification/Herbrand/Tower.lean | 10 +- .../AbsoluteValueConjugacy.lean | 10 +- .../AlgebraicLocalization.lean | 10 +- .../HilbertRamification/BaseChange.lean | 48 +- .../HilbertRamification/CharacterMap.lean | 18 +- .../HilbertRamification/CompleteDVF.lean | 2 - .../DecompositionField.lean | 2 +- .../DecompositionFieldLocalization.lean | 90 ++-- .../DecompositionGroup.lean | 6 +- .../HilbertRamification/Dedekind/Basic.lean | 22 +- .../Dedekind/CompositumUnramified.lean | 10 +- .../Dedekind/FixedFieldTower.lean | 30 +- .../Dedekind/FixedFields.lean | 6 +- .../Dedekind/NumberFieldPrimes.lean | 12 +- .../Dedekind/PrimeContractions.lean | 5 +- .../Dedekind/TowerInvariants.lean | 4 +- .../FiniteGaloisLevelIndependence.lean | 34 +- .../FiniteOrderValuation.lean | 3 +- .../FixedFieldRamificationIndex.lean | 2 +- .../FixedFieldValuationRing.lean | 2 +- .../HilbertRamification/HerbrandFunction.lean | 49 ++- .../HilbertRamification/HerbrandTheorem.lean | 53 ++- .../LocalizationDensity.lean | 49 ++- .../LocalizationRamificationGroups.lean | 127 +++--- .../HilbertRamification/Monogeneity.lean | 4 +- .../RamificationCharacterization.lean | 2 +- .../RamificationGroup.lean | 4 +- .../RamificationNumberFormula.lean | 34 +- .../RamificationNumberRestriction.lean | 3 +- .../ResidueExactSequence.lean | 2 +- .../UniformizerGradedHom.lean | 2 +- .../HilbertRamification/ValuationSubring.lean | 48 +- .../Ramification/LocalField/Core.lean | 65 +-- .../FirstRamificationComparison.lean | 3 +- .../AlgebraicExtension/Core.lean | 4 +- .../FiniteNormExtension.lean | 36 +- .../NormFormulaAbsoluteValue.lean | 20 +- .../NormFormulaCoefficients.lean | 6 +- .../NormFormulaExtension.lean | 10 +- .../NormFormulaIntegralClosure.lean | 3 +- .../RamificationInvariants.lean | 97 ++-- .../UniqueExtensionCoefficients.lean | 3 +- .../Valuation/AbsoluteValue/Completeness.lean | 2 +- .../Valuation/AbsoluteValue/Completion.lean | 2 - .../AbsoluteValue/ExponentialValuation.lean | 6 +- .../AbsoluteValue/Theory/AbsoluteValues.lean | 56 ++- .../Valuation/AbsoluteValue/Theory/Core.lean | 27 +- .../Theory/ExponentialValuations.lean | 25 +- .../Completion/AbsoluteValueExtensions.lean | 370 ++++++++-------- .../Completion/CanonicalTensorMap.lean | 16 +- .../Valuation/Completion/DegreeNormTrace.lean | 27 +- .../ExtensionFactorClassification.lean | 314 ++++++------- .../Completion/ExtensionInvariants.lean | 21 +- .../Completion/FiniteLocalization.lean | 18 +- .../TensorProductDecomposition.lean | 111 ++--- .../TensorProductProductFormulas.lean | 2 +- .../CompleteDVRExpansion.lean | 3 +- .../DiscreteValuationField/Extensions.lean | 2 +- .../FiniteExtension/Core.lean | 11 +- .../FiniteExtension/Uniqueness.lean | 22 +- .../FiniteIntegralClosure.lean | 4 +- .../IntegralClosure.lean | 2 +- .../DiscreteValuationField/ResidueField.lean | 1 - .../Valuation/Henselian/Complete.lean | 3 +- .../Henselian/Factorization/AdicLimits.lean | 26 +- .../Henselian/Factorization/Assembly.lean | 8 +- .../Factorization/CoefficientMinimum.lean | 50 +-- .../Factorization/FiniteApproximation.lean | 40 +- .../Factorization/InfiniteApproximation.lean | 186 ++++---- .../Henselian/Factorization/Iteration.lean | 108 ++--- .../Factorization/PrincipalLimits.lean | 68 +-- .../Henselian/Factorization/Step.lean | 34 +- .../Henselian/Factorization/Truncation.lean | 68 +-- .../Henselian/Factorization/WeakLimits.lean | 52 +-- .../IrreduciblePolynomialBounds.lean | 3 +- .../IrreduciblePolynomialLifting.lean | 3 +- .../Henselian/MonicFactorization.lean | 205 +++++---- .../Henselian/PrimitiveFactorization.lean | 3 +- .../Henselian/UniqueAlgebraicExtensions.lean | 6 +- .../ValuationExtensionCriterion.lean | 3 +- .../Valuation/LocalRingEquiv.lean | 2 +- .../Topology/AdicCompletionInverseLimit.lean | 311 ++++++------- .../AdicCompletionInverseLimitRing.lean | 132 +++--- .../Topology/CompatibleInverseLimit.lean | 3 +- .../Valuation/ValuedAdicComplete.lean | 3 +- 764 files changed, 9671 insertions(+), 4668 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean index 6acf806369..6f46686152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -148,7 +148,7 @@ def residueQuotient (D : DegreeData G) (K : ClosedSubgroup G) : Type := /-- The distinguished base field has absolute residue degree one, without passing through a natural-valued subgroup index. -/ -@[simp] theorem residueDegreeCardinal_baseField (D : DegreeData G) : +theorem residueDegreeCardinal_baseField (D : DegreeData G) : D.residueDegreeCardinal (baseField G) = 1 := by change intersectionIndexCardinal (D.fieldImage (baseField G)) @@ -202,7 +202,7 @@ noncomputable def residueDegree (K : FiniteResidueAbstractField D) : ℕ+ := by rfl /-- Cardinal-to-positive-natural specialization at the finite boundary. -/ -@[simp] theorem residueDegreeCardinal_eq_coe +theorem residueDegreeCardinal_eq_coe (K : FiniteResidueAbstractField D) : D.residueDegreeCardinal K.field = ((K.residueDegree : ℕ) : Cardinal) := by change Cardinal.mk (D.residueQuotient K.field) = @@ -493,7 +493,7 @@ instance extensionSubgroup_normalInstance (L : GaloisSubextension K) : L.normal /-- The group structure transported across the named quotient boundary. -/ -instance extensionQuotient_groupInstance (L : GaloisSubextension K) : +instance extensionQuotientGroupInstance (L : GaloisSubextension K) : Group L.extensionQuotient := by change Group (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) @@ -680,7 +680,8 @@ private theorem relativeDegreeCardinals_lt_aleph0 (D : DegreeData G) : exact Cardinal.mk_ne_zero _ apply (Cardinal.mul_lt_aleph0_iff_of_ne_zero hresidue hramification).mp - rw [← E.toAbstractExtension.degreeCardinal_eq_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal D] + rw [← + E.toAbstractExtension.degreeCardinal_eq_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal D] exact E.degreeCardinal_lt_aleph0 private theorem relativeResidueDegreeCardinal_lt_aleph0 @@ -783,7 +784,7 @@ degree. -/ /-- The relative index of the mapped field subgroups is the positive residue degree of a finite extension. -/ -@[simp] theorem mapped_relIndex_eq_residueDegree (D : DegreeData G) : +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 @@ -791,7 +792,7 @@ degree of a finite extension. -/ /-- The relative index inside the degree kernel is the positive ramification index of a finite extension. -/ -@[simp] theorem inertia_relIndex_eq_ramificationIndex (D : DegreeData G) : +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 @@ -861,7 +862,7 @@ theorem ramificationIndex_eq_degree_of_isTotallyRamified (D : DegreeData G) /-- For a finite extension, its cardinal-valued degree is the cardinal cast of its positive natural degree. -/ -@[simp] theorem degreeCardinal_eq_coe : +theorem degreeCardinal_eq_coe : E.toAbstractExtension.degreeCardinal = ((E.degree : ℕ) : Cardinal) := by change Cardinal.mk diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean index 955fcf3e4b..e36caaafce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean @@ -115,7 +115,8 @@ theorem residueDegree_nsmul_normalizedDegree (D : DegreeData G) 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. -/ +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index afc74b3d89..74d5960412 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -71,7 +71,7 @@ private noncomputable def continuousMulEquivOfBijectiveCompactToT2 subgroup. -/ private theorem exists_openNormalSubgroup_not_mem {A : Type*} [Group A] [TopologicalSpace A] [IsTopologicalGroup A] - [CompactSpace A] [T2Space A] [TotallyDisconnectedSpace 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)ᶜ @@ -305,7 +305,8 @@ def frobeniusExponent (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : 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) +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) : @@ -365,7 +366,6 @@ theorem extensionNormalizedDegreeContinuous_apply (D : DegreeData G) rfl /-- Forgetting continuity recovers the underlying normalized-degree monoid homomorphism. -/ -@[simp] theorem extensionNormalizedDegreeContinuous_toMonoidHom (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) @@ -442,7 +442,7 @@ theorem extensionDegreeKernelRestriction_injective (D : DegreeData G) /-- The extension's inertia subgroup is closed inside its base subgroup. -/ theorem extensionInertiaWithin_isClosed (D : DegreeData G) - [IsTopologicalGroup 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 @@ -495,7 +495,7 @@ instance frobeniusClosure_isTopologicalGroup /-- Defines `frobeniusClosureCommGroup`. -/ @[reducible] def frobeniusClosureCommGroup - (D : DegreeData G) [IsTopologicalGroup G] [T2Space G] + (D : DegreeData G) [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] @@ -595,7 +595,7 @@ theorem frobeniusClosureDegree_generator (D : DegreeData G) `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] [T2Space G] + [IsTopologicalGroup G] [CompactSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] @@ -690,7 +690,8 @@ theorem frobeniusClosureDegree_range (D : DegreeData G) exact hz exact hzy ▸ hzmap -/-- The Frobenius fixed-field residue-degree formula, stated as the index of the normalized degree image: +/-- 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] [T2Space G] @@ -1053,7 +1054,7 @@ theorem frobeniusClosure_index_le_extensionIndex_of_exponent_eq_one /-- The procyclic degree isomorphism: `d_Σ` identifies `Γ` continuously with `ℤ̂`. On the field side its trivial kernel says exactly `\widetilde Σ = \widetilde L`. -/ -def frobeniusFixedField_normalizedDegreeEquiv (D : DegreeData G) +def frobeniusFixedFieldNormalizedDegreeEquiv (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] [TotallyDisconnectedSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) @@ -1086,7 +1087,7 @@ theorem frobeniusFixedField_normalizedDegreeEquiv_apply (D : DegreeData G) [hLnormal : (extensionSubgroup K.field L hLK).Normal] (σ : D.FrobeniusElements K L hLK) (a : D.frobeniusClosure K L hLK σ) : - D.frobeniusFixedField_normalizedDegreeEquiv K L hLK σ a = + D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ a = D.fixedFieldNormalizedDegree K L hLK σ a := rfl @@ -1111,7 +1112,7 @@ def fixedFieldFrobenius (D : DegreeData G) [hLnormal : (extensionSubgroup K.field L hLK).Normal] (σ : D.FrobeniusElements K L hLK) : D.frobeniusClosure K L hLK σ := - (D.frobeniusFixedField_normalizedDegreeEquiv K L hLK σ).symm + (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 @@ -1125,11 +1126,11 @@ theorem frobeniusFixedField_frobenius (D : DegreeData G) (σ : D.FrobeniusElements K L hLK) : D.frobeniusInClosure K L hLK σ = D.fixedFieldFrobenius K L hLK σ := by - apply (D.frobeniusFixedField_normalizedDegreeEquiv K L hLK σ).injective + apply (D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ).injective rw [D.frobeniusFixedField_normalizedDegreeEquiv_apply] rw [D.fixedFieldNormalizedDegree_generator] exact - ((D.frobeniusFixedField_normalizedDegreeEquiv K L hLK σ).apply_symm_apply _).symm + ((D.frobeniusFixedFieldNormalizedDegreeEquiv K L hLK σ).apply_symm_apply _).symm end DegreeData diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean index 8b79d81660..c0b007d13c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean @@ -17,7 +17,8 @@ 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 +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean index f4a7b28602..cb69cc0c08 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -132,7 +132,6 @@ noncomputable def absoluteConjugateCosetEquiv Establishes the identity `absoluteConjugateCosetEquiv K σ (QuotientGroup.mk x) = QuotientGroup.mk (absoluteConjugationEquiv σ x)`. -/ -@[simp] theorem absoluteConjugateCosetEquiv_mk {G : Type*} [Group G] [TopologicalSpace G] [ContinuousMul G] (K : ClosedSubgroup G) (σ : G) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean index ae40e21f7b..15bfd79848 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean @@ -94,7 +94,6 @@ def canonicalValueQuotientMap (Z : AddSubgroup ZHat) simp [nsmul_eq_mul]) /-- The canonical value map evaluates on a quotient representative by reduction modulo `n`. -/ -@[simp] theorem canonicalValueQuotientMap_mk (Z : AddSubgroup ZHat) (n : ℕ) (hn : 0 < n) (z : Z) : canonicalValueQuotientMap Z n hn @@ -189,7 +188,7 @@ def canonicalQuotientMap (v : ValuationData D A) /-- The former equivalence API, now derived from the bijectivity of the canonical inclusion-and-reduction map in the valuation-quotient axiom. -/ -def cyclic_value_quotients (v : ValuationData D A) +def cyclicValueQuotients (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : (v.valueGroup ⧸ nsmulWithin v.valueGroup n) ≃+ ZMod n := AddEquiv.ofBijective (v.canonicalQuotientMap n hn) @@ -198,7 +197,7 @@ def cyclic_value_quotients (v : ValuationData D A) /-- Canonical reduction of the value group modulo `n`. -/ def valueModulo (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : v.valueGroup →+ ZMod n := - (v.cyclic_value_quotients n hn).toAddMonoidHom.comp + (v.cyclicValueQuotients n hn).toAddMonoidHom.comp (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) /-- Value modulo `n` is profinite-integer reduction of the underlying value. -/ @@ -213,7 +212,7 @@ theorem valueModulo_surjective (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : Function.Surjective (v.valueModulo n hn) := by intro z - obtain ⟨q, rfl⟩ := (v.cyclic_value_quotients n hn).surjective z + obtain ⟨q, rfl⟩ := (v.cyclicValueQuotients n hn).surjective z refine Quotient.inductionOn' q ?_ intro a exact ⟨a, rfl⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean index 4f677da326..134db5bae6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean @@ -112,7 +112,8 @@ theorem FiniteAbstractField.residueDegree_conjugate namespace ValuationData -/-- **conjugation compatibility of normalized valuations.** The normalized valuations are compatible with +/-- **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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean index 2dfcef7ad2..3c88980251 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean @@ -39,14 +39,16 @@ variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] [IsTopologica /-! ## 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 +/-- 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 := + ∃ E : FiniteGaloisSubextension K, ClassFormation.FiniteGaloisSubextension.normSubgroup A E ≤ + H := (normTopology_addSubgroup_isOpen_iff A K H).1 hH namespace FiniteGaloisSubextension @@ -330,7 +332,8 @@ theorem candidateQuotient_eq_one_iff /-- 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 +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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean index ef7e3ed2cb..0024a5a360 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean @@ -60,7 +60,6 @@ def canonicalValueQuotientHom v.canonicalQuotientMap n hn /-- The quotient homomorphism evaluates on a coset through canonical value reduction. -/ -@[simp] theorem canonicalValueQuotientHom_mk (v : ValuationData D A) (n : ℕ) (hn : 0 < n) (z : v.valueGroup) : @@ -79,7 +78,7 @@ theorem canonicalValueQuotientHom_surjective def canonicalValueQuotientEquiv (v : ValuationData D A) (n : ℕ) (hn : 0 < n) : (v.valueGroup ⧸ nsmulWithin v.valueGroup n) ≃+ ZMod n := - v.cyclic_value_quotients n hn + v.cyclicValueQuotients n hn /-- Canonical valuation modulo `[L : K]` on `A_K`. -/ def canonicalUnramifiedValuationHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean index a1c8189f1f..f1aeaf6008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean @@ -274,7 +274,6 @@ noncomputable def leftCosetEquivOfMulEquiv rw [e.apply_symm_apply] /-- A multiplicative equivalence transports a left-coset representative as expected. -/ -@[simp] theorem leftCosetEquivOfMulEquiv_mk {Q : Type*} {R : Type*} [Group Q] [Group R] (e : Q ≃* R) (S : Subgroup Q) (x : Q) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean index 8da2b9684e..6fb50b8451 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean @@ -14,7 +14,8 @@ 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 +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean index ac4e136d3e..431366ba7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean @@ -36,8 +36,8 @@ 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] [CompactSpace G] [T2Space G] - [TotallyDisconnectedSpace G] + [IsTopologicalGroup G] + (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean index 4e532effaa..c5fd614b47 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean @@ -16,7 +16,8 @@ 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 +degree--are jointly injective. This is the group-theoretic fact used when two Frobenius lifts +have the same restriction and degree. -/ @@ -38,7 +39,7 @@ def extensionImageInInertiaQuotient (D : DegreeData G) /-- 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] [CompactSpace G] [T2Space G] + (D : DegreeData G) [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] @@ -72,7 +73,7 @@ theorem extensionImageInInertiaQuotient_isClosed 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] [CompactSpace G] [T2Space G] + (D : DegreeData G) [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L M : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) (hMK : M.toSubgroup ≤ K.field.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean index cf24b4485b..578a4ab9be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -168,7 +168,7 @@ is contained in the field fixed by `φⁿ`, where of the restriction map is closed, so it contains the whole procyclic closure generated by `φⁿ`. -/ theorem frobeniusPowerFixedField_le_finiteField (D : DegreeData G) - [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean index 8e6cba6842..16437192af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean @@ -387,7 +387,7 @@ theorem maximalUnramifiedNorm_fixed_of_hstar (D : DegreeData G) 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) [IsTopologicalGroup G] + (A : Rep ℤ G) (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean index 7d521a4fc7..c789deed01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean @@ -80,7 +80,6 @@ instance frobeniusElementsSemigroup (D : DegreeData G) `D.extensionNormalizedDegree K L hLK (σ * τ).1 = D.extensionNormalizedDegree K L hLK σ.1 * D.extensionNormalizedDegree K L hLK τ.1`. -/ -@[simp] theorem extensionNormalizedDegree_frobenius_mul (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean index 2a46e06821..66fd21a3fa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -34,7 +34,9 @@ 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. +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 @@ -511,7 +513,6 @@ theorem finiteReciprocityCandidate_eq_primeNormClass (K.toFiniteResidueAbstractField D) L hLK q.toMul) /-- The finite reciprocity candidate sends the zero norm class to the identity. -/ -@[simp] theorem finiteReciprocityCandidate_zero (D : DegreeData G) (A : Rep ℤ G) (v : ValuationData D A) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] @@ -594,7 +595,8 @@ private theorem finiteReciprocityValue_eq_of_same_restriction_of_mul · rcases h with ⟨ι, hσ, _, hι⟩ rw [hσ, hmul, hι, add_zero] -/-- The finite degree-quotient decomposition candidate is additive as soon as reciprocity multiplicativity +/-- 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 @@ -801,7 +803,8 @@ 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 +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. -/ @@ -818,7 +821,7 @@ namespace DegreeData Frobenius lift is itself unramified over `K`. -/ theorem unramifiedFrobenius_fixedField_isUnramified (D : DegreeData G) - [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hnormal : (extensionSubgroup K.field L hLK).Normal] @@ -1016,7 +1019,7 @@ 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) - [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] @@ -1030,7 +1033,7 @@ theorem unramifiedReciprocity_bijective_of_generator (K.toFiniteResidueAbstractField D) L hLK)) = finiteNormClass A K.field L hLK (v.chosenPrimeElement K)) : Function.Bijective f := by - let e := v.unramifiedReciprocity_valuationEquiv + let e := v.unramifiedReciprocityValuationEquiv hAxiom K L hLK hUnramified let E : FiniteAbstractFieldExtension G := FiniteAbstractFieldExtension.ofInclusion L K hLK @@ -1062,10 +1065,11 @@ theorem unramifiedReciprocity_bijective_of_generator _ = 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 +/-- 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 unramifiedReciprocity_equiv_of_generator +noncomputable def unramifiedReciprocityEquivOfGenerator (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] (K : FiniteAbstractField G) (L : ClosedSubgroup G) @@ -1106,7 +1110,7 @@ theorem unramifiedReciprocity_equiv_of_generator_apply finiteNormClass A K.field L hLK (v.chosenPrimeElement K)) (q : Additive (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)) : - v.unramifiedReciprocity_equiv_of_generator hAxiom K L hLK + v.unramifiedReciprocityEquivOfGenerator hAxiom K L hLK hUnramified f hf q = f q := rfl @@ -1166,7 +1170,7 @@ noncomputable def unramifiedReciprocityEquiv (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.unramifiedReciprocity_equiv_of_generator hAxiom K L hLK hUnramified + v.unramifiedReciprocityEquivOfGenerator hAxiom K L hLK hUnramified (D.finiteReciprocityHom A v hAxiom K L hLK) (v.unramifiedReciprocity_frobenius_image hAxiom K L hLK hUnramified) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean index ec1a7fc22b..83f40dd9b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean @@ -35,7 +35,8 @@ 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 +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean index 38c51b4d31..625e5ace71 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean @@ -34,7 +34,7 @@ def frobeniusMultiplicativityCorrectionTerm /-- The corresponding left-action elements are `τ₄,τ₁,τ₄`. The last action is `τ₄` because the product in the actual `(*)` identity is `τ₄τ₁`. -/ -def frobeniusMultiplicativityCorrectionAction {R : Type*} [Group R] +def frobeniusMultiplicativityCorrectionAction {R : Type*} (τ₁ τ₄ : R) : Fin 3 → R := ![τ₄, τ₁, τ₄] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index b8adcc7dc7..d32f11a91e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -79,7 +79,7 @@ namespace DegreeData /-- Restriction on the infinite Frobenius quotients underlying the first diagram of norm--conjugation naturality. -/ def finiteReciprocityNaturalityFrobeniusTowerMap - (D : DegreeData G) [IsTopologicalGroup G] + (D : DegreeData G) (K K' L L' : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) (hL'K' : L'.toSubgroup ≤ K'.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index 0213f5deac..96b5300f14 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -715,7 +715,8 @@ private theorem transferNormNaturality_extensionAction_product 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. -/ +/-- 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) @@ -928,7 +929,8 @@ theorem transferNormNaturality_normQuotientInclusion_finiteNormClass namespace DegreeData -/-- transfer--norm naturality on one Frobenius generator. The proof follows: transfer is expanded over double cosets, the finite reciprocity equivalence +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean index 21d7d65c27..064d3f71b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean @@ -440,7 +440,7 @@ theorem transferNormNaturalityTransferFrobeniusLift_towerMap /-- 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] [T2Space G] + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) (hL : L.toSubgroup ≤ E.field.field.toSubgroup) [hLnormal : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean index 2298fc00eb..744a14e3f6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean @@ -321,7 +321,7 @@ theorem transferNormNaturalityFrobeniusIntermediateFiniteIndex /-- The copy of `G(\widetilde L/K')` is closed in `G(\widetilde L/K)`. -/ theorem transferNormNaturalityFrobeniusIntermediate_isClosed - (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (D : DegreeData G) [IsTopologicalGroup G] [CompactSpace G] (E : FiniteResidueAbstractExtension D) (L : ClosedSubgroup G) (hL : L.toSubgroup ≤ E.field.field.toSubgroup) [hLnormal : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean index 9c84900415..8ec1a5d2aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean @@ -70,7 +70,8 @@ theorem frobeniusFixedField_absoluteFinite (D : DegreeData G) (le_baseField (D.frobeniusFixedField (K.toFiniteResidueAbstractField D) L hLK (hLnormal := by - simpa only [FiniteAbstractField.toFiniteResidueAbstractField] using 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean index 51006626d6..e594c13932 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean @@ -19,7 +19,8 @@ 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. +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean index c3af90a2f9..102fe75f5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -341,7 +341,6 @@ end FiniteUnramifiedCyclicExtension namespace ValuationData /-- The quotient unit representation acts on a representative through the original unit action. -/ -@[simp] theorem unitRepresentation_quotient_mk_apply (v : ValuationData D A) (E : FiniteAbstractFieldExtension G) (hnormal : (extensionSubgroup E.base.field E.field.field E.below).Normal) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean index c3f1abd4cf..7349d732c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean @@ -17,7 +17,8 @@ open KummerTheory open CyclicCohomology /-! -# The abstract reciprocity construction, the unramified norm-quotient equivalence: the unramified norm quotient +# 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 @@ -163,7 +164,7 @@ private theorem valueModulo_eq_zero_iff · intro hz have hq : (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) z = 0 := by - apply (v.cyclic_value_quotients n hn).injective + apply (v.cyclicValueQuotients n hn).injective change v.valueModulo n hn z = v.valueModulo n hn 0 rw [hz, map_zero] obtain ⟨w, hw⟩ := @@ -174,7 +175,7 @@ private theorem valueModulo_eq_zero_iff (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w) = 0 := by apply (QuotientAddGroup.eq_zero_iff _).2 exact ⟨w, rfl⟩ - change (v.cyclic_value_quotients n hn) + change (v.cyclicValueQuotients n hn) ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w)) = 0 rw [hq, map_zero] @@ -369,7 +370,7 @@ theorem unramifiedNormQuotientValuation_injective /-- **the unramified norm-quotient equivalence (valuation part).** For finite unramified `L / K`, valuation induces `A_K / N_{L/K}A_L ≃ ℤ/[L:K]ℤ`. -/ -def unramifiedReciprocity_valuationEquiv +def unramifiedReciprocityValuationEquiv (v : ValuationData D A) (hAxiom : SatisfiesUnramifiedUnitCohomology D v) (K : FiniteAbstractField G) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) @@ -469,7 +470,7 @@ theorem primeClass_zmultiples_eq_top (π : ambientFixedAddSubgroup A K.field) (hπ : v.IsPrimeElement K π) : AddSubgroup.zmultiples (finiteNormClass A K.field L hLK π) = ⊤ := by - let e := v.unramifiedReciprocity_valuationEquiv hAxiom K L hLK hUnramified + let e := v.unramifiedReciprocityValuationEquiv hAxiom K L hLK hUnramified let E := FiniteAbstractFieldExtension.ofInclusion L K hLK let : NeZero (E.degree : ℕ) := ⟨E.degree.property.ne'⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean index 0e20c8a331..ae11cc8de1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -46,7 +46,7 @@ private theorem valueModulo_nsmul (QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • z) = 0 := by apply (QuotientAddGroup.eq_zero_iff _).2 exact ⟨z, rfl⟩ - change (v.cyclic_value_quotients n hn) + change (v.cyclicValueQuotients n hn) ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • z)) = 0 rw [hq, map_zero] @@ -412,7 +412,8 @@ private theorem classFieldAxiom_unramifiedUnits_hZero 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 +/-- **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 @@ -893,7 +894,8 @@ theorem abstractReciprocity_normQuotient_exact /-- 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. -/ +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 @@ -1243,7 +1245,8 @@ theorem abstractReciprocity_valuationAt_fixedFieldInclusion_of_totallyRamified 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 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean index f517d838b0..40b9fa31fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean @@ -771,7 +771,8 @@ private theorem reciprocityEquiv_bijective 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 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. -/ @@ -793,7 +794,8 @@ theorem normSubgroup_compositum (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 +/-- 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) @@ -899,7 +901,8 @@ theorem normSubgroupMap_bijective ⟨normSubgroupMap_injective v hcf K, normSubgroupMap_surjective v hcf K⟩ -/-- **the finite abelian classification theorem.** Finite abelian extensions of the base are order-isomorphic +/-- **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) @@ -929,7 +932,8 @@ theorem normSubgroupOrderIso_apply L.normSubgroup A := rfl -/-- The second displayed formula in the finite abelian classification theorem: the norm subgroup of the +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean index ab1feb2fab..8d54f5e318 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean @@ -76,7 +76,7 @@ def extensionQuotient (L : FiniteAbelianSubextension K) : Type u := /-- The quotient attached to a finite abelian subextension is a commutative group. -/ @[implicit_reducible] -instance extensionQuotient_commGroup (L : FiniteAbelianSubextension K) : +instance extensionQuotientCommGroup (L : FiniteAbelianSubextension K) : CommGroup L.extensionQuotient := by unfold extensionQuotient letI : IsMulCommutative diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean index 47857e9036..588f3fdfe3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean @@ -82,7 +82,7 @@ instance extensionSubgroup_normalInstance (L : FiniteGaloisSubextension K) : /-- The group structure transported across the named finite quotient boundary. -/ -instance extensionQuotient_groupInstance (L : FiniteGaloisSubextension K) : +instance extensionQuotientGroupInstance (L : FiniteGaloisSubextension K) : Group L.extensionQuotient := by change Group (K.toSubgroup ⧸ extensionSubgroup K L.field L.below) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean index 4541154ff2..fb139053e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean @@ -17,7 +17,8 @@ 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 +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`. @@ -438,7 +439,6 @@ theorem lowerQuotientEquiv_mk (L : FiniteGaloisSubextension K) /-- The same representative formula after forgetting the subtype `S`; this is the form used when composing restriction maps in the reduction diagram. -/ -@[simp] theorem lowerQuotientEquiv_mk_coe (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) (m : (L.intermediateField S).toSubgroup) : @@ -481,7 +481,7 @@ def upperQuotient (L : FiniteGaloisSubextension K) L.extensionQuotient ⧸ S /-- The upper quotient over an intermediate field carries its canonical group structure. -/ -instance upperQuotient_groupInstance (L : FiniteGaloisSubextension K) +instance upperQuotientGroupInstance (L : FiniteGaloisSubextension K) (S : Subgroup L.extensionQuotient) [S.Normal] : Group (L.upperQuotient S) := by change Group (L.extensionQuotient ⧸ S) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean index b3e45e51e4..11c857627d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean @@ -988,7 +988,8 @@ 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 +norm--conjugation and transfer--norm naturality turn those reciprocity squares into the three +printed commutative diagrams for the inverse norm-residue symbol. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean index 495f495dd3..a72b00c654 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -227,7 +227,6 @@ Establishes the identity `finiteUnramifiedDegreeHom D K L hUnramified (L.extensi zHatReductionMul (L.toFiniteAbstractExtension.degree : ℕ) L.toFiniteAbstractExtension.degree.property (D.normalizedDegree K k)`. -/ -@[simp] theorem finiteUnramifiedDegreeHom_mk (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : FiniteGaloisSubextension K.field) @@ -326,7 +325,6 @@ theorem finiteUnramifiedDegreeEquiv_restriction D.maximalUnramifiedDegreeEquiv_mk] /-- The arithmetic Frobenius has finite normalized degree one. -/ -@[simp] theorem finiteUnramifiedDegreeEquiv_unramifiedFrobenius (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : FiniteGaloisSubextension K.field) @@ -379,7 +377,7 @@ isomorphisms. This is the generator calculation in the unramified norm-quotient expressed in the normalization needed. -/ theorem canonicalUnramifiedReciprocity_degree_of_generator (v : ValuationData D A) - [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + (K : FiniteAbstractField G) (L : FiniteGaloisSubextension K.field) : letI : Finite (K.field.toSubgroup ⧸ @@ -553,7 +551,8 @@ theorem maximalUnramifiedNormResidueSymbol_finiteReciprocity_of_generator /-- 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 +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 @@ -570,7 +569,7 @@ theorem maximalUnramifiedNormResidueSymbol_finiteRestriction_of_generator (K.toFiniteResidueAbstractField D) L.field L.below)) = finiteNormClass A K.field L.field L.below (v.chosenPrimeElement K)) (a : ambientFixedAddSubgroup A K.field), - (v.unramifiedReciprocity_equiv_of_generator hAxiom K L.field L.below + (v.unramifiedReciprocityEquivOfGenerator hAxiom K L.field L.below hUnramified r hr).symm (finiteNormClass A K.field L.field L.below a) = Additive.ofMul @@ -581,7 +580,7 @@ theorem maximalUnramifiedNormResidueSymbol_finiteRestriction_of_generator (K.field.toSubgroup ⧸ extensionSubgroup K.field L.field L.below) := L.finite intro hUnramified r hr a - apply (v.unramifiedReciprocity_equiv_of_generator hAxiom K L.field L.below + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean index edd91c3e65..ba332992ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean @@ -291,7 +291,8 @@ theorem normTopology_hausdorff /-- 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. -/ +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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean index a263d99e62..659a1007f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -16,7 +16,8 @@ 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 +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean index 0f3626d110..79ea0c03ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean @@ -321,7 +321,7 @@ theorem abstractReciprocity_relativeNorm_fixedFieldInclusion /-- 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) [IsTopologicalGroup G] + (D : DegreeData G) (E : DegreeData.AbstractExtension G) (M : FiniteGaloisSubextension E.base) (hME : M.field.toSubgroup ≤ E.field.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean index 1b24216a21..5821169c62 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean @@ -12,7 +12,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Recip 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. +of reduction modulo `f` after the normalized degree map `d_K`. The norm--valuation formula then +sends its norm subgroup into the prescribed neighbourhood. -/ noncomputable section @@ -66,7 +67,7 @@ theorem unramifiedDegreeKernelWithin_isClosed (D : DegreeData G) (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) [IsTopologicalGroup G] +def unramifiedExtensionOfDegree (D : DegreeData G) (K : FiniteResidueAbstractField D) (f : ℕ) (hf : 0 < f) : ClosedSubgroup G where toSubgroup := @@ -262,7 +263,8 @@ theorem finiteUnramifiedExtension_degree (D : DegreeData G) 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] + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean index ca51c89070..40dcc7abf7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean @@ -66,7 +66,7 @@ theorem isAbelianGalois_of_equiv_equiv /-- Compatible equivalences of field extensions identify their Galois automorphisms by conjugation. -/ -noncomputable def galEquiv_of_equiv_equiv +noncomputable def galEquivOfEquivEquiv {K L M N : Type*} [Field K] [Field L] [Algebra K L] [Field M] [Field N] [Algebra M N] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean index 04f2f4231b..6892b738de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean @@ -168,6 +168,8 @@ variable (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) @@ -177,14 +179,18 @@ local instance finitePlaceDecompositionGroupAction : (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 @@ -192,6 +198,8 @@ local instance finitePlaceLocalizedCompletionAlgebra : 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) : @@ -201,6 +209,7 @@ local instance finitePlaceAllCompletionAlgebra 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) @@ -208,6 +217,7 @@ local instance finitePlaceScalarTensorUnitsAction : 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean index b622a78d42..fd023132cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean @@ -333,7 +333,7 @@ theorem eventually_finitePlace_iff_eventually_all_above let : Fintype (AbsoluteValueExtension (HeightOneSpectrum.adicAbv K w) L) := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (HeightOneSpectrum.adicAbv K w) (RayClass.adicAbv_isNontrivial w) exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean index 680c4827d0..d907874606 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean @@ -224,27 +224,35 @@ variable (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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean index b724508540..b681d4e3d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean @@ -61,7 +61,7 @@ noncomputable def finitePlaceLocalTensorDecompositionComponentRingHom (Pi.evalRingHom (fun u : AbsoluteValueExtension vK L => u.1.Completion) wL).comp - ((completionTensorDecomposition_left + ((completionTensorDecompositionLeft (K := K) (L := L) vK hvK).toRingEquiv.toRingHom.comp (relativeFinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w).symm.toRingEquiv.toRingHom) @@ -142,7 +142,7 @@ noncomputable def finitePlaceLocalTensorDecompositionUnitsEquiv (Units.mapEquiv (((relativeFinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w).symm.toRingEquiv.trans - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK).toRingEquiv).toMulEquiv)).trans MulEquiv.piUnits diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean index 5a78d45248..97fa5fd5e1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean @@ -224,7 +224,7 @@ theorem basis_coord_isIntegral_of_integral_traces [CommRing R] [Field A] [CommRing B] [Algebra R A] [Algebra A B] [Fintype ι] [DecidableEq ι] - [Module.Free A B] [Module.Finite A B] + (b : Module.Basis ι A B) {x : B} (hM : ∀ j k, IsIntegral R @@ -272,7 +272,7 @@ 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*} [Fintype ι] + {ι : Type*} (b : Module.Basis ι K L) (A : Type*) [Field A] [Algebra K A] (i j : ι) : @@ -313,7 +313,7 @@ theorem isIntegral_trace_tensor_of_components (hvK0 : vK.IsNontrivial) (x : vK.Completion ⊗[K] L) (hx : ∀ w : AbsoluteValueExtension vK L, - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK0 x w ∈ absoluteValueCompletionIntegers w.1 (absoluteValueExtension_isNonarchimedean vK hvK w)) : @@ -322,7 +322,7 @@ theorem isIntegral_trace_tensor_of_components (vK.Completion ⊗[K] L) x) := by classical let : Fintype (AbsoluteValueExtension vK L) := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK0 let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -336,7 +336,7 @@ theorem isIntegral_trace_tensor_of_components vK.Completion w.1.Completion let y : ∀ w : AbsoluteValueExtension vK L, w.1.Completion := - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK0 x have hy : ∀ w : AbsoluteValueExtension vK L, @@ -354,6 +354,6 @@ theorem isIntegral_trace_tensor_of_components rw [← ValuationTheory.Completion.algebra_trace_pi_apply (fun w : AbsoluteValueExtension vK L => w.1.Completion) y] at hsum rw [Algebra.trace_eq_of_algEquiv - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK0) x] at hsum exact hsum diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean index 6d0077b9ea..f5a2ea5862 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -47,7 +47,7 @@ noncomputable def finitePlaceLocalTensorDecompositionComponent fun u => AbsoluteValue.completionAlgebra vK u.1 u.2 exact - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK ((relativeFinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w).symm x) wL @@ -382,7 +382,7 @@ theorem scaledRelativeTensorCoordinates_isIntegral_of_localTensorDecompositionIn let hvK0 : vK.IsNontrivial := RayClass.adicAbv_isNontrivial w let : Fintype (AbsoluteValueExtension vK L) := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK0 let : ∀ wL : AbsoluteValueExtension vK L, Algebra vK.Completion wL.1.Completion := @@ -402,7 +402,7 @@ theorem scaledRelativeTensorCoordinates_isIntegral_of_localTensorDecompositionIn (scaledRelativeExtensionBasis (K := K) (L := L)) have hxA : ∀ wL : AbsoluteValueExtension vK L, - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK0 xA wL ∈ absoluteValueCompletionIntegers wL.1 (absoluteValueExtension_isNonarchimedean vK hvK wL) := by @@ -412,7 +412,7 @@ theorem scaledRelativeTensorCoordinates_isIntegral_of_localTensorDecompositionIn have hbA : ∀ (i : RelativeAdeleBasisIndex (K := K) (L := L)) (wL : AbsoluteValueExtension vK L), - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK0 (bA i) wL ∈ absoluteValueCompletionIntegers wL.1 (absoluteValueExtension_isNonarchimedean vK hvK wL) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index 6c989ecd5b..6e7a04c008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -51,7 +51,7 @@ noncomputable def finitePlaceTensorRingEquivAboveAdic u.1.Completion) := (relativeFinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w).symm.toRingEquiv.trans - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK).toRingEquiv let e₂ : (∀ u : AbsoluteValueExtension vK L, @@ -176,7 +176,7 @@ noncomputable def infinitePlaceTensorRingEquivAbove exact (infinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w).toRingEquiv.trans - ((completionTensorDecomposition_left + ((completionTensorDecompositionLeft (K := K) (L := L) w.1 w.isNontrivial).toRingEquiv.trans ((infiniteCompletionRingProductReindexAbove @@ -195,7 +195,7 @@ theorem infinitePlaceTensorRingEquivAbove_apply infinitePlaceTensorRingEquivAbove (K := K) (L := L) w z W = (InfinitePlace.Completion.equiv W.1).symm - (completionTensorDecomposition_left + (completionTensorDecompositionLeft w.1 w.isNontrivial (infinitePlaceLocalTensorAlgEquiv (K := K) (L := L) w z) @@ -225,7 +225,7 @@ theorem infinitePlaceTensorRingEquivAbove_tmul rw [infinitePlaceTensorRingEquivAbove_apply] change (InfinitePlace.Completion.equiv W.1).symm - (completionTensorDecomposition_left + (completionTensorDecompositionLeft w.1 w.isNontrivial ((infinitePlaceCompletionAlgEquiv w a) ⊗ₜ[K] x) (infinitePlaceAboveToExtension @@ -924,7 +924,7 @@ theorem infinitePlaceTensorRingEquivAbove_tmul_one rw [infinitePlaceTensorRingEquivAbove_apply] change (InfinitePlace.Completion.equiv W.1).symm - (completionTensorDecomposition_left + (completionTensorDecompositionLeft w.1 w.isNontrivial ((1 : w.1.Completion) ⊗ₜ[K] x) (infinitePlaceAboveEquivExtension diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean index 030f897df8..713f50e7a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean @@ -14,7 +14,7 @@ extension with its canonical valued local-field structures. It also defines unramifiedness for that actual completed extension. -/ -open scoped NumberField Classical ValuativeRel NNReal +open scoped NumberField ValuativeRel NNReal open NumberField IsDedekindDomain noncomputable section @@ -29,11 +29,13 @@ variable [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 @@ -41,6 +43,7 @@ noncomputable instance chosenFinitePlaceExtensionCompletionAlgebra AbsoluteValue.extensionCompletionAlgebra (K := K) (chosenFinitePlaceExtension (L := L) w₀).1 +open scoped Classical in noncomputable instance chosenFinitePlaceExtensionCompletionSMul (w₀ : HeightOneSpectrum (𝓞 K)) : SMul K @@ -48,6 +51,7 @@ noncomputable instance chosenFinitePlaceExtensionCompletionSMul (chosenFinitePlaceExtensionCompletionAlgebra (K := K) (L := L) w₀).toSMul +open scoped Classical in noncomputable instance chosenFinitePlaceCompletionAlgebra (w₀ : HeightOneSpectrum (𝓞 K)) : Algebra @@ -58,6 +62,7 @@ noncomputable instance chosenFinitePlaceCompletionAlgebra (chosenFinitePlaceExtension (L := L) w₀).1 (chosenFinitePlaceExtension (L := L) w₀).2 +open scoped Classical in noncomputable instance chosenFinitePlaceBaseValued (w₀ : HeightOneSpectrum (𝓞 K)) : Valued @@ -66,6 +71,7 @@ noncomputable instance chosenFinitePlaceBaseValued (HeightOneSpectrum.adicAbv K w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseValuativeRel (w₀ : HeightOneSpectrum (𝓞 K)) : ValuativeRel @@ -74,6 +80,7 @@ noncomputable instance chosenFinitePlaceBaseValuativeRel (HeightOneSpectrum.adicAbv K w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValued (w₀ : HeightOneSpectrum (𝓞 K)) : Valued @@ -84,6 +91,7 @@ noncomputable instance chosenFinitePlaceLocalizedValued (chosenFinitePlaceExtension (L := L) w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValuativeRel (w₀ : HeightOneSpectrum (𝓞 K)) : ValuativeRel @@ -94,6 +102,7 @@ noncomputable instance chosenFinitePlaceLocalizedValuativeRel (chosenFinitePlaceExtension (L := L) w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValuationHasExtension (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -108,6 +117,7 @@ noncomputable instance (chosenFinitePlaceExtension (L := L) w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIntegerAlgebra (w₀ : HeightOneSpectrum (𝓞 K)) : Algebra @@ -117,6 +127,7 @@ noncomputable instance chosenFinitePlaceLocalizedIntegerAlgebra Algebra.ofSubsemiring 𝒪[ChosenFinitePlaceBaseCompletion (K := K) w₀] +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIsIntegralClosure (w₀ : HeightOneSpectrum (𝓞 K)) : IsIntegralClosure @@ -131,15 +142,17 @@ noncomputable instance chosenFinitePlaceLocalizedIsIntegralClosure (RayClass.adicAbv_isNontrivial w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseNontriviallyNormedField (w₀ : HeightOneSpectrum (𝓞 K)) : NontriviallyNormedField (ChosenFinitePlaceBaseCompletion (K := K) w₀) := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField (HeightOneSpectrum.adicAbv K w₀) (RayClass.adicAbv_isNontrivial w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseLocallyCompactSpace (w₀ : HeightOneSpectrum (𝓞 K)) : LocallyCompactSpace @@ -147,6 +160,7 @@ noncomputable instance chosenFinitePlaceBaseLocallyCompactSpace AbsoluteValue.Completion.locallyCompactSpace (finitePlaceCompletionBaseMap_isometry w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseIsUltrametricDist (w₀ : HeightOneSpectrum (𝓞 K)) : IsUltrametricDist @@ -155,6 +169,7 @@ noncomputable instance chosenFinitePlaceBaseIsUltrametricDist (HeightOneSpectrum.adicAbv K w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseValuationIsNontrivial (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -166,6 +181,7 @@ noncomputable instance (NormedField.valuation (K := ChosenFinitePlaceBaseCompletion (K := K) w₀)).IsNontrivial) +open scoped Classical in noncomputable instance chosenFinitePlaceBaseValuationCompatible (w₀ : HeightOneSpectrum (𝓞 K)) : (Valued.v : @@ -174,6 +190,7 @@ noncomputable instance chosenFinitePlaceBaseValuationCompatible ℝ≥0).Compatible := Valuation.Compatible.ofValuation _ +open scoped Classical in noncomputable instance chosenFinitePlaceBaseValuativeRelIsNontrivial (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -185,6 +202,7 @@ noncomputable instance (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0)).2 inferInstance +open scoped Classical in noncomputable instance chosenFinitePlaceBaseIsValuativeTopology (w₀ : HeightOneSpectrum (𝓞 K)) : IsValuativeTopology @@ -192,6 +210,7 @@ noncomputable instance chosenFinitePlaceBaseIsValuativeTopology isValuativeTopology_of_valued_ofValuation (ChosenFinitePlaceBaseCompletion (K := K) w₀) ℝ≥0 +open scoped Classical in noncomputable instance chosenFinitePlaceBaseIsNonarchimedeanLocalField (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -201,6 +220,7 @@ noncomputable instance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } +open scoped Classical in noncomputable instance chosenFinitePlaceCompletionFiniteDimensional (w₀ : HeightOneSpectrum (𝓞 K)) : FiniteDimensional @@ -211,6 +231,7 @@ noncomputable instance chosenFinitePlaceCompletionFiniteDimensional (RayClass.adicAbv_isNontrivial w₀) (chosenFinitePlaceExtension (L := L) w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceCompletionContinuousSMul (w₀ : HeightOneSpectrum (𝓞 K)) : ContinuousSMul @@ -222,6 +243,7 @@ noncomputable instance chosenFinitePlaceCompletionContinuousSMul (chosenFinitePlaceExtension (L := L) w₀).1 (chosenFinitePlaceExtension (L := L) w₀).2).continuous +open scoped Classical in noncomputable instance chosenFinitePlaceCompletionLocallyCompactSpace (w₀ : HeightOneSpectrum (𝓞 K)) : LocallyCompactSpace @@ -230,6 +252,7 @@ noncomputable instance chosenFinitePlaceCompletionLocallyCompactSpace (ChosenFinitePlaceBaseCompletion (K := K) w₀) (chosenFinitePlaceExtension (L := L) w₀).1.Completion +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedFiniteDimensional (w₀ : HeightOneSpectrum (𝓞 K)) : FiniteDimensional @@ -241,6 +264,7 @@ noncomputable instance chosenFinitePlaceLocalizedFiniteDimensional (RayClass.adicAbv_isNontrivial w₀) (chosenFinitePlaceExtension (L := L) w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIsGalois (w₀ : HeightOneSpectrum (𝓞 K)) : IsGalois @@ -251,6 +275,7 @@ noncomputable instance chosenFinitePlaceLocalizedIsGalois (HeightOneSpectrum.adicAbv K w₀) (chosenFinitePlaceExtension (L := L) w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedLocallyCompactSpace (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -269,6 +294,7 @@ noncomputable instance 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 @@ -279,6 +305,7 @@ noncomputable instance chosenFinitePlaceLocalizedIsUltrametricDist (chosenFinitePlaceExtension (L := L) w₀) (HeightOneSpectrum.isNonarchimedean_adicAbv K w₀) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValuationCompatible (w₀ : HeightOneSpectrum (𝓞 K)) : (Valued.v : @@ -288,6 +315,7 @@ noncomputable instance chosenFinitePlaceLocalizedValuationCompatible ℝ≥0).Compatible := Valuation.Compatible.ofValuation _ +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValuationIsNontrivial (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -301,6 +329,7 @@ noncomputable instance (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀)) +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedValuativeRelIsNontrivial (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -312,6 +341,7 @@ noncomputable instance (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀))).2 inferInstance +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIsValuativeTopology (w₀ : HeightOneSpectrum (𝓞 K)) : IsValuativeTopology @@ -321,6 +351,7 @@ noncomputable instance chosenFinitePlaceLocalizedIsValuativeTopology (ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀) ℝ≥0 +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIsNonarchimedeanLocalField (w₀ : HeightOneSpectrum (𝓞 K)) : @@ -331,6 +362,7 @@ noncomputable instance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } +open scoped Classical in noncomputable instance chosenFinitePlaceLocalizedIntegerModuleFinite (w₀ : HeightOneSpectrum (𝓞 K)) : Module.Finite @@ -346,8 +378,10 @@ noncomputable instance chosenFinitePlaceLocalizedIntegerModuleFinite (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 +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean index d6e28ac1b0..4a39597232 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean @@ -20,8 +20,7 @@ absolute-value completion and mathlib's concrete adic completion gives the local factor comparison used in the adelic restricted-product bridge. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -36,6 +35,7 @@ variable [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 @@ -75,6 +75,7 @@ theorem finitePlaceExtension_adicAbv_valuationSubring (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 @@ -150,6 +151,7 @@ theorem finitePlaceExtension_isEquiv_adicAbv (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 @@ -161,6 +163,7 @@ noncomputable def finitePlaceExtensionExponent (K := K) (L := L) v w)).choose omit [FiniteDimensional K L] in +open scoped Classical in theorem finitePlaceExtensionExponent_pos (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -172,6 +175,7 @@ theorem finitePlaceExtensionExponent_pos (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 @@ -187,6 +191,7 @@ theorem finitePlaceExtension_adicAbv_eq_rpow (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 @@ -205,6 +210,7 @@ noncomputable def finitePlaceExtensionWithAbsRingEquiv (RingEquiv.refl L) omit [FiniteDimensional K L] in +open scoped Classical in theorem finitePlaceExtensionWithAbsRingEquiv_continuous (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -217,6 +223,7 @@ theorem finitePlaceExtensionWithAbsRingEquiv_continuous (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 @@ -231,6 +238,7 @@ theorem finitePlaceExtensionWithAbsRingEquiv_symm_continuous (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)) @@ -249,7 +257,7 @@ noncomputable def finitePlaceExtensionCompletionRingEquiv (K := K) (L := L) v w) omit [FiniteDimensional K L] in -@[simp] +open scoped Classical in theorem finitePlaceExtensionCompletionRingEquiv_toCompletion (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -280,6 +288,7 @@ theorem finitePlaceExtensionCompletionRingEquiv_toCompletion rfl omit [FiniteDimensional K L] in +open scoped Classical in /-- The completion comparison is continuous. -/ theorem finitePlaceExtensionCompletionRingEquiv_continuous (v : HeightOneSpectrum (𝓞 K)) @@ -291,6 +300,7 @@ theorem finitePlaceExtensionCompletionRingEquiv_continuous 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 @@ -332,6 +342,7 @@ theorem finitePlaceExtensionCompletionRingEquiv_norm 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 @@ -343,6 +354,7 @@ theorem relativeFinitePlaceCompletionRingEquiv_norm (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 @@ -359,6 +371,7 @@ noncomputable def finitePlaceExtensionAdicCompletionRingEquiv (K := K) (L := L) v w)) omit [FiniteDimensional K L] in +open scoped Classical in theorem finitePlaceExtensionAdicCompletionRingEquiv_norm (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -374,7 +387,7 @@ theorem finitePlaceExtensionAdicCompletionRingEquiv_norm finitePlaceExtensionCompletionRingEquiv_norm] omit [FiniteDimensional K L] in -@[simp] +open scoped Classical in theorem finitePlaceExtensionAdicCompletionRingEquiv_toCompletion (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -408,6 +421,7 @@ theorem finitePlaceExtensionAdicCompletionRingEquiv_toCompletion 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean index 4faff2a4a8..a1114b0699 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean @@ -25,8 +25,7 @@ For a finite place `W` of `L`, `finitePlaceBelow W` is its contraction to closure shows that the centres are precisely the finite places above `v`. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -39,6 +38,7 @@ variable [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)) : @@ -49,6 +49,7 @@ noncomputable def finitePlaceBelow HilbertRamification.Dedekind.ringOfIntegers_under_ne_bot (E := K) (F := L) W.asIdeal +open scoped Classical in @[simp] theorem finitePlaceBelow_asIdeal (W : HeightOneSpectrum (𝓞 L)) : @@ -56,6 +57,7 @@ theorem finitePlaceBelow_asIdeal W.asIdeal.under (𝓞 K) := rfl +open scoped Classical in /-- Contracting a finite place along the identity extension fixes it. -/ @[simp] theorem finitePlaceBelow_self @@ -74,6 +76,7 @@ variable {M : Type w} [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] @@ -94,6 +97,7 @@ 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 @@ -106,6 +110,7 @@ theorem finitePlaceExtension_nonarchimedean (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 @@ -118,6 +123,7 @@ noncomputable def finitePlaceExtensionValuationSubring (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 @@ -137,6 +143,7 @@ theorem ringOfIntegers_mem_finitePlaceExtensionValuationSubring (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 @@ -153,6 +160,7 @@ noncomputable def ringOfIntegersToFinitePlaceExtensionValuationSubring (K := K) (L := L) v w) omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem ringOfIntegersToFinitePlaceExtensionValuationSubring_coe (v : HeightOneSpectrum (𝓞 K)) @@ -165,6 +173,7 @@ theorem ringOfIntegersToFinitePlaceExtensionValuationSubring_coe (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 @@ -179,6 +188,7 @@ noncomputable def finitePlaceExtensionCentreIdeal (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)) @@ -211,6 +221,7 @@ theorem mem_finitePlaceExtensionCentreIdeal_iff (f x) omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in theorem finitePlaceExtensionCentreIdeal_isPrime (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -221,6 +232,7 @@ theorem finitePlaceExtensionCentreIdeal_isPrime 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)) @@ -245,6 +257,7 @@ theorem finitePlaceExtensionCentreIdeal_under 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 @@ -257,6 +270,7 @@ theorem finitePlaceExtensionCentreIdeal_ne_bot (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 @@ -275,6 +289,7 @@ noncomputable def finitePlaceExtensionCentre (K := K) (L := L) v w omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem finitePlaceExtensionCentre_asIdeal (v : HeightOneSpectrum (𝓞 K)) @@ -287,6 +302,7 @@ theorem finitePlaceExtensionCentre_asIdeal rfl omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem finitePlaceBelow_finitePlaceExtensionCentre (v : HeightOneSpectrum (𝓞 K)) @@ -302,6 +318,7 @@ theorem finitePlaceBelow_finitePlaceExtensionCentre (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 @@ -316,6 +333,7 @@ theorem finitePlaceExtensionCentre_liesOver (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 @@ -418,6 +436,7 @@ variable {F M : Type*} [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. -/ @@ -476,6 +495,7 @@ theorem finitePlaceExtensions_isEquiv_of_centres_eq 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 @@ -495,6 +515,7 @@ theorem finitePlaceExtensionCentre_injective 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 @@ -524,6 +545,7 @@ theorem finitePlaceExtensionCentre_conjugate 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 @@ -538,6 +560,7 @@ noncomputable def finitePlaceExtensionCentreInFibre (K := K) (L := L) v w⟩ omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem finitePlaceExtensionCentreInFibre_coe (v : HeightOneSpectrum (𝓞 K)) @@ -550,6 +573,7 @@ theorem finitePlaceExtensionCentreInFibre_coe rfl omit [FiniteDimensional K L] in +open scoped Classical in theorem finitePlaceExtensionCentreInFibre_injective (v : HeightOneSpectrum (𝓞 K)) : Function.Injective @@ -560,6 +584,7 @@ theorem finitePlaceExtensionCentreInFibre_injective (K := K) (L := L) v exact congrArg Subtype.val h +open scoped Classical in private theorem finitePlaceExtensionCentreInFibre_surjective_of_isGalois [IsGalois K L] @@ -603,6 +628,7 @@ private theorem 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 @@ -700,6 +726,7 @@ theorem finitePlaceExtensionCentreInFibre_surjective 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 @@ -716,6 +743,7 @@ noncomputable def finitePlaceExtensionEquivAbove finitePlaceExtensionCentreInFibre_surjective (K := K) (L := L) v⟩ +open scoped Classical in @[simp] theorem finitePlaceExtensionEquivAbove_coe (v : HeightOneSpectrum (𝓞 K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean index d3f30f3704..33140ad297 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean @@ -20,7 +20,7 @@ adic completion models to their valuation rings. It also identifies the residue field of a rational finite-place completion. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -29,6 +29,7 @@ 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 @@ -51,6 +52,7 @@ noncomputable def finitePlaceIntegerToCompletion 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] @@ -61,6 +63,7 @@ theorem finitePlaceIntegerToCompletion_coe 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] @@ -78,6 +81,7 @@ theorem finitePlaceCompletionRingEquiv_toCompletion 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. -/ @@ -89,6 +93,7 @@ noncomputable def finitePlaceIdealResidueEquivLocalization 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 @@ -139,6 +144,7 @@ noncomputable def finitePlaceIdealResidueEquivCompletion ((completionResidueEquiv a ha).trans (IsLocalRing.ResidueField.mapEquiv eCompletion))) +open scoped Classical in @[simp] theorem finitePlaceIdealResidueEquivCompletion_apply_mk {K : Type} [Field K] [NumberField K] @@ -152,6 +158,7 @@ theorem finitePlaceIdealResidueEquivCompletion_apply_mk 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 @@ -161,6 +168,7 @@ theorem finitePlaceCompletion_residueField_card 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 @@ -187,6 +195,7 @@ theorem finitePlaceCompletionRingEquiv_mem_integers_iff 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 @@ -201,6 +210,7 @@ noncomputable def finitePlaceCompletionIntegerRingEquiv (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. -/ @@ -253,6 +263,7 @@ noncomputable def chosenFinitePlaceLocalizedIntegerRingEquiv (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 @@ -270,6 +281,7 @@ noncomputable def standardToChosenLocalizedIntegerRingEquiv 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 @@ -286,6 +298,7 @@ noncomputable def chosenFinitePlaceIntegerToLocalizedCompletion (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] @@ -358,6 +371,7 @@ theorem chosenFinitePlaceIntegerToLocalizedCompletion_coe _ = 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 @@ -399,6 +413,7 @@ theorem chosenFinitePlaceIntegerToLocalizedCompletion_equivariant 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. -/ @@ -418,7 +433,7 @@ noncomputable def chosenFinitePlaceLocalizedResidueEquiv (IsLocalRing.ResidueField.mapEquiv (standardToChosenLocalizedIntegerRingEquiv (K := K) (L := L) v)) -@[simp] +open scoped Classical in theorem chosenFinitePlaceLocalizedResidueEquiv_apply_mk {K L : Type} [Field K] [NumberField K] @@ -469,6 +484,7 @@ theorem chosenFinitePlaceLocalizedResidueEquiv_apply_mk (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 @@ -537,6 +553,7 @@ theorem chosenFinitePlaceLocalizedResidueEquiv_equivariant (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 @@ -552,6 +569,7 @@ theorem chosenFinitePlaceLocalized_residueField_card 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean index 23fd2abbc6..9a6997f25f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean @@ -16,7 +16,7 @@ localized completion and propagates it to every place above the base place in a finite Galois extension. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -32,6 +32,7 @@ variable [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 @@ -45,6 +46,7 @@ noncomputable def chosenFinitePlaceTargetIntegralUniformizer (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 @@ -120,6 +122,7 @@ theorem chosenFinitePlace_integralUniformizer_map_isUniformizer 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 @@ -297,6 +300,7 @@ theorem 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 @@ -332,6 +336,7 @@ theorem isUnramifiedAt_of_chosenFinitePlaceIsUnramified 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean index 4bba5f0543..34ee5ac333 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean @@ -15,7 +15,7 @@ actual chosen finite-place extension implies unramifiedness of its localized completion. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -31,6 +31,7 @@ variable [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 @@ -64,6 +65,7 @@ structure FinitePlaceCompletionIntegralUniformizer 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 @@ -183,6 +185,7 @@ noncomputable def chosenFinitePlaceCompletionIntegralUniformizer 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 @@ -308,6 +311,7 @@ theorem chosenFinitePlace_integral_uniformizer_not_mem_maximalIdeal_sq (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. -/ @@ -349,6 +353,7 @@ theorem chosenFinitePlace_maximalIdeal_map_not_le_sq_of_centre_ramificationIdx_e (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 @@ -393,6 +398,7 @@ theorem chosenFinitePlace_maximalIdeal_ramificationIdx'_eq_one_of_centre_ramific (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 @@ -419,6 +425,7 @@ theorem finitePlaceExtensionCentre_ramificationIdx_eq_one_of_isUnramifiedAt 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. -/ @@ -472,6 +479,7 @@ theorem chosenFinitePlace_maximalIdeal_ramificationIdx_eq_one_of_centre_ramifica 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 @@ -495,6 +503,7 @@ theorem chosenFinitePlaceIsUnramified_of_centre_ramificationIdx_eq_one 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean index e6d8b49638..acb4145dfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean @@ -13,7 +13,7 @@ This file proves that the concrete adic integer units lie in the actual local norm subgroup of the chosen localized completion. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -29,6 +29,7 @@ variable [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean index dbea136378..601d23179a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean @@ -17,7 +17,7 @@ its valuation in the completed target is the global ramification index, and its image generates the completed base maximal ideal. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -33,6 +33,7 @@ variable [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 @@ -194,6 +195,7 @@ theorem chosenFinitePlace_completed_ramificationIdx'_eq_centre 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean index 900d962f8b..0e9183eaea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -26,7 +26,7 @@ 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] - [FiniteDimensional K L] [IsGalois K L] : + [IsGalois K L] : IntermediateField K (SeparableClosure K) := AlgHom.fieldRange (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean index 15b0007b08..5d344c4949 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean @@ -21,7 +21,7 @@ splitting descends to the prime-degree subextension, and nonsplitting there ascends to `L`. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain noncomputable section @@ -34,6 +34,7 @@ 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 @@ -48,6 +49,7 @@ def restrictAbsoluteValueExtensionToIntermediate change w.1 (algebraMap F E x) = vF x exact w.2 x +open scoped Classical in @[simp] theorem restrictAbsoluteValueExtensionToIntermediate_apply (vF : AbsoluteValue F ℝ) @@ -58,6 +60,7 @@ theorem restrictAbsoluteValueExtensionToIntermediate_apply 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 @@ -70,6 +73,7 @@ def absoluteValueExtensionOverIntermediate val := w.1 property _ := rfl +open scoped Classical in /-- Restriction of an extension of a nontrivial absolute value remains nontrivial. -/ theorem restrictAbsoluteValueExtensionToIntermediate_isNontrivial @@ -87,6 +91,7 @@ theorem restrictAbsoluteValueExtensionToIntermediate_isNontrivial [(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. @@ -247,6 +252,7 @@ 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 ℝ) @@ -267,6 +273,7 @@ theorem absoluteValueDecompositionGroup_eq_of_absoluteValue_isEquiv (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 @@ -306,6 +313,7 @@ theorem absoluteValueDecompositionGroup_conjugate_eq_of_isMulCommutative 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 @@ -329,6 +337,7 @@ 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 @@ -365,6 +374,7 @@ theorem absoluteValueDecompositionGroup_conjugate_eq_bot ρ⁻¹ * 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 @@ -392,6 +402,7 @@ variable {K L : Type} [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 @@ -423,6 +434,7 @@ theorem exists_index_prime_normal_subgroup 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 : ℕ} @@ -437,6 +449,7 @@ noncomputable def cyclicPrimeIndexSubgroup 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) @@ -452,6 +465,7 @@ theorem cyclicPrimeIndexSubgroup_index 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) @@ -467,6 +481,7 @@ theorem cyclicPrimeIndexSubgroup_normal 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) @@ -484,6 +499,7 @@ theorem cyclicPrimeIndexSubgroup_quotient_card (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 : ℕ} @@ -499,6 +515,7 @@ noncomputable def cyclicPrimeSubextension 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 : ℕ} @@ -523,6 +540,7 @@ noncomputable instance cyclicPrimeSubextension_isGalois 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 : ℕ} @@ -565,6 +583,7 @@ theorem cyclicPrimeSubextension_finrank 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 @@ -598,6 +617,7 @@ theorem cyclicPrimeSubextension_isCyclic (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 @@ -629,6 +649,7 @@ noncomputable def cyclicPrimeSubextensionDecompositionGroup (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. -/ @@ -680,6 +701,7 @@ theorem cyclicPrimeSubextensionDecompositionGroup_eq_quotient_image 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 @@ -705,6 +727,7 @@ theorem finitePlaceSplitsCompletely_in_cyclicPrimeSubextension 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. -/ @@ -765,6 +788,7 @@ theorem finitePlaceSplitsCompletely_in_cyclicPrimeSubextension_actual 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 @@ -791,6 +815,7 @@ theorem finitePlace_not_splitsCompletely_of_not_in_cyclicPrimeSubextension_actua 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean index 376fe982fc..088ca8b807 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean @@ -412,7 +412,7 @@ theorem infinitePlaceTensorUnitsEquivAbove_localFieldIdeleInclusion simp only [Units.coe_map] change (InfinitePlace.Completion.equiv W.1).symm - (completionTensorDecomposition_left + (completionTensorDecompositionLeft w.1 w.isNontrivial (1 ⊗ₜ[K] (x : L)) (infinitePlaceAboveEquivExtension diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index 8396a84686..bc60b10264 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -144,7 +144,6 @@ noncomputable def relativeIdeleClassCongr (relativeIdelePrincipalSubgroup_map_congr (K := K) e) -@[simp] theorem relativeIdeleClassCongr_mk (e : L ≃ₐ[K] M) (a : RelativeIdeleGroup K L) : @@ -593,7 +592,6 @@ theorem relativeIdeleBaseChangeMulEquiv_smul_congr /-- On finite coordinates, canonical idelic transport is the completion map at the corresponding finite places. -/ -@[simp] theorem ideleCongr_finiteComponent (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) @@ -809,7 +807,6 @@ noncomputable def ideleClassCongr /-- The ordinary idele-class transport is induced by `ideleCongr` on quotient representatives. -/ -@[simp] theorem ideleClassCongr_mk (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) : @@ -856,6 +853,7 @@ 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) := @@ -1351,7 +1349,6 @@ noncomputable def relativeIdeleClassCongrOfAlgEquiv (relativeIdelePrincipalSubgroup_map_congrOfAlgEquiv eK eL h) -@[simp] theorem relativeIdeleClassCongrOfAlgEquiv_mk (eK : K ≃ₐ[ℚ] K') (eL : L ≃ₐ[ℚ] L') @@ -1438,7 +1435,6 @@ 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. -/ -@[simp] theorem relativeIdeleClassCongrOfAlgEquiv_ideleClassNorm (eK : K ≃ₐ[ℚ] K') (eL : L ≃ₐ[ℚ] L') @@ -1542,7 +1538,6 @@ 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. -/ -@[simp] theorem ordinaryIdeleClassNormQuotientCongrOfAlgEquiv_mk (eK : K ≃ₐ[ℚ] K') (eL : L ≃ₐ[ℚ] L') diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean index cf4f13239b..d474b61e55 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean @@ -241,7 +241,6 @@ def pushoutTowerClassInclusion : omit [NumberField M] [NumberField L] [NumberField N] [FiniteDimensional K M] [FiniteDimensional K L] [FiniteDimensional M N] [FiniteDimensional L N] in -@[simp] theorem pushoutTowerClassInclusion_mk (a : RelativeIdeleGroup K L) : pushoutTowerClassInclusion K M L N @@ -295,7 +294,6 @@ def pushoutNormQuotientMap : omit [NumberField M] [NumberField L] [NumberField N] [FiniteDimensional K M] [FiniteDimensional L N] in -@[simp] theorem pushoutNormQuotientMap_mk (c : IdeleClassGroup K) : pushoutNormQuotientMap K M L N @@ -375,7 +373,6 @@ def pushoutNormQuotientNormBack : K M L N c) omit [NumberField M] [NumberField L] [Algebra.IsPushout K M L N] in -@[simp] theorem pushoutNormQuotientNormBack_mk (c : RelativeIdeleGroup.ClassGroup K M) : pushoutNormQuotientNormBack K M L N diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean index 657b51f832..d1aac16e6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean @@ -81,7 +81,6 @@ noncomputable def connectedComponentQuotientCongr (e : G ≃ₜ* H) : continuous_invFun := hinv } /-- On representatives, the quotient equivalence applies the original map. -/ -@[simp] theorem connectedComponentQuotientCongr_mk (e : G ≃ₜ* H) (g : G) : connectedComponentQuotientCongr e diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean index 81040a7694..475fa6d6b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean @@ -51,7 +51,6 @@ noncomputable def classEmbedding rfl) omit [FiniteDimensional K L] [FiniteDimensional K M] in -@[simp] theorem classEmbedding_mk (f : L →ₐ[K] M) (a : RelativeIdeleGroup K L) : @@ -105,6 +104,7 @@ theorem classInclusion_ideleClassNorm_eq_prod_conjugates 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) ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean index 3740fc7164..1e8474f5cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean @@ -360,7 +360,6 @@ def classGroupEquiv : omit [NumberField M] [NumberField L] [FiniteDimensional K M] [FiniteDimensional M L] in -@[simp] theorem classGroupEquiv_mk (a : TowerRelativeIdeleGroup K M L) : classGroupEquiv K M L @@ -456,7 +455,6 @@ def classNorm : omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] [FiniteDimensional K M] in -@[simp] theorem classNorm_mk (a : TowerRelativeIdeleGroup K M L) : classNorm K M L @@ -572,7 +570,6 @@ def compositeToBaseNormQuotient : ⟨TowerRelativeIdeleGroup.classNorm K M L c, rfl⟩) omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in -@[simp] theorem intermediateToCompositeNormQuotient_mk (c : RelativeIdeleGroup.ClassGroup K M) : intermediateToCompositeNormQuotient K M L @@ -584,7 +581,6 @@ theorem intermediateToCompositeNormQuotient_mk rfl omit [NumberField M] [NumberField L] [Algebra K L] [IsScalarTower K M L] in -@[simp] theorem compositeToBaseNormQuotient_mk (c : IdeleClassGroup K) : compositeToBaseNormQuotient K M L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean index 4a041857ad..7e2f70bc5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean @@ -408,7 +408,6 @@ theorem relativeIdeleClassBaseChangeMulEquiv_congrOfAlgEquiv /-- Ordinary idele-class norms are natural under compatible equivalences of finite number-field extensions. -/ -@[simp] theorem ideleClassCongr_ideleClassNorm (eK : K ≃ₐ[ℚ] K') (eL : L ≃ₐ[ℚ] L') diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean index 3f5eddafda..ae3ee8395f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean @@ -554,7 +554,6 @@ noncomputable def towerRelativeIdeleClassBaseChangeMulEquiv : omit [NumberField L] [Algebra K L] [IsScalarTower K M L] [FiniteDimensional M L] in -@[simp] theorem towerRelativeIdeleClassBaseChangeMulEquiv_mk (a : TowerRelativeIdeleGroup K M L) : towerRelativeIdeleClassBaseChangeMulEquiv K M L @@ -932,7 +931,6 @@ noncomputable def intermediateClassNormQuotientBaseChangeMulEquiv : (towerClassNorm_range_map_baseChange K M L) omit [NumberField L] [Algebra K L] [IsScalarTower K M L] in -@[simp] theorem intermediateClassNormQuotientBaseChangeMulEquiv_mk (c : RelativeIdeleGroup.ClassGroup K M) : intermediateClassNormQuotientBaseChangeMulEquiv K M L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean index 8fa254cdab..1a9ab1c322 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -417,7 +417,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandH0Equiv [FiniteDimensional k ell] [ValuativeRel ell] [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] - (e : H ≃* Gal(ell / k)) + (e : H ≃* Gal(ell/k)) (σ : G) (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : letI : MulDistribMulAction H 𝒪[ell]ˣ := @@ -441,7 +441,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandHMinusOneEquiv [FiniteDimensional k ell] [ValuativeRel ell] [MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ] - (e : H ≃* Gal(ell / k)) + (e : H ≃* Gal(ell/k)) (σ : G) (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : letI : MulDistribMulAction H 𝒪[ell]ˣ := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean index 3f8e78c72a..16c53b3f80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -109,7 +109,6 @@ noncomputable def ideleClassNorm : K L x).symm) omit [NumberField L] [IsGalois K L] in -@[simp] theorem ideleClassNorm_mk (a : RelativeIdeleGroup K L) : ideleClassNorm K L @@ -126,16 +125,19 @@ abbrev IdeleClassNormQuotient := 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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean index 882f51b407..df324fcdab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean @@ -13,7 +13,7 @@ This leaf transports the finite-family Herbrand calculation to the actual unrestricted relative S-idele factors. -/ -open scoped NumberField BigOperators ValuativeRel Classical NNReal +open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain noncomputable section @@ -36,6 +36,7 @@ variable {K L : Type} -/ omit [NumberField L] in +open scoped Classical in @[reducible] private noncomputable def relativeUnrestrictedSPlaceFactorsActionProvider @@ -47,6 +48,7 @@ private noncomputable def (K := K) (L := L) S omit [NumberField L] in +open scoped Classical in @[reducible] private noncomputable def relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider @@ -60,6 +62,7 @@ private noncomputable def (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. -/ @@ -97,6 +100,7 @@ noncomputable def (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. -/ @@ -135,6 +139,7 @@ noncomputable def (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 @@ -171,6 +176,7 @@ theorem relativeUnrestrictedSPlaceFactorsHerbrandH0Finite (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 @@ -207,6 +213,7 @@ theorem relativeUnrestrictedSPlaceFactorsHerbrandHMinusOneFinite (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 @@ -269,6 +276,7 @@ theorem S σ hgen omit [NumberField L] in +open scoped Classical in /-- Degree minus one for the actual unrestricted factors: the group has one element. -/ theorem @@ -326,6 +334,7 @@ theorem 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))) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean index 303a30c20c..ff70fbe9d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean @@ -12,7 +12,7 @@ This leaf computes the two finite-family Herbrand cardinalities from the finiteness results and the canonical family instance providers. -/ -open scoped NumberField BigOperators ValuativeRel Classical NNReal +open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain noncomputable section @@ -31,6 +31,7 @@ variable {K L : Type} [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 @@ -132,6 +133,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean index ab1cf8bf68..0b2289382b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean @@ -12,7 +12,7 @@ This leaf assembles the local Herbrand calculations over the finite family of unrestricted places. -/ -open scoped NumberField BigOperators ValuativeRel Classical NNReal +open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain noncomputable section @@ -30,6 +30,7 @@ variable {K L : Type} [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 @@ -98,6 +99,7 @@ theorem relativeUnrestrictedLocalBlockFamilyHerbrandH0Finite 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean index 98374a2aaa..6eef582957 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean @@ -15,7 +15,7 @@ real/complex norm calculation. It treats the finite family consisting of all infinite places and the finite places in `S`. -/ -open scoped NumberField BigOperators ValuativeRel Classical NNReal +open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain noncomputable section @@ -33,6 +33,7 @@ variable {K L : Type} [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. -/ @@ -46,7 +47,9 @@ noncomputable def relativeUnrestrictedSPlaceLocalDegree (K := K) (L := L) S i).extension.1)) omit [NumberField K] [NumberField L] in -/-- The decomposition-group localization equivalence identifies the order of a decomposition group with +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) @@ -96,6 +99,7 @@ theorem absoluteValueDecompositionGroup_card_eq_localizedDegree 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 @@ -140,6 +144,7 @@ theorem relativeUnrestrictedLocalHerbrandH0Finite σ hgen omit [NumberField L] in +open scoped Classical in /-- Every local degree-minus-one Herbrand group in the unrestricted family is finite. -/ theorem relativeUnrestrictedLocalHerbrandHMinusOneFinite @@ -189,6 +194,7 @@ theorem relativeUnrestrictedLocalHerbrandHMinusOneFinite σ 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))) @@ -261,6 +267,7 @@ theorem relativeUnrestrictedLocalHerbrandH0_card_eq_localDegree (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))) 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 index 3781f7ae23..49d6da02d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean @@ -34,7 +34,8 @@ 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 +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean index 11118e9cad..ac9efb8880 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean @@ -23,7 +23,7 @@ It also compares the concrete tensor-coordinate supported subgroup of relative ideles with the ordinary supported idele subgroup of `L`. -/ -open scoped Classical NumberField TensorProduct +open scoped NumberField TensorProduct open NumberField IsDedekindDomain noncomputable section @@ -35,6 +35,7 @@ variable [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 @@ -44,6 +45,7 @@ noncomputable def finitePlacesAbove (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))) @@ -53,6 +55,7 @@ theorem mem_finitePlacesAbove_iff 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] @@ -81,6 +84,7 @@ theorem finitePlaceBelow_finitePlaceEquiv (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 @@ -96,6 +100,7 @@ theorem finitePlacesAbove_isGaloisStable 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. -/ @@ -151,6 +156,7 @@ theorem relativeIdeleBaseChange_mem_supportedAt_iff exact hlocal omit [IsGalois K L] in +open scoped Classical in /-- Subgroup-level form of `relativeIdeleBaseChange_mem_supportedAt_iff`. -/ theorem relativeIdeleLocalTensorDecompositionSupportedSubgroup_map_baseChange @@ -179,6 +185,7 @@ theorem relativeIdeleLocalTensorDecompositionSupportedSubgroup_map_baseChange (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. -/ @@ -209,6 +216,7 @@ theorem relativeIdeleSupported_sup_principal_eq_top (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 @@ -246,6 +254,7 @@ theorem principalIdele_mem_supportedAt_iff_sUnit 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 @@ -285,6 +294,7 @@ noncomputable def sUnitToRelativePrincipalSupportedIntersection 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`. -/ @@ -349,6 +359,7 @@ noncomputable def sUnitEquivRelativePrincipalSupportedIntersection apply Subtype.ext exact hx⟩ +open scoped Classical in /-- The restricted Galois action on the intersection of the relative principal and supported subgroups. -/ @[reducible] @@ -389,6 +400,7 @@ noncomputable def relativePrincipalSupportedIntersectionAction 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 @@ -433,6 +445,7 @@ theorem (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 : @@ -441,6 +454,7 @@ noncomputable def ramifiedBaseFinitePlaces : (𝓞 K) (𝓞 L)).toFinset omit [FiniteDimensional K L] [IsGalois K L] in +open scoped Classical in @[simp] theorem mem_ramifiedBaseFinitePlaces_iff (v : HeightOneSpectrum (𝓞 K)) : @@ -450,6 +464,7 @@ theorem mem_ramifiedBaseFinitePlaces_iff ¬ 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 : @@ -461,6 +476,7 @@ noncomputable def ideleClassHerbrandSupport : 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 : @@ -480,6 +496,7 @@ theorem sufficientlyLargeFiniteSet_subset_finitePlacesAbove_support : 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 : @@ -498,6 +515,7 @@ theorem supportedAboveHerbrandSupport_sup_principal_eq_top : 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. -/ @@ -514,6 +532,7 @@ theorem relativeSupportedAboveHerbrandSupport_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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean index 314578accf..9880cd1339 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -283,7 +283,6 @@ theorem smul_def rfl omit [NumberField L] [FiniteDimensional K L] in -@[simp] theorem smul_inclusion (σ : L ≃ₐ[K] L) (a : IdeleGroup K) : σ • inclusion K L a = inclusion K L a := by @@ -304,7 +303,6 @@ theorem smul_inclusion exact (conjugation K L σ).commutes _ omit [NumberField L] [FiniteDimensional K L] in -@[simp] theorem smul_principalIdele (σ : L ≃ₐ[K] L) (x : Lˣ) : σ • principalIdele K L x = @@ -326,7 +324,7 @@ def galoisAverage omit [NumberField L] in theorem galoisAverage_eq_of_fixed - [IsGalois K L] + (z : RelativeAdeleRing K L) (hz : ∀ σ : L ≃ₐ[K] L, conjugation K L σ z = z) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean index 0482f7bd92..f43594c738 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean @@ -140,7 +140,6 @@ def classInclusion : rw [← comap_principalSubgroup K L]) omit [NumberField L] [FiniteDimensional K L] in -@[simp] theorem classInclusion_mk (a : IdeleGroup K) : classInclusion K L (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = @@ -165,7 +164,6 @@ noncomputable def classNorm : K L x).symm) omit [NumberField L] in -@[simp] theorem classNorm_mk (a : RelativeIdeleGroup K L) : classNorm K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean index 910c44b6b1..f4bcab9ef4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean @@ -52,7 +52,7 @@ theorem embeddingToAlgebraicClosure_injective : (DFunLike.congr_fun h x) theorem embeddingToAlgebraicClosure_surjective - [FiniteDimensional K M] [Normal K M] : + [Normal K M] : Function.Surjective (embeddingToAlgebraicClosure (K := K) (L := L) (M := M)) := by @@ -109,7 +109,7 @@ theorem restrict_liftSubextensionEmbedding /-- The canonical map from right cosets of the fixing subgroup to embeddings of the subextension. -/ noncomputable def cosetToEmbedding - [Normal K M] : + : (M ≃ₐ[K] M) ⧸ fixingSubextension (K := K) (L := L) (M := M) → (L →ₐ[K] M) := @@ -219,6 +219,7 @@ variable [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) ⧸ @@ -228,7 +229,7 @@ local instance : /-- The linear polynomial representing a chosen `K`-embedding `L → M`. -/ def embeddingPolynomial - {ι : Type z} [Fintype ι] [DecidableEq ι] + {ι : Type z} [Fintype ι] (b : Module.Basis ι K L) (f : L →ₐ[K] M) : MvPolynomial ι M := ∑ i, MvPolynomial.X i * @@ -239,13 +240,15 @@ omit [Algebra L M] [IsScalarTower K L M] [IsGalois K M] in @[simp] theorem eval_embeddingPolynomial - {ι : Type z} [Fintype ι] [DecidableEq ι] + {ι : 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] @@ -346,7 +349,7 @@ omit [Algebra L M] [IsScalarTower K L M] is the corresponding tensor-algebra embedding. -/ theorem eval₂_embeddingPolynomial_baseChange (A : Type*) [CommRing A] [Algebra K A] - {ι : Type z} [Fintype ι] [DecidableEq ι] + {ι : Type z} [Fintype ι] (b : Module.Basis ι K L) (f : L →ₐ[K] M) (x : A ⊗[K] L) : MvPolynomial.eval₂ @@ -358,6 +361,8 @@ theorem eval₂_embeddingPolynomial_baseChange ((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, @@ -491,6 +496,7 @@ variable [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) ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean index ea51d8f0fa..95d1a5a36b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -106,7 +106,7 @@ 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 - [IsGalois K L] + (a : RelativeIdeleGroup K L) (ha : ∀ σ : L ≃ₐ[K] L, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean index b15d2b6a15..d99739ac54 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean @@ -55,7 +55,7 @@ theorem eval_normPolynomial /-- The linear polynomial whose value at the coordinates of `x` is the `σ`-conjugate of `x`. -/ def conjugatePolynomial - {ι : Type w} [Fintype ι] [DecidableEq ι] + {ι : Type w} [Fintype ι] (b : Module.Basis ι K L) (σ : L ≃ₐ[K] L) : MvPolynomial ι L := ∑ i, MvPolynomial.X i * MvPolynomial.C (σ (b i)) @@ -63,12 +63,14 @@ def conjugatePolynomial omit [FiniteDimensional K L] in @[simp] theorem eval_conjugatePolynomial - {ι : Type w} [Fintype ι] [DecidableEq ι] + {ι : 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 @@ -209,7 +211,7 @@ omit [FiniteDimensional K L] in base-changed element gives its actual scalar-extended conjugate. -/ theorem eval₂_conjugatePolynomial_baseChange (A : Type*) [CommRing A] [Algebra K A] - {ι : Type w} [Fintype ι] [DecidableEq ι] + {ι : Type w} [Fintype ι] (b : Module.Basis ι K L) (σ : L ≃ₐ[K] L) (z : A ⊗[K] L) : MvPolynomial.eval₂ @@ -220,6 +222,8 @@ theorem eval₂_conjugatePolynomial_baseChange ((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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean index ca5181c023..f2a60ae8dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean @@ -273,7 +273,6 @@ theorem count_extension omit [FiniteDimensional K L] [IsGalois K L] in /-- Extension of a prime fractional ideal commutes with passage to the ideal class group. -/ -@[simp] theorem classGroup_mk_extension_prime (w : HeightOneSpectrum (𝓞 K)) : ClassGroup.mk L (extension K L (prime w)) = @@ -436,7 +435,6 @@ theorem extension_infiniteComponent omit [IsGalois K L] in /-- The finite component of an extended idele is the canonical local completion map applied to the component below it. -/ -@[simp] theorem extension_finiteComponent (a : IdeleGroup K) (W : HeightOneSpectrum (𝓞 L)) : @@ -823,7 +821,6 @@ noncomputable def ideleClassExtension : (IdeleGroup.extension_principalIdele K L x).symm⟩) omit [IsGalois K L] in -@[simp] theorem ideleClassExtension_mk (a : IdeleGroup K) : ideleClassExtension K L (QuotientGroup.mk' diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean index 6f608c2b5c..d4e392af51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean @@ -65,7 +65,6 @@ noncomputable def relativeIdeleClassBaseChangeMulEquiv : (relativeIdelePrincipalSubgroup_map_baseChange (K := K) (L := L)) -@[simp] theorem relativeIdeleClassBaseChangeMulEquiv_mk (z : RelativeIdeleGroup K L) : relativeIdeleClassBaseChangeMulEquiv diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean index cd6306e4e6..824498b64e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean @@ -80,7 +80,6 @@ noncomputable def ideleClassNorm : ⟨Units.map (Algebra.norm K) x, (IdeleGroup.norm_principalIdele K L x).symm⟩) -@[simp] theorem ideleClassNorm_mk (a : IdeleGroup L) : ideleClassNorm K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean index d2ced2baf4..0b08aab53e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean @@ -49,7 +49,7 @@ private theorem finiteComponent_norm_eq_prod_extensions RelativeIdeleGroup.finiteComponent (K := K) (L := L) v z letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -79,7 +79,7 @@ private theorem finiteComponent_norm_eq_prod_extensions RelativeIdeleGroup.finiteComponent (K := K) (L := L) v z let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -132,7 +132,7 @@ private theorem finiteComponent_norm_eq_prod_extensions (x : v.adicCompletion K ⊗[K] L) _ = ∏ w : AbsoluteValueExtension vK L, Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (x' : vK.Completion ⊗[K] L) w) := by exact @@ -162,7 +162,7 @@ private theorem finiteComponent_norm_eq_prod_completion let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -196,7 +196,7 @@ private theorem finiteComponent_norm_eq_prod_completion RelativeIdeleGroup.finiteComponent (K := K) (L := L) v z let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -315,7 +315,7 @@ private theorem finiteComponent_norm_eq_prod_exact_index let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra (v.adicCompletion K) @@ -342,7 +342,7 @@ private theorem finiteComponent_norm_eq_prod_exact_index _root_.relativeFinitePlaceCompletionAlgEquiv (K := K) v let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -490,7 +490,7 @@ theorem finiteComponent_norm_eq_prod let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let eAbove := finitePlaceExtensionEquivAbove @@ -518,7 +518,7 @@ theorem finiteComponent_norm_eq_prod finitePlaceExtensionEquivAbove (K := K) (L := L) v let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v} := @@ -585,7 +585,7 @@ private theorem infiniteComponent_norm_eq_prod_extensions _root_.infinitePlaceLocalTensorUnitsEquiv (K := K) (L := L) v x letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -617,7 +617,7 @@ private theorem infiniteComponent_norm_eq_prod_extensions _root_.infinitePlaceLocalTensorUnitsEquiv (K := K) (L := L) v x let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -666,7 +666,7 @@ private theorem infiniteComponent_norm_eq_prod_extensions (x : v.Completion ⊗[K] L) _ = ∏ w : AbsoluteValueExtension vK L, Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (x' : vK.Completion ⊗[K] L) w) := by exact @@ -695,7 +695,7 @@ private theorem infiniteComponent_norm_eq_prod_completion _root_.infinitePlaceAboveEquivExtension (K := K) (L := L) v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -751,7 +751,7 @@ private theorem infiniteComponent_norm_eq_prod_completion _root_.infinitePlaceAboveEquivExtension (K := K) (L := L) v let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -881,7 +881,7 @@ theorem infiniteComponent_norm_eq_prod _root_.infinitePlaceAboveEquivExtension (K := K) (L := L) v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : Fintype {W : InfinitePlace L // _root_.infinitePlaceBelow (K := K) W = v} := @@ -908,7 +908,7 @@ theorem infiniteComponent_norm_eq_prod _root_.infinitePlaceAboveEquivExtension (K := K) (L := L) v let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : InfinitePlace L // _root_.infinitePlaceBelow (K := K) W = v} := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean index 253056f068..2b54ae897c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean @@ -104,7 +104,6 @@ theorem finiteAdeleComponentAlgHom_apply finiteAdeleComponentAlgHom v a = a.2 v := rfl -@[simp] theorem finiteAdeleComponentAlgHom_algebraMap (v : HeightOneSpectrum (𝓞 K)) (x : K) : finiteAdeleComponentAlgHom v @@ -251,7 +250,6 @@ def localTensorNorm omit [NumberField L] in /-- The finite component of the global relative-idele norm is the determinant norm of the corresponding local tensor component. -/ -@[simp] theorem RelativeIdeleGroup.finiteComponent_norm (v : HeightOneSpectrum (𝓞 K)) (a : RelativeIdeleGroup K L) : @@ -278,7 +276,6 @@ theorem RelativeIdeleGroup.finiteComponent_norm omit [NumberField L] in /-- The infinite component of the global relative-idele norm is the determinant norm of the corresponding archimedean tensor component. -/ -@[simp] theorem RelativeIdeleGroup.infiniteComponent_norm (v : InfinitePlace K) (a : RelativeIdeleGroup K L) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean index 03e5098fc0..cefc93d244 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean @@ -42,7 +42,7 @@ theorem localNorm_eq_prod (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (z : vK.Completion ⊗[K] L) : letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -53,11 +53,11 @@ theorem localNorm_eq_prod _root_.Algebra.norm vK.Completion z = ∏ w : AbsoluteValueExtension vK L, _root_.Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK z w) := by classical let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -70,7 +70,7 @@ theorem localNorm_eq_prod Module.Finite vK.Completion w.1.Completion := fun w ↦ completionModuleFinite vK hvK w let e := - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK calc _root_.Algebra.norm vK.Completion z = @@ -92,7 +92,7 @@ theorem localNorm_units_eq_prod (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (z : (vK.Completion ⊗[K] L)ˣ) : letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := @@ -104,7 +104,7 @@ theorem localNorm_units_eq_prod vK.Completionˣ) : vK.Completion) = ∏ w : AbsoluteValueExtension vK L, _root_.Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (z : _) w) := by exact localNorm_eq_prod vK hvK (z : vK.Completion ⊗[K] L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean index f4f8dc1b59..96e19e310d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean @@ -44,7 +44,6 @@ theorem localOrder_apply (v : HeightOneSpectrum (𝓞 K)) -WithZero.log (Valued.v (x : v.adicCompletion K)) := rfl -@[simp] theorem localOrder_eq_zero_iff (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) : (localOrder v x).toAdd = 0 ↔ @@ -127,7 +126,6 @@ def chosenLocalOrderSection (v : HeightOneSpectrum (𝓞 K)) (n : ℤ) : rw [hx, map_zero] at hval exact WithZero.exp_ne_zero hval.symm) -@[simp] theorem localOrder_chosenLocalOrderSection (v : HeightOneSpectrum (𝓞 K)) (n : ℤ) : (localOrder v (chosenLocalOrderSection v n)).toAdd = n := by @@ -170,7 +168,7 @@ theorem valuationVector_surjective : end FiniteIdeleGroup /-- The group of nonzero fractional ideals of a number field. -/ -abbrev FractionalIdealGroup (K : Type*) [Field K] [NumberField K] := +abbrev FractionalIdealGroup (K : Type*) [Field K] := (FractionalIdeal (nonZeroDivisors (𝓞 K)) K)ˣ namespace FractionalIdealGroup @@ -235,7 +233,6 @@ theorem countVector_apply (I : FractionalIdealGroup K) (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := rfl -@[simp] theorem count_factorization (exps : Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) (v : HeightOneSpectrum (𝓞 K)) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean index c91c5de40d..ae2a1f4c9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean @@ -32,7 +32,7 @@ All choices are made from the extension theorem for absolute values; none of the local conclusions is included as input data. -/ -open scoped NumberField Classical NNReal +open scoped NumberField NNReal open NumberField IsDedekindDomain noncomputable section @@ -49,6 +49,7 @@ variable {K L : Type} [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 @@ -59,6 +60,7 @@ noncomputable def finitePlaceCompletionBaseMap (WithAbs.equiv (NumberField.HeightOneSpectrum.adicAbv K v)).toRingHom +open scoped Classical in @[simp] theorem finitePlaceCompletionBaseMap_apply (v : HeightOneSpectrum (𝓞 K)) @@ -70,6 +72,7 @@ theorem finitePlaceCompletionBaseMap_apply (NumberField.HeightOneSpectrum.adicAbv K v) x) := rfl +open scoped Classical in theorem finitePlaceCompletionBaseMap_norm (v : HeightOneSpectrum (𝓞 K)) (x : WithAbs @@ -79,6 +82,7 @@ theorem finitePlaceCompletionBaseMap_norm FinitePlace.norm_embedding] rfl +open scoped Classical in /-- The base embedding is an isometry. -/ theorem finitePlaceCompletionBaseMap_isometry (v : HeightOneSpectrum (𝓞 K)) : @@ -86,6 +90,7 @@ theorem finitePlaceCompletionBaseMap_isometry 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)) : @@ -95,6 +100,7 @@ noncomputable def finitePlaceCompletionRingHom (finitePlaceCompletionBaseMap v) (finitePlaceCompletionBaseMap_isometry v).continuous +open scoped Classical in @[simp] theorem finitePlaceCompletionRingHom_coe (v : HeightOneSpectrum (𝓞 K)) @@ -108,11 +114,13 @@ theorem finitePlaceCompletionRingHom_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 @@ -146,6 +154,7 @@ theorem finitePlaceCompletionRingHom_surjective 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)) : @@ -155,6 +164,7 @@ noncomputable def finitePlaceCompletionRingEquiv ⟨(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)) : @@ -167,6 +177,7 @@ noncomputable def finitePlaceCompletionContinuousMulEquiv ((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 @@ -176,6 +187,7 @@ noncomputable def finitePlaceCompletionUnitsContinuousMulEquiv 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. -/ @@ -188,6 +200,7 @@ noncomputable def chosenFinitePlaceExtension (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)) := @@ -195,6 +208,7 @@ abbrev ChosenFinitePlaceLocalizedCompletion (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. -/ @@ -218,6 +232,7 @@ noncomputable def chosenFinitePlaceLocalNormSubgroup (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 @@ -245,7 +260,7 @@ theorem chosenFinitePlaceLocalNormSubgroup_isOpen let : IsGalois vK.Completion E := HilbertRamification.algebraicLocalization_isGalois vK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -291,6 +306,7 @@ theorem chosenFinitePlaceLocalNormSubgroup_isOpen 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 @@ -299,6 +315,7 @@ abbrev ChosenFinitePlaceNormQuotient 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 @@ -316,6 +333,7 @@ noncomputable def ChosenFinitePlaceIntrinsicNormQuotient NormQuotient vK.Completion (LocalizedCompletion vK w) +open scoped Classical in noncomputable instance chosenFinitePlaceIntrinsicNormQuotientCommGroup (v : HeightOneSpectrum (𝓞 K)) : @@ -325,6 +343,7 @@ noncomputable instance 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 @@ -360,6 +379,7 @@ noncomputable def chosenFinitePlaceNormQuotientEquiv e heq) omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem chosenFinitePlaceNormQuotientEquiv_normClass (v : HeightOneSpectrum (𝓞 K)) @@ -393,6 +413,7 @@ theorem chosenFinitePlaceNormQuotientEquiv_normClass 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))) : @@ -406,6 +427,7 @@ noncomputable def chosenFinitePlaceNormQuotientFamilyEquiv 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 @@ -419,6 +441,7 @@ noncomputable def principalLocalNormQuotientMap (K := K) (L := L) v.1) omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem principalLocalNormQuotientMap_apply (S : Finset (HeightOneSpectrum (𝓞 K))) @@ -431,6 +454,7 @@ theorem principalLocalNormQuotientMap_apply ((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ˣ`. -/ @@ -447,6 +471,7 @@ theorem principalLocalNormQuotientMap_surjective 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 @@ -460,6 +485,7 @@ noncomputable def principalIntrinsicLocalNormQuotientMap (principalLocalNormQuotientMap (K := K) (L := L) S) +open scoped Classical in /-- Surjectivity in the intrinsic `NormQuotient` model. -/ theorem principalIntrinsicLocalNormQuotientMap_surjective (S : Finset (HeightOneSpectrum (𝓞 K))) : @@ -480,6 +506,7 @@ theorem principalIntrinsicLocalNormQuotientMap_surjective 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 @@ -505,6 +532,7 @@ theorem mem_ker_principalLocalNormQuotientMap_iff (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean index 62626c1989..f23674cf24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean @@ -10,7 +10,8 @@ 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 +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean index 0508a1802f..5e45f69bde 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -19,7 +19,7 @@ principal-idele norm formula to prove compactness of the norm-one subgroup of the idele class group. -/ -open scoped Classical NumberField Pointwise RestrictedProduct NNReal +open scoped NumberField Pointwise RestrictedProduct NNReal open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem @@ -30,6 +30,7 @@ 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 : @@ -41,6 +42,7 @@ def integralStructureMap : (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 @@ -54,6 +56,7 @@ theorem range_integralStructureMap : 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 @@ -84,6 +87,7 @@ 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ˣ := @@ -91,6 +95,7 @@ def localAnnulus (w : InfinitePlace K) (B : ℝ) : ‖(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 @@ -142,12 +147,14 @@ theorem isCompact_localAnnulus (w : InfinitePlace K) (B : ℝ) : (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 @@ -155,6 +162,7 @@ theorem isCompact_annulus (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, @@ -173,6 +181,7 @@ theorem mem_annulus_iff (a : InfiniteIdeleGroup K) (B : ℝ) : 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 @@ -189,6 +198,7 @@ theorem continuous_archimedeanNorm : ((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) : @@ -196,6 +206,7 @@ def logNorm (a : InfiniteIdeleGroup 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 @@ -211,11 +222,13 @@ theorem logNorm_mul (a b : InfiniteIdeleGroup K) : 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 : @@ -226,6 +239,7 @@ theorem norm_infiniteComponent_principalIdele (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)ˣ) : @@ -237,6 +251,7 @@ theorem logNorm_principalRingUnit (u : (𝓞 K)ˣ) : norm_infiniteComponent_principalIdele] rfl +open scoped Classical in theorem logNorm_component_le {r : ℝ} (a : InfiniteIdeleGroup K) (h : ‖logNorm a‖ ≤ r) (w : {w : InfinitePlace K // @@ -245,6 +260,7 @@ theorem logNorm_component_le {r : ℝ} (a : InfiniteIdeleGroup K) 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 @@ -305,6 +321,7 @@ theorem sum_logNorm_eq_neg_distinguished (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 @@ -347,6 +364,7 @@ theorem abs_log_norm_component_le (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 @@ -395,6 +413,7 @@ theorem mem_annulus_of_logNorm_le (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. -/ private def unitLatticeRealBasis : Module.Basis @@ -405,15 +424,18 @@ private def unitLatticeRealBasis : (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. -/ @@ -462,6 +484,7 @@ 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 @@ -481,6 +504,7 @@ theorem principalRingUnit_mem_integralAtFinitePlaces 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)) : @@ -493,6 +517,7 @@ theorem finite_absoluteNorm_eq_one_of_integral 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 @@ -507,6 +532,7 @@ theorem archimedeanNorm_eq_one_of_normOne_integral 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) := @@ -517,6 +543,7 @@ def compactIntegralNormOneSet : Set (IdeleGroup 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 @@ -528,6 +555,7 @@ theorem isCompact_compactIntegralNormOneSet : · 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) @@ -543,6 +571,7 @@ theorem mem_compactIntegralNormOneSet_iff (a : IdeleGroup 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 @@ -602,6 +631,7 @@ theorem exists_compactIntegralNormOneSet_representative 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. -/ private def normOneIdealClassRepresentative @@ -612,6 +642,7 @@ private def normOneIdealClassRepresentative else 1 +open scoped Classical in private theorem normOneIdealClassRepresentative_mem (c : ClassGroup (𝓞 K)) : normOneIdealClassRepresentative (K := K) c ∈ @@ -621,6 +652,7 @@ private theorem normOneIdealClassRepresentative_mem · 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, @@ -629,22 +661,26 @@ private theorem idealClass_normOneIdealClassRepresentative 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. -/ @@ -709,11 +745,13 @@ theorem exists_integral_normOne_reduction 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 @@ -721,6 +759,7 @@ theorem isCompact_compactNormOneClassCover : (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 @@ -731,6 +770,7 @@ theorem compactIntegralNormOneSet_subset_normOne : 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 @@ -743,6 +783,7 @@ 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 : @@ -796,6 +837,7 @@ theorem image_compactNormOneClassCover : QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a := hbClass +open scoped Classical in /-- The norm-one idele class group is compact. -/ theorem normOneSubgroup_isCompact : IsCompact @@ -806,6 +848,7 @@ theorem normOneSubgroup_isCompact : (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)) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean index d1d7eeb9ba..5afa12e7a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean @@ -342,7 +342,7 @@ theorem archimedeanNorm_norm let vK := v₀.1 let hvK : vK.IsNontrivial := v₀.isNontrivial let := - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let eAbove := infinitePlaceAboveEquivExtension (K := K) (L := L) v₀ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean index 287817fcec..1058824c85 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -118,7 +118,7 @@ private noncomputable def integralFiniteNormComponents finitePlaceExtensionEquivAbove (K := K) (L := L) v₀ letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK0 letI : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v₀} := @@ -161,7 +161,7 @@ private theorem integralFiniteNormComponents_continuous : finitePlaceExtensionEquivAbove (K := K) (L := L) v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK0 let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v₀} := @@ -262,7 +262,8 @@ private theorem infinitePlace_normUnits_continuous have hExtensionUnitsContinuous : Continuous eExtensionUnits := by change Continuous (Units.map eExtension.toMonoidHom) refine - ((InfinitePlace.Completion.isometryEquivRealOfIsReal hWReal).continuous.units_map _).congr ?_ + ((InfinitePlace.Completion.isometryEquivRealOfIsReal hWReal).continuous.units_map + _).congr ?_ intro x apply Units.ext rfl @@ -317,7 +318,8 @@ private theorem infinitePlace_normUnits_continuous have hExtensionUnitsContinuous : Continuous eExtensionUnits := by change Continuous (Units.map eExtension.toMonoidHom) refine - ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex hWComplex).continuous.units_map _).congr ?_ + ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).continuous.units_map _).congr ?_ intro x apply Units.ext rfl @@ -354,7 +356,8 @@ private theorem infinitePlace_normUnits_continuous 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 _ + (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 @@ -385,7 +388,8 @@ private theorem infinitePlace_normUnits_continuous have hExtensionUnitsContinuous : Continuous eExtensionUnits := by change Continuous (Units.map eExtension.toMonoidHom) refine - ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex hWComplex).continuous.units_map _).congr ?_ + ((InfinitePlace.Completion.isometryEquivComplexOfIsComplex + hWComplex).continuous.units_map _).congr ?_ intro x apply Units.ext rfl @@ -548,7 +552,7 @@ private theorem norm_integralIdeleEmbedding_finite finitePlaceExtensionEquivAbove (K := K) (L := L) v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK0 let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v₀} := @@ -590,7 +594,7 @@ private theorem norm_integralIdeleEmbedding_infinite let vK := v₀.1 let hvK : vK.IsNontrivial := v₀.isNontrivial let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK change infiniteComponent v₀ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean index d07648a9e1..e09764d338 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -14,7 +14,7 @@ base-change realization is included as the endpoint used by cyclotomic reciprocity. -/ -open scoped BigOperators Classical NumberField NumberField.LiesOver +open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain noncomputable section @@ -30,6 +30,7 @@ variable [Algebra K L] [FiniteDimensional K L] omit [NumberField L] in +open scoped Classical in private theorem infinitePlaceCompletionMap_isometry (v₀ : InfinitePlace K) (W : InfinitePlace L) @@ -45,6 +46,7 @@ private theorem infinitePlaceCompletionMap_isometry (InfinitePlace.Completion.isometryEquivCompletion v₀).isometry) 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 @@ -71,6 +73,7 @@ private theorem nnnormUnitHom_infinitePlaceCompletionMap (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 @@ -89,6 +92,7 @@ private noncomputable def infinitePlaceFiberEquivPlacesOver 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 @@ -133,6 +137,7 @@ private theorem infinitePlace_mult_eq_base_mult_mul_inertiaDeg ⟨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 @@ -168,6 +173,7 @@ private theorem infinitePlaceFiber_inertiaDeg_sum 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 @@ -200,6 +206,7 @@ private theorem infinitePlaceFiber_mult_sum 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 @@ -318,6 +325,7 @@ theorem archimedeanNorm_extension 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 @@ -341,6 +349,7 @@ theorem absoluteNorm_extension 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean index 5e03eba47b..89fb61eb95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean @@ -166,7 +166,7 @@ theorem finiteComponentOrder_norm let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v₀ letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let eAbove := finitePlaceExtensionEquivAbove @@ -193,7 +193,7 @@ theorem finiteComponentOrder_norm let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let eAbove := finitePlaceExtensionEquivAbove @@ -284,7 +284,7 @@ theorem finiteAbsoluteNorm_norm let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let eAbove := finitePlaceExtensionEquivAbove diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean index 62a24a4797..9b58955841 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean @@ -16,7 +16,7 @@ norm is a prescribed inverse. Its finite components are trivial and all of its infinite components lie in the standard positive subgroups. -/ -open scoped Classical IsMulCommutative NNReal NumberField Topology +open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem @@ -28,6 +28,7 @@ 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. -/ private noncomputable def positiveArchimedeanLocalComponent @@ -48,6 +49,7 @@ private noncomputable def positiveArchimedeanLocalComponent ((Units.map Complex.ofRealHom.toMonoidHom).comp (Units.map NNReal.toRealHom.toMonoidHom)) +open scoped Classical in /-- The positive local archimedean component, with its natural continuity. -/ private noncomputable def positiveArchimedeanLocalComponentContinuous (v : InfinitePlace K) : @@ -95,6 +97,7 @@ private noncomputable def positiveArchimedeanLocalComponentContinuous congr 2 omit [NumberField K] in +open scoped Classical in @[simp] private theorem positiveArchimedeanLocalComponentContinuous_apply (v : InfinitePlace K) (r : ℝ≥0ˣ) : @@ -103,6 +106,7 @@ private theorem positiveArchimedeanLocalComponentContinuous_apply rfl omit [NumberField K] in +open scoped Classical in private theorem positiveArchimedeanLocalComponent_nnnorm (v : InfinitePlace K) (r : ℝ≥0ˣ) : ‖((positiveArchimedeanLocalComponent v r : @@ -190,6 +194,7 @@ private theorem positiveArchimedeanLocalComponent_nnnorm 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 ∈ @@ -226,6 +231,7 @@ private theorem positiveArchimedeanLocalComponent_mem_positive 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. -/ private noncomputable def positiveArchimedeanRoot : @@ -234,6 +240,7 @@ private noncomputable def positiveArchimedeanRoot : (NNReal.rpowMonoidHom (((w₀ (K := K)).mult : ℝ)⁻¹)) +open scoped Classical in /-- The positive root map used in the archimedean section is continuous. -/ private noncomputable def positiveArchimedeanRootContinuous : ℝ≥0ˣ →ₜ* ℝ≥0ˣ where @@ -244,6 +251,7 @@ private noncomputable def positiveArchimedeanRootContinuous : (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. -/ @@ -256,6 +264,7 @@ noncomputable def positiveArchimedeanSection (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] : @@ -266,6 +275,7 @@ noncomputable def positiveArchimedeanSectionContinuous (w₀ (K := K))).comp (positiveArchimedeanRootContinuous (K := K))) +open scoped Classical in @[simp] theorem positiveArchimedeanSectionContinuous_apply (r : ℝ≥0ˣ) : @@ -273,12 +283,13 @@ theorem positiveArchimedeanSectionContinuous_apply positiveArchimedeanSection K r := rfl +open scoped Classical in /-- The positive archimedean section is continuous. -/ theorem continuous_positiveArchimedeanSection : Continuous (positiveArchimedeanSection K) := (positiveArchimedeanSectionContinuous K).continuous_toFun -@[simp] +open scoped Classical in private theorem positiveArchimedeanSection_infiniteComponent_same (r : ℝ≥0ˣ) : IdeleGroup.infiniteComponent (w₀ (K := K)) @@ -295,7 +306,7 @@ private theorem positiveArchimedeanSection_infiniteComponent_same (positiveArchimedeanRoot (K := K) r))) = _ rw [IdeleGroup.infinitePlaceIdele_infiniteComponent_same] -@[simp] +open scoped Classical in private theorem positiveArchimedeanSection_infiniteComponent_of_ne (r : ℝ≥0ˣ) (v : InfinitePlace K) (hv : v ≠ w₀ (K := K)) : @@ -313,8 +324,8 @@ private theorem positiveArchimedeanSection_infiniteComponent_of_ne IdeleGroup.infinitePlaceIdele_infiniteComponent_of_ne (w₀ (K := K)) v _ hv +open scoped Classical in /-- Every finite component of the positive archimedean idele is one. -/ -@[simp] theorem positiveArchimedeanSection_finiteComponent (r : ℝ≥0ˣ) (v : HeightOneSpectrum (𝓞 K)) : @@ -330,6 +341,7 @@ theorem positiveArchimedeanSection_finiteComponent (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 @@ -348,8 +360,8 @@ theorem positiveArchimedeanSection_infiniteComponent_mem_positive r v hv] exact Subgroup.one_mem _ +open scoped Classical in /-- The positive archimedean idele has absolute idele norm `r⁻¹`. -/ -@[simp] theorem positiveArchimedeanSection_absoluteNorm (r : ℝ≥0ˣ) : IdeleGroup.absoluteNorm @@ -410,6 +422,7 @@ theorem positiveArchimedeanSection_absoluteNorm 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 @@ -425,6 +438,7 @@ noncomputable def positiveArchimedeanNormOneCorrection 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 @@ -433,6 +447,7 @@ theorem positiveArchimedeanNormOneCorrection_coe 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean index 35c9467f6b..f5ab286cfc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean @@ -31,7 +31,6 @@ variable {K} /-- The finite component of a principal idele is the image of the underlying field element in the corresponding completion. -/ -@[simp] theorem finiteComponent_principalIdele (x : Kˣ) (v : HeightOneSpectrum (𝓞 K)) : ((finiteComponent v (principalIdele K x) : @@ -40,7 +39,6 @@ theorem finiteComponent_principalIdele /-- The infinite component of a principal idele is the image of the underlying field element in the corresponding completion. -/ -@[simp] theorem infiniteComponent_principalIdele (x : Kˣ) (w : InfinitePlace K) : ((infiniteComponent w (principalIdele K x) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean index dc8986979d..3f60258f97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean @@ -244,7 +244,6 @@ theorem finite_absoluteNorm_eq_archimedeanNorm_principalIdele /-- The number-field product formula in idelic form: every principal idele has global absolute norm one. -/ -@[simp] theorem absoluteNorm_principalIdele (x : Kˣ) : absoluteNorm (principalIdele K x) = 1 := by rw [absoluteNorm_apply, @@ -268,7 +267,6 @@ def absoluteNorm : (IdeleGroup.absoluteNorm (K := K)) (IdeleGroup.principalSubgroup_le_normOneSubgroup (K := K)) -@[simp] theorem absoluteNorm_mk (a : IdeleGroup K) : absoluteNorm (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = @@ -292,7 +290,6 @@ theorem comap_normOneSubgroup : IdeleGroup.absoluteNorm a = 1 rw [absoluteNorm_mk] -@[simp] theorem mk_mem_normOneSubgroup_iff (a : IdeleGroup K) : QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a ∈ normOneSubgroup (K := K) ↔ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean index ca7b6863d0..ad43bba025 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -369,12 +369,6 @@ theorem prod_norm_finitePlaceLocalTensorDecompositionUnitsComponent_single_eq [Fintype (AbsoluteValueExtension (HeightOneSpectrum.adicAbv K v₀) L)] - [∀ u : - AbsoluteValueExtension - (HeightOneSpectrum.adicAbv K v₀) L, - Algebra - (HeightOneSpectrum.adicAbv K v₀).Completion - u.1.Completion] [∀ u : AbsoluteValueExtension (HeightOneSpectrum.adicAbv K v₀) L, @@ -507,7 +501,7 @@ theorem localTensorDetNorm_singleRelativeLocalTensorDecompositionIntegralUnit_eq AbsoluteValue.completionAlgebra vK w.1 w.2 dsimp only at hNorm let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : ∀ u : AbsoluteValueExtension vK L, Algebra vK.Completion u.1.Completion := @@ -545,7 +539,7 @@ theorem localTensorDetNorm_singleRelativeLocalTensorDecompositionIntegralUnit_eq rw [hNormProduct] have hComponentEq : ∀ u : AbsoluteValueExtension vK L, - completionTensorDecomposition_left + completionTensorDecompositionLeft (K := K) (L := L) vK hvK (zA : LocalTensorAlgebra (L := L) vK) u = (finitePlaceLocalTensorDecompositionUnitsComponent @@ -594,7 +588,7 @@ private theorem exists_localizedCompletionNormPreimage_with_norm_bounds let : IsGalois vK.Completion E := HilbertRamification.algebraicLocalization_isGalois vK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField vK hvK + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace (finitePlaceCompletionBaseMap_isometry v₀) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean index 6dfbb87d3d..4cde6ea256 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean @@ -282,7 +282,6 @@ theorem relativeIdeleNorm_finiteComponent_mem_chosenLocalNormSubgroup omit [NumberField L] in /-- Hence the local tensor-norm class of every finite component of a global relative-idele norm is trivial. -/ -@[simp] theorem finitePlaceTensorNormClass_relativeIdeleNorm (v : HeightOneSpectrum (𝓞 K)) (a : RelativeIdeleGroup K L) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean index 3ae954bd8a..65b0342307 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -16,7 +16,7 @@ that embedding at finite places and the corresponding one-component relative idele. -/ -open scoped NumberField Classical TensorProduct +open scoped NumberField TensorProduct open NumberField IsDedekindDomain noncomputable section @@ -25,6 +25,7 @@ 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. -/ private def infinitePlaceValue @@ -36,6 +37,7 @@ private def infinitePlaceValue v x omit [NumberField K] in +open scoped Classical in @[simp] private theorem infinitePlaceValue_same (v : InfinitePlace K) @@ -45,6 +47,7 @@ private theorem infinitePlaceValue_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) @@ -54,6 +57,7 @@ private theorem infinitePlaceValue_of_ne 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 @@ -97,6 +101,7 @@ def infinitePlaceIdele rw [hvalue, map_mul] · simp +open scoped Classical in /-- Inserting a unit at one archimedean place is continuous. -/ theorem continuous_infinitePlaceIdele (v : InfinitePlace K) : @@ -116,6 +121,7 @@ theorem continuous_infinitePlaceIdele (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) : @@ -123,6 +129,7 @@ def infinitePlaceIdeleContinuous __ := infinitePlaceIdele v continuous_toFun := continuous_infinitePlaceIdele v +open scoped Classical in @[simp] theorem infinitePlaceIdeleContinuous_apply (v : InfinitePlace K) (x : v.Completionˣ) : @@ -130,9 +137,9 @@ theorem infinitePlaceIdeleContinuous_apply infinitePlaceIdele v x := rfl +open scoped Classical in /-- An archimedean one-place idele recovers its prescribed component at the supporting place. -/ -@[simp] theorem infinitePlaceIdele_infiniteComponent_same (v : InfinitePlace K) (x : v.Completionˣ) : @@ -145,9 +152,9 @@ theorem infinitePlaceIdele_infiniteComponent_same 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. -/ -@[simp] theorem infinitePlaceIdele_infiniteComponent_of_ne (v w : InfinitePlace K) (x : v.Completionˣ) @@ -161,9 +168,9 @@ theorem infinitePlaceIdele_infiniteComponent_of_ne 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. -/ -@[simp] theorem infinitePlaceIdele_finiteComponent (v : InfinitePlace K) (w : HeightOneSpectrum (𝓞 K)) @@ -172,6 +179,7 @@ theorem infinitePlaceIdele_finiteComponent (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 @@ -181,6 +189,7 @@ def infinitePlaceIdeleClass (IdeleGroup.principalSubgroup K)).comp (infinitePlaceIdele v) +open scoped Classical in /-- The dependent local value which is `x` at `v` and `1` elsewhere. -/ private def finitePlaceValue (v : HeightOneSpectrum (𝓞 K)) @@ -189,6 +198,7 @@ private def finitePlaceValue (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)) @@ -196,6 +206,7 @@ private theorem finitePlaceValue_same finitePlaceValue v x v = x := by simp [finitePlaceValue] +open scoped Classical in @[simp] private theorem finitePlaceValue_of_ne (v w : HeightOneSpectrum (𝓞 K)) @@ -204,6 +215,7 @@ private theorem finitePlaceValue_of_ne 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 @@ -244,9 +256,9 @@ def finitePlaceIdele 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. -/ -@[simp] theorem finitePlaceIdele_finiteComponent_same (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) : @@ -254,8 +266,8 @@ theorem finitePlaceIdele_finiteComponent_same (finitePlaceIdele v x) = x := finitePlaceValue_same v x +open scoped Classical in /-- A finite-place idele has component one at every other finite place. -/ -@[simp] theorem finitePlaceIdele_finiteComponent_of_ne (v w : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) @@ -264,8 +276,8 @@ theorem finitePlaceIdele_finiteComponent_of_ne (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. -/ -@[simp] theorem finitePlaceIdele_infiniteComponent (v : HeightOneSpectrum (𝓞 K)) (w : InfinitePlace K) @@ -274,6 +286,7 @@ theorem finitePlaceIdele_infiniteComponent (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 @@ -294,6 +307,7 @@ variable {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. -/ private def relativeInfinitePlaceValue @@ -304,6 +318,7 @@ private def relativeInfinitePlaceValue 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) @@ -312,6 +327,7 @@ private theorem relativeInfinitePlaceValue_same 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) @@ -320,6 +336,7 @@ private theorem relativeInfinitePlaceValue_of_ne relativeInfinitePlaceValue (L := L) v z w = 1 := by simp [relativeInfinitePlaceValue, h] +open scoped Classical in /-- Restricted local tensor data supported at one archimedean place. -/ private noncomputable def relativeInfinitePlaceData (v : InfinitePlace K) @@ -362,6 +379,7 @@ private noncomputable def relativeInfinitePlaceData 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) @@ -372,6 +390,7 @@ def relativeInfinitePlaceIdele (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] @@ -387,6 +406,7 @@ theorem relativeInfinitePlaceIdele_infiniteComponent_same 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] @@ -403,6 +423,7 @@ theorem relativeInfinitePlaceIdele_infiniteComponent_of_ne 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] @@ -418,6 +439,7 @@ theorem relativeInfinitePlaceIdele_finiteComponent relativeIdeleOfLocalData_finiteComponent] rfl +open scoped Classical in /-- The dependent local tensor value which is `z` at `v` and `1` elsewhere. -/ private def relativeFinitePlaceValue @@ -428,6 +450,7 @@ private def relativeFinitePlaceValue 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)) @@ -436,6 +459,7 @@ private theorem relativeFinitePlaceValue_same simp [relativeFinitePlaceValue] omit [NumberField L] [FiniteDimensional K L] in +open scoped Classical in @[simp] private theorem relativeFinitePlaceValue_of_ne (v w : HeightOneSpectrum (𝓞 K)) @@ -444,6 +468,7 @@ private theorem relativeFinitePlaceValue_of_ne relativeFinitePlaceValue (L := L) v z w = 1 := by simp [relativeFinitePlaceValue, h] +open scoped Classical in /-- Restricted local data supported at one finite place. -/ private noncomputable def relativeFinitePlaceData (v : HeightOneSpectrum (𝓞 K)) @@ -498,6 +523,7 @@ private noncomputable def relativeFinitePlaceData 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)) @@ -508,6 +534,7 @@ def relativeFinitePlaceIdele (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] @@ -523,6 +550,7 @@ theorem relativeFinitePlaceIdele_finiteComponent_same 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] @@ -539,6 +567,7 @@ theorem relativeFinitePlaceIdele_finiteComponent_of_ne 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean index a1ec41cfa6..0a683fdb79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean @@ -28,8 +28,8 @@ 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] [NumberField K] - [Field L] [NumberField L] [Algebra K L] : Prop := + [Field K] + [Field L] [Algebra K L] : Prop := ∀ P : HeightOneSpectrum (𝓞 L), Algebra.IsUnramifiedAt (𝓞 K) P.asIdeal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean index 7e60ff42fb..e0050c40e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean @@ -25,9 +25,9 @@ namespace ClassFieldTheory integer rings over the integer ring of `K`. -/ noncomputable def ringOfIntegersEquivOfAlgEquiv (K L E : Type) - [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] - [Field E] [NumberField E] [Algebra K E] + [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 @@ -97,9 +97,9 @@ theorem isUnramifiedAtFinitePlaces_iff_of_algEquiv number-field equivalence over the base. -/ theorem isUnramifiedAtInfinitePlaces_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] + [Field K] + [Field L] [Algebra K L] + [Field E] [Algebra K E] (e : L ≃ₐ[K] E) : IsUnramifiedAtInfinitePlaces K L ↔ IsUnramifiedAtInfinitePlaces K E := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean index e0013fc1de..2c9699a518 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean @@ -26,7 +26,7 @@ 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] - [NumberField F] [NumberField G] (e : F ≃+* G) : + (e : F ≃+* G) : HeightOneSpectrum (𝓞 F) ≃ HeightOneSpectrum (𝓞 G) := IsDedekindDomain.HeightOneSpectrum.equivOfRingEquiv (NumberField.RingOfIntegers.mapRingEquiv e) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean index b6931e7c78..bcee4154c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean @@ -19,7 +19,7 @@ For a nonzero integral ideal `I`, `(a/I)` is the finite product of `(a/P)` raised to the multiplicity of `P` in `I`. -/ -open scoped NumberField Classical BigOperators +open scoped NumberField BigOperators open NumberField IsDedekindDomain noncomputable section @@ -31,11 +31,16 @@ 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 : ℕ) : @@ -52,6 +57,7 @@ def rootsOfUnityReduction 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 : ℕ+) @@ -66,6 +72,7 @@ theorem rootsOfUnityReduction_injective 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 @@ -94,6 +101,7 @@ theorem dvd_absNorm_sub_one_of_primitiveRoots 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 @@ -133,6 +141,7 @@ noncomputable def rootsOfUnityReductionEquiv ((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 @@ -144,6 +153,7 @@ theorem rootsOfUnityReductionEquiv_apply 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 @@ -152,6 +162,7 @@ theorem card_primeIdealResidueField 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 @@ -163,6 +174,7 @@ def primeIdealResidueUnit rw [ne_eq, Ideal.Quotient.eq_zero_iff_mem] exact ha) +open scoped Classical in @[simp] theorem primeIdealResidueUnit_mul (P : HeightOneSpectrum (𝓞 K)) @@ -174,6 +186,7 @@ theorem primeIdealResidueUnit_mul 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 @@ -190,6 +203,7 @@ noncomputable def primeIdealPowerResidueSymbol (𝓞 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 @@ -208,6 +222,7 @@ theorem rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol 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 @@ -239,6 +254,7 @@ theorem primeIdealPowerResidueSymbol_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 : ℕ+) @@ -264,12 +280,14 @@ theorem primeIdealPowerResidueSymbol_mul 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 @@ -286,6 +304,7 @@ theorem idealPrimeMultiplicity_mul (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 @@ -297,6 +316,7 @@ theorem idealPrimeMultiplicity_eq_zero_of_not_dvd 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, @@ -307,6 +327,7 @@ def idealPrimeDivisors (I : Ideal (𝓞 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 @@ -314,12 +335,14 @@ theorem mem_idealPrimeDivisors 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)`. @@ -347,6 +370,7 @@ noncomputable def idealPowerResidueSymbol (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 @@ -369,6 +393,7 @@ noncomputable def idealPowerResidueFactor else 1 +open scoped Classical in /-- Only prime divisors of the denominator can contribute a nontrivial factor. -/ theorem idealPowerResidueFactor_hasFiniteMulSupport @@ -391,6 +416,7 @@ theorem idealPowerResidueFactor_hasFiniteMulSupport 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) @@ -460,6 +486,7 @@ theorem idealPowerResidueFactor_mul 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 @@ -504,6 +531,7 @@ theorem idealPowerResidueSymbol_eq_finprod · 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) @@ -546,6 +574,7 @@ theorem idealPowerResidueSymbol_mul_denominator 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) @@ -569,6 +598,7 @@ theorem idealPowerResidueSymbol_eq_prod 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean index b17b02e75f..0abb757505 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean @@ -8,7 +8,8 @@ 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 +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)`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean index 5b2ff6bb0a..f07f094f4d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean @@ -23,8 +23,7 @@ complete splitting is equivalent both to cardinality one and to local degree one. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -37,6 +36,7 @@ variable {K L : Type} [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 @@ -45,6 +45,7 @@ noncomputable def finitePlaceDecompositionGroup 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 @@ -55,6 +56,7 @@ def FinitePlaceSplitsCompletely (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] @@ -73,6 +75,7 @@ theorem mem_finitePlaceDecompositionGroup_iff (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 @@ -91,6 +94,7 @@ noncomputable def finitePlaceLocalDegree 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. -/ @@ -139,6 +143,7 @@ theorem finitePlaceDecompositionGroup_card_eq_localDegree (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 @@ -153,6 +158,7 @@ theorem finitePlaceSplitsCompletely_iff_card_eq_one (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)) : @@ -164,6 +170,7 @@ theorem finitePlaceSplitsCompletely_iff_localDegree_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 @@ -205,6 +212,7 @@ theorem finitePlace_not_splitsCompletely_iff_exists_nontrivial_stabilizer 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 @@ -219,6 +227,7 @@ theorem finitePlace_not_splitsCompletely_iff_one_lt_card (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)) : @@ -229,6 +238,7 @@ theorem finitePlace_not_splitsCompletely_iff_one_lt_localDegree 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 @@ -262,6 +272,7 @@ variable {M : Type} [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`. @@ -284,6 +295,7 @@ 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. -/ @@ -297,6 +309,7 @@ noncomputable def finitePlaceDecompositionGroupInQuotient (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 @@ -311,6 +324,7 @@ theorem finitePlaceDecompositionGroupInQuotient_eq_bot_iff 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean index 70bd21a50a..e7bd7041cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -17,8 +17,7 @@ These are the place-theoretic ingredients used in the cyclic prime-power and normal-closure splitting reductions. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -32,6 +31,7 @@ variable [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 @@ -85,6 +85,7 @@ theorem absoluteValueDecompositionGroup_eq_finitePlaceStabilizer 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 @@ -118,6 +119,7 @@ theorem finitePlaceSplitsCompletely_iff_centre_stabilizer_eq_bot (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 @@ -143,6 +145,7 @@ theorem finitePlaceSplitsCompletely_iff_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 @@ -162,6 +165,7 @@ theorem finite_finitePlaceBelow_fibre 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 @@ -185,6 +189,7 @@ variable {M : Type} 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 @@ -198,6 +203,7 @@ theorem finitePlaceEquiv_restrictAutomorphismScalars 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, @@ -257,6 +263,7 @@ theorem finitePlaceSplitsCompletely_over_intermediate_of_below 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean index 2b42119677..482033fde4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -30,8 +30,7 @@ the `K`-conjugates of `L`, then `H` has trivial normal core. completely already in `M`. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -43,6 +42,7 @@ 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`. -/ @@ -54,7 +54,7 @@ noncomputable def extendAbsoluteValueExtensionFromIntermediate (u : AbsoluteValueExtension vK L) : AbsoluteValueExtension vK M := by let : Module.IsTorsionFree L - (absoluteValueExtension_algebraicCompletionClosure u.1) := + (absoluteValueExtensionAlgebraicCompletionClosure u.1) := DivisionSemiring.to_moduleIsTorsionFree let hu : u.1.IsNontrivial := u.isNontrivial hvK @@ -68,6 +68,7 @@ noncomputable def extendAbsoluteValueExtensionFromIntermediate rw [IsScalarTower.algebraMap_apply K L M, wL.2, u.2] } +open scoped Classical in @[simp] theorem extendAbsoluteValueExtensionFromIntermediate_apply [FiniteDimensional K M] @@ -79,7 +80,7 @@ theorem extendAbsoluteValueExtensionFromIntermediate_apply (extendAbsoluteValueExtensionFromIntermediate vK hvK L u).1 x = u.1 x := by let : Module.IsTorsionFree L - (absoluteValueExtension_algebraicCompletionClosure u.1) := + (absoluteValueExtensionAlgebraicCompletionClosure u.1) := DivisionSemiring.to_moduleIsTorsionFree change (pullbackAbsoluteValueExtension @@ -100,6 +101,7 @@ 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. -/ @@ -142,6 +144,7 @@ noncomputable def doubleCosetExtension : hdEq exact hvalue.symm) +open scoped Classical in @[simp] theorem doubleCosetExtension_mk (g : G) : @@ -154,6 +157,7 @@ theorem doubleCosetExtension_mk L := rfl +open scoped Classical in /-- Every extension of `v` to the intermediate field occurs by restricting a conjugate of `w`. -/ theorem doubleCosetExtension_surjective @@ -184,6 +188,7 @@ theorem doubleCosetExtension_surjective 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 @@ -288,6 +293,7 @@ theorem doubleCosetExtension_injective ?_⟩ 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 @@ -309,6 +315,7 @@ 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 @@ -320,6 +327,7 @@ def AbsoluteValueSplitsCompletelyInExtension variable [NumberField K] +open scoped Classical in /-- Intrinsic complete splitting of a finite place in a possibly non-Galois finite extension. -/ def FinitePlaceSplitsCompletelyInExtension @@ -338,6 +346,7 @@ variable {K M : Type} 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 @@ -373,6 +382,7 @@ 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. -/ @@ -394,6 +404,7 @@ theorem absoluteValueSplitsCompletelyInExtension_iff_doubleCoset_card_eq 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 @@ -415,6 +426,7 @@ theorem absoluteValueDecompositionGroup_eq_bot_of_splitsCompletelyInIntermediate (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 @@ -442,6 +454,7 @@ 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 @@ -476,6 +489,7 @@ theorem fixingSubgroup_normalCore_eq_bot_of_normalClosure_eq_top 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) @@ -499,6 +513,7 @@ variable {K M : Type} 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`. -/ @@ -523,6 +538,7 @@ theorem finitePlaceSplitsCompletelyInExtension_iff_doubleCoset_card_eq 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 @@ -542,6 +558,7 @@ theorem finitePlaceSplitsCompletely_in_ambient_of_fixedField (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 @@ -569,6 +586,7 @@ theorem finitePlaceSplitsCompletely_in_normalClosure L hclosure) exact hsplit +open scoped Classical in /-- Complete splitting ascends to an ambient field carrying the actual `IsNormalClosure` instance. -/ theorem finitePlaceSplitsCompletely_in_isNormalClosure @@ -589,6 +607,7 @@ theorem finitePlaceSplitsCompletely_in_isNormalClosure 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 @@ -626,6 +645,7 @@ variable [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 @@ -666,6 +686,7 @@ 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 @@ -683,6 +704,7 @@ theorem absoluteValueSplitsCompletelyInExtension_algEquiv 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 @@ -706,6 +728,7 @@ variable [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. -/ @@ -768,6 +791,7 @@ variable [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. -/ @@ -874,6 +898,7 @@ variable [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 : @@ -884,6 +909,7 @@ theorem finiteNormalClosureOriginalField_fixingSubgroup_normalCore : (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 @@ -900,6 +926,7 @@ theorem finitePlaceSplitsCompletely_in_finiteNormalClosure (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 @@ -917,6 +944,7 @@ theorem finite_nonSplittingPlaces_finiteNormalClosure (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 @@ -932,6 +960,7 @@ theorem finite_nonSplittingPlaces_originalField 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean index f6cf1e5de1..f49d1d18b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean @@ -16,13 +16,13 @@ automorphism `σ` of prime order `p` and form 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` +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'`. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -37,6 +37,7 @@ variable {K L : Type} 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 @@ -50,18 +51,21 @@ theorem exists_prime_order_automorphism_of_one_lt_finrank 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 @@ -69,6 +73,7 @@ theorem fixedFieldPrime_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 @@ -79,6 +84,7 @@ theorem primeOrderAutomorphism_orderOf (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 @@ -88,6 +94,7 @@ noncomputable def primeOrderSubgroup (primeOrderAutomorphism (K := K) (L := L) hdegree) +open scoped Classical in theorem primeOrderSubgroup_card (hdegree : 1 < Module.finrank K L) : Nat.card @@ -98,6 +105,7 @@ theorem primeOrderSubgroup_card 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) : @@ -106,6 +114,7 @@ noncomputable def primeOrderFixedField (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 @@ -120,6 +129,7 @@ noncomputable instance primeOrderFixedField_isGalois (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) : @@ -133,6 +143,7 @@ theorem primeOrderFixedField_finrank 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 @@ -154,6 +165,7 @@ noncomputable instance primeOrderFixedField_isCyclic (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. -/ @@ -177,6 +189,7 @@ variable {K M : Type} [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 @@ -194,6 +207,7 @@ variable {L : Type} [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. @@ -250,6 +264,7 @@ variable {K L : Type} [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 @@ -273,6 +288,7 @@ theorem primeOrderFixedField_threeSeven_data 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean index 67432ded0c..3a96cfb632 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -14,8 +14,7 @@ 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. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -24,6 +23,7 @@ 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. -/ @@ -38,6 +38,7 @@ noncomputable def modulusOfFinset intro v hv simpa using hv)) +open scoped Classical in @[simp] theorem modulusOfFinset_apply (S : Finset (HeightOneSpectrum (𝓞 K))) @@ -46,6 +47,7 @@ theorem modulusOfFinset_apply classical rfl +open scoped Classical in @[simp] theorem modulusOfFinset_support (S : Finset (HeightOneSpectrum (𝓞 K))) : @@ -54,6 +56,7 @@ theorem modulusOfFinset_support 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. -/ @@ -68,6 +71,7 @@ def openLocalCosetTarget 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) @@ -84,6 +88,7 @@ theorem isOpen_openLocalCosetTarget (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 @@ -94,6 +99,7 @@ def openLocalCosetTargetPoint | 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 @@ -109,6 +115,7 @@ theorem openLocalCosetTargetPoint_mem | 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 @@ -172,6 +179,7 @@ theorem exists_principal_quotient_mem_openLocalSubgroups 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) @@ -197,6 +205,7 @@ theorem exists_principal_quotient_mem_openLocalSubgroups_finset 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 @@ -212,6 +221,7 @@ def openAllLocalCosetTarget 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) @@ -235,6 +245,7 @@ theorem isOpen_openAllLocalCosetTarget (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 @@ -253,6 +264,7 @@ theorem openLocalCosetTargetPoint_mem_all | 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. @@ -351,6 +363,7 @@ theorem exists_principal_quotient_mem_openAllLocalSubgroups rw [hprincipal] exact hy +open scoped Classical in /-- Finset-indexed simultaneous finite-and-infinite multiplicative weak approximation. -/ theorem exists_principal_quotient_mem_openAllLocalSubgroups_finset @@ -389,6 +402,7 @@ theorem exists_principal_quotient_mem_openAllLocalSubgroups_finset 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))) @@ -409,6 +423,7 @@ def finiteIdeleOfFinset change f v ∈ (v.adicCompletionIntegers K).units simp [f, hv] +open scoped Classical in @[simp] theorem finiteIdeleOfFinset_apply_mem (S : Finset (HeightOneSpectrum (𝓞 K))) @@ -419,6 +434,7 @@ theorem finiteIdeleOfFinset_apply_mem 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))) @@ -430,6 +446,7 @@ theorem finiteIdeleOfFinset_apply_notMem (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 @@ -438,6 +455,7 @@ def ideleOfFiniteLocalFamily IdeleGroup K := (1, finiteIdeleOfFinset S a) +open scoped Classical in @[simp] theorem ideleOfFiniteLocalFamily_finiteComponent (S : Finset (HeightOneSpectrum (𝓞 K))) @@ -446,6 +464,7 @@ theorem ideleOfFiniteLocalFamily_finiteComponent (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 @@ -456,6 +475,7 @@ def principalLocalQuotientMap (QuotientGroup.mk' (U v)).comp ((finiteComponent v.1).comp (principalIdele K)) +open scoped Classical in @[simp] theorem principalLocalQuotientMap_apply (S : Finset (HeightOneSpectrum (𝓞 K))) @@ -465,6 +485,7 @@ theorem principalLocalQuotientMap_apply 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean index 62d7bab465..b2fa7f4b44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean @@ -26,7 +26,7 @@ namespace RayClass /-- A finite ray modulus. Its finite support records the prime powers dividing the modulus. -/ -abbrev FiniteModulus (K : Type*) [Field K] [NumberField K] := +abbrev FiniteModulus (K : Type*) [Field K] := HeightOneSpectrum (𝓞 K) →₀ ℕ /-- Reduction of local integral units modulo the `n`-th power of the maximal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean index 617e6d6703..cf36c1f57d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean @@ -13,7 +13,7 @@ which positivity is imposed. This file defines the corresponding idèle and idèle-class congruence subgroups without fixing an archimedean convention. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -22,10 +22,12 @@ 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] [NumberField K] := +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 @@ -36,51 +38,61 @@ structure Modulus (K : Type*) [Field K] [NumberField K] where 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) : @@ -91,16 +103,19 @@ theorem ext {m n : Modulus K} 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 := @@ -110,6 +125,7 @@ instance : PartialOrder (Modulus K) where 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 @@ -122,6 +138,7 @@ noncomputable instance : SemilatticeInf (Modulus K) where ⟨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 @@ -136,12 +153,15 @@ noncomputable instance : SemilatticeSup (Modulus K) where · 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 @@ -149,54 +169,63 @@ def replaceFinitePart 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 @@ -204,6 +233,7 @@ theorem eraseRealPlaces_empty (m : Modulus K) : · rfl · exact Finset.sdiff_empty +open scoped Classical in @[simp] theorem eraseRealPlaces_insert (m : Modulus K) (s : Finset (RealPlace K)) (v : RealPlace K) : @@ -213,6 +243,7 @@ theorem eraseRealPlaces_insert · 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. -/ @@ -225,6 +256,7 @@ noncomputable def localInfiniteCongruenceSubgroup (m : Modulus K) else ⊤ else ⊤ +open scoped Classical in @[simp] theorem localInfiniteCongruenceSubgroup_replaceFinitePart (m : Modulus K) (f : FiniteModulus K) (w : InfinitePlace K) : @@ -232,24 +264,28 @@ theorem localInfiniteCongruenceSubgroup_replaceFinitePart 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) : @@ -257,6 +293,7 @@ def infiniteCongruenceSubgroup (m : Modulus 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) : @@ -267,7 +304,7 @@ theorem mem_infiniteCongruenceSubgroup_iff_local rw [Subgroup.mem_pi] simp only [Set.mem_univ, true_implies] -@[simp] +open scoped Classical in theorem mem_infiniteCongruenceSubgroup_iff (m : Modulus K) (a : InfiniteIdeleGroup K) : a ∈ m.infiniteCongruenceSubgroup ↔ @@ -288,6 +325,7 @@ theorem mem_infiniteCongruenceSubgroup_iff · 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) : @@ -306,12 +344,14 @@ theorem infiniteCongruenceSubgroup_narrowOfFinite (f : FiniteModulus K) : · 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) : @@ -320,6 +360,7 @@ theorem mem_ideleCongruenceSubgroup_iff 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 = @@ -328,6 +369,7 @@ theorem ideleCongruenceSubgroup_narrowOfFinite (f : FiniteModulus K) : 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) : @@ -336,6 +378,7 @@ def congruenceSubgroup (m : Modulus K) : (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 @@ -344,10 +387,12 @@ instance congruenceSubgroup_normal (m : Modulus K) : 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean index 7304bf60d6..a20ebd4b1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -19,8 +19,7 @@ connects it with the corresponding finite-idele higher-unit conditions, and develops the approximation maps used in ray-class ideal constructions. -/ -open scoped NumberField WithZero Classical -open NumberField IsDedekindDomain +open scoped NumberField WithZero open NumberField IsDedekindDomain noncomputable section @@ -29,6 +28,7 @@ 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) : @@ -45,6 +45,7 @@ def primeToModulusIdeals (m : Modulus K) : 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) : @@ -54,6 +55,7 @@ theorem mem_primeToModulusIdeals_iff (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 @@ -75,6 +77,7 @@ def primeToModulusIdeal 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] @@ -87,6 +90,7 @@ theorem primeToModulusIdeal_coe 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) : @@ -99,6 +103,7 @@ def finitePrimeToModulusSubgroup (m : Modulus K) : 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) : @@ -106,6 +111,7 @@ def idelePrimeToModulusSubgroup (m : Modulus K) : m.infiniteCongruenceSubgroup.prod (finitePrimeToModulusSubgroup m) +open scoped Classical in theorem localHigherUnitGroup_le_integralUnits (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : localHigherUnitGroup v n ≤ @@ -115,6 +121,7 @@ theorem localHigherUnitGroup_le_integralUnits 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) : @@ -130,6 +137,7 @@ theorem fractionalIdeal_mem_primeToModulusIdeals 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 →* @@ -144,6 +152,7 @@ def primeToIdealMap (m : Modulus K) : 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 @@ -161,6 +170,7 @@ def valuationVectorSectionPrimeTo rw [FiniteIdeleGroup.localOrder_chosenLocalOrderSection, Finsupp.notMem_support_iff.mp he]⟩ +open scoped Classical in theorem valuationVector_valuationVectorSectionPrimeTo (m : Modulus K) (e : HeightOneSpectrum (𝓞 K) →₀ ℤ) @@ -187,6 +197,7 @@ theorem valuationVector_valuationVectorSectionPrimeTo 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 @@ -224,6 +235,7 @@ theorem primeToIdealMap_surjective (m : Modulus K) : FractionalIdealGroup.count_factorization] exact FractionalIdealGroup.countVector_apply I v +open scoped Classical in theorem ideleCongruenceSubgroup_le_primeTo (m : Modulus K) : m.ideleCongruenceSubgroup ≤ @@ -231,6 +243,7 @@ theorem ideleCongruenceSubgroup_le_primeTo 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) : @@ -238,6 +251,7 @@ def congruenceSubgroupInPrimeTo (m : Modulus K) : m.ideleCongruenceSubgroup.subgroupOf (idelePrimeToModulusSubgroup m) +open scoped Classical in theorem primeToIdealMap_ker (m : Modulus K) : (primeToIdealMap m).ker = congruenceSubgroupInPrimeTo m := by @@ -268,6 +282,7 @@ theorem primeToIdealMap_ker (m : Modulus K) : 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) : @@ -278,6 +293,7 @@ def quotientCongruenceEquivPrimeToIdeals (m : Modulus K) : 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) : @@ -285,6 +301,7 @@ def principalSubgroupInPrimeTo (m : Modulus K) : 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) : @@ -292,6 +309,7 @@ def principalRayIdealSubgroup (m : Modulus K) : Subgroup.map (primeToIdealMap m) (principalSubgroupInPrimeTo m) +open scoped Classical in theorem mem_principalRayIdealSubgroup_iff (m : Modulus K) (I : primeToModulusIdeals m) : I ∈ principalRayIdealSubgroup m ↔ @@ -325,10 +343,12 @@ theorem mem_principalRayIdealSubgroup_iff (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) : @@ -337,6 +357,7 @@ def idealRayProjection (m : Modulus K) : (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) : @@ -344,6 +365,7 @@ def raySubgroupInPrimeTo (m : Modulus K) : congruenceSubgroupInPrimeTo m ⊔ principalSubgroupInPrimeTo m +open scoped Classical in theorem idealRayProjection_surjective (m : Modulus K) : Function.Surjective (idealRayProjection m) := by intro c @@ -353,6 +375,7 @@ theorem idealRayProjection_surjective (m : Modulus K) : 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 @@ -390,6 +413,7 @@ theorem idealRayProjection_ker (m : Modulus K) : 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 @@ -403,9 +427,9 @@ def quotientRaySubgroupEquivIdealRayClassGroup (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. -/ -@[simp] theorem quotientRaySubgroupEquivIdealRayClassGroup_mk (m : Modulus K) (a : idelePrimeToModulusSubgroup m) : quotientRaySubgroupEquivIdealRayClassGroup m @@ -418,16 +442,19 @@ theorem quotientRaySubgroupEquivIdealRayClassGroup_mk /-! ### 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 @@ -439,6 +466,7 @@ theorem adicAbv_isNontrivial 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 @@ -463,6 +491,7 @@ theorem adicAbv_not_isEquiv_of_ne 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 @@ -477,6 +506,7 @@ theorem adicAbv_not_isEquiv_infinitePlace 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 @@ -488,6 +518,7 @@ theorem approximationAbsoluteValue_isNontrivial change w.1.IsNontrivial exact w.isNontrivial +open scoped Classical in theorem approximationAbsoluteValue_pairwise (m : Modulus K) : Pairwise fun i j => @@ -517,17 +548,20 @@ theorem approximationAbsoluteValue_pairwise 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, @@ -540,6 +574,7 @@ def approximationCompletionMap (m : Modulus K) : (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 @@ -570,6 +605,7 @@ theorem denseRange_finiteApproximationCompletionMap rw [DenseRange, hrange] exact v.denseRange_algebraMap K +open scoped Classical in theorem continuous_finiteApproximationCompletionMap (v : HeightOneSpectrum (𝓞 K)) : Continuous @@ -585,6 +621,7 @@ theorem continuous_finiteApproximationCompletionMap FinitePlace.norm_embedding] rfl +open scoped Classical in theorem denseRange_approximationCompletionMap (m : Modulus K) : ∀ i, DenseRange (approximationCompletionMap m i) @@ -592,6 +629,7 @@ theorem denseRange_approximationCompletionMap | Sum.inr w => NumberField.InfinitePlace.Completion.denseRange_coe w +open scoped Classical in theorem continuous_approximationCompletionMap (m : Modulus K) : ∀ i, Continuous (approximationCompletionMap m i) @@ -599,6 +637,7 @@ theorem continuous_approximationCompletionMap | 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) : @@ -608,6 +647,7 @@ def approximationEmbedding (m : Modulus 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) : @@ -615,6 +655,7 @@ theorem approximationEmbedding_finite FinitePlace.embedding v.1 x := rfl +open scoped Classical in @[simp] theorem approximationEmbedding_infinite (m : Modulus K) (x : K) (w : InfinitePlace K) : @@ -622,6 +663,7 @@ theorem approximationEmbedding_infinite (x : w.Completion) := rfl +open scoped Classical in theorem denseRange_approximationEmbedding (m : Modulus K) : DenseRange (approximationEmbedding m) := by exact @@ -632,6 +674,7 @@ theorem denseRange_approximationEmbedding (m : Modulus K) : (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 @@ -639,6 +682,7 @@ def unitRatioSet 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] @@ -649,12 +693,14 @@ theorem isOpen_unitRatioSet 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) @@ -666,6 +712,7 @@ def approximationTarget (m : Modulus K) (a : IdeleGroup K) : (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) @@ -693,6 +740,7 @@ theorem isOpen_approximationTarget · 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 @@ -702,6 +750,7 @@ def approximationTargetPoint | 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 ∈ @@ -713,6 +762,7 @@ theorem approximationTargetPoint_mem | 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 @@ -807,6 +857,7 @@ theorem exists_principal_quotient_mem_primeTo rw [hprincipal] exact hy +open scoped Classical in /-- Approximation identifies the idele group as `I_K = I_K^(m) Kˣ`. -/ theorem idelePrimeToModulusSubgroup_sup_principalSubgroup @@ -824,6 +875,7 @@ theorem idelePrimeToModulusSubgroup_sup_principalSubgroup 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) : @@ -836,6 +888,7 @@ def primeToRayClassProjection (m : Modulus K) : IdeleGroup.principalSubgroup K)).comp (idelePrimeToModulusSubgroup m).subtype +open scoped Classical in theorem primeToRayClassProjection_ker (m : Modulus K) : (primeToRayClassProjection m).ker = raySubgroupInPrimeTo m := by @@ -897,6 +950,7 @@ theorem primeToRayClassProjection_ker (m : Modulus 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 @@ -939,6 +993,7 @@ theorem primeToRayClassProjection_surjective (m : Modulus K) : (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 @@ -954,9 +1009,9 @@ def quotientRaySubgroupEquivIdeleRayQuotient (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. -/ -@[simp] theorem quotientRaySubgroupEquivIdeleRayQuotient_mk (m : Modulus K) (a : idelePrimeToModulusSubgroup m) : quotientRaySubgroupEquivIdeleRayQuotient m @@ -967,6 +1022,7 @@ theorem quotientRaySubgroupEquivIdeleRayQuotient_mk 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean index 8c7d5357f9..2301d85c9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -27,7 +27,7 @@ principal ray ideals, is the norm-defined ideal group `N_{L/K} J_L^m P_K^m`. -/ -open scoped BigOperators Classical NumberField Topology +open scoped BigOperators NumberField Topology open NumberField IsDedekindDomain noncomputable section @@ -41,6 +41,7 @@ variable [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. -/ @@ -111,6 +112,7 @@ theorem exists_localHigherUnitGroup_le_norm_preimage 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 @@ -125,6 +127,7 @@ noncomputable def idealNormLiftedModulusExponent 0 omit [FiniteDimensional K L] in +open scoped Classical in theorem idealNormLiftedModulusExponent_pos (m : Modulus K) (W : HeightOneSpectrum (𝓞 L)) @@ -136,6 +139,7 @@ theorem idealNormLiftedModulusExponent_pos 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 @@ -164,6 +168,7 @@ theorem localHigherUnitGroup_idealNormLiftedModulusExponent_le (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 @@ -192,6 +197,7 @@ theorem idealNormLiftedModulusExponent_min (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 @@ -203,6 +209,7 @@ theorem idealNormLiftedModulusExponent_eq_zero_of_not_mem 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)) := @@ -210,6 +217,7 @@ def idealNormLiftedSupport (m : Modulus K) : _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 @@ -217,6 +225,7 @@ theorem idealNormLiftedSupport_finite (m : Modulus K) : _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 @@ -236,6 +245,7 @@ noncomputable def idealNormLiftedModulus exact hbelow) omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem idealNormLiftedModulus_apply (m : Modulus K) @@ -246,7 +256,7 @@ theorem idealNormLiftedModulus_apply rfl omit [FiniteDimensional K L] in -@[simp] +open scoped Classical in theorem mem_idealNormLiftedModulus_support_iff (m : Modulus K) (W : HeightOneSpectrum (𝓞 L)) : @@ -260,6 +270,7 @@ theorem mem_idealNormLiftedModulus_support_iff 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. -/ @@ -273,6 +284,7 @@ noncomputable def idealNormExponentMap : (W.asIdeal.inertiaDeg (𝓞 K) : ℤ)) omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem idealNormExponentMap_apply (e : HeightOneSpectrum (𝓞 L) →₀ ℤ) @@ -287,6 +299,7 @@ theorem idealNormExponentMap_apply 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 @@ -340,6 +353,7 @@ theorem idealNormExponentMap_apply_eq_sum_above · intro W simp +open scoped Classical in private theorem factorizationEquiv_symm_toAdd (I : FractionalIdealGroup L) : ((FractionalIdealGroup.factorizationEquiv @@ -359,6 +373,7 @@ private theorem factorizationEquiv_symm_toAdd 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 := @@ -370,6 +385,7 @@ noncomputable def fractionalIdealNorm : (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 @@ -398,6 +414,7 @@ theorem count_fractionalIdealNorm 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 = @@ -405,12 +422,14 @@ private theorem fractionalIdealNormPrimeBelow_eq_finitePlaceBelow ext rfl +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) = @@ -430,6 +449,7 @@ private theorem factorizationEquiv_eq_public 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 : @@ -440,6 +460,7 @@ theorem fractionalIdealNorm_eq_public : 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] @@ -461,6 +482,7 @@ theorem _root_.IdeleGroup.count_fractionalIdeal 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 @@ -478,7 +500,7 @@ theorem _root_.IdeleGroup.fractionalIdeal_ideleNorm finitePlaceExtensionEquivAbove (K := K) (L := L) v let := - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v} := @@ -509,6 +531,7 @@ theorem _root_.IdeleGroup.fractionalIdeal_ideleNorm 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 @@ -537,6 +560,7 @@ theorem fractionalIdealNorm_mem_primeToModulusIdeals 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 @@ -557,6 +581,7 @@ noncomputable def primeToModulusIdealNorm exact map_mul _ _ _ omit [FiniteDimensional K L] in +open scoped Classical in @[simp] theorem primeToModulusIdealNorm_coe (m : Modulus K) @@ -569,6 +594,7 @@ theorem primeToModulusIdealNorm_coe (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 @@ -586,7 +612,7 @@ theorem finite_norm_mem_finitePrimeToModulusSubgroup finitePlaceExtensionEquivAbove (K := K) (L := L) v let := - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v} := @@ -625,6 +651,7 @@ theorem finite_norm_mem_finitePrimeToModulusSubgroup (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean index 5f824861c2..8a799a3f59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean @@ -12,8 +12,7 @@ This file proves the exact sequence from global unit signs through the narrow and ordinary class groups. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -22,6 +21,7 @@ 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 @@ -30,6 +30,7 @@ theorem finiteCongruenceSubgroup_zero : 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 @@ -39,6 +40,7 @@ theorem narrowIdeleCongruenceSubgroup_zero_le_integral : 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 : @@ -46,11 +48,13 @@ def narrowDenominator : (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 : @@ -59,6 +63,7 @@ def rayClassGroupNarrowZeroEquivNarrowClassGroup : 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 : @@ -79,12 +84,14 @@ def narrowToClassGroup : 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 @@ -95,12 +102,14 @@ theorem narrowToClassGroup_surjective : (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] [NumberField K] := + (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 @@ -108,12 +117,14 @@ def infiniteToIdele : 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 @@ -128,6 +139,7 @@ theorem narrowInfiniteCongruenceSubgroup_le_infiniteToNarrow_ker : 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 := @@ -135,7 +147,7 @@ def signToNarrow : (infiniteToNarrow (K := K)) (narrowInfiniteCongruenceSubgroup_le_infiniteToNarrow_ker (K := K)) -@[simp] +open scoped Classical in theorem signToNarrow_mk (a : InfiniteIdeleGroup K) : signToNarrow (QuotientGroup.mk' @@ -144,6 +156,7 @@ theorem signToNarrow_mk (a : InfiniteIdeleGroup 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 @@ -227,11 +240,13 @@ theorem signToNarrow_range_eq_narrowToClassGroup_ker : 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 @@ -272,6 +287,7 @@ theorem toPrincipalIdeal_eq_one_iff_mem_integralUnits rw [← map_mul] simp +open scoped Classical in /-- The archimedean image of a global integral unit. -/ def integralUnitToInfiniteIdele : (𝓞 K)ˣ →* InfiniteIdeleGroup K := @@ -279,16 +295,19 @@ def integralUnitToInfiniteIdele : ((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 := @@ -296,6 +315,7 @@ def integralUnitToRealSign : (narrowInfiniteCongruenceSubgroup (K := K))).comp (integralUnitToInfiniteIdele (K := K)) +open scoped Classical in theorem totallyPositiveUnitSubgroup_le_integralUnitToRealSign_ker : totallyPositiveUnitSubgroup (K := K) ≤ (integralUnitToRealSign (K := K)).ker := by @@ -303,6 +323,7 @@ theorem totallyPositiveUnitSubgroup_le_integralUnitToRealSign_ker : 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 : @@ -313,7 +334,7 @@ def integralUnitSignToRealSign : (totallyPositiveUnitSubgroup_le_integralUnitToRealSign_ker (K := K)) -@[simp] +open scoped Classical in theorem integralUnitSignToRealSign_mk (u : (𝓞 K)ˣ) : integralUnitSignToRealSign (QuotientGroup.mk' @@ -323,6 +344,7 @@ theorem integralUnitSignToRealSign_mk (u : (𝓞 K)ˣ) : (integralUnitToInfiniteIdele (K := K) u) := QuotientGroup.lift_mk _ _ _ +open scoped Classical in theorem integralUnitSignToRealSign_injective : Function.Injective (integralUnitSignToRealSign (K := K)) := by @@ -351,6 +373,7 @@ theorem integralUnitSignToRealSign_injective : narrowInfiniteCongruenceSubgroup (K := K) simpa using hxy' +open scoped Classical in theorem principalIdele_integralUnit_finite_integral (u : (𝓞 K)ˣ) : (IdeleGroup.principalIdele K @@ -367,6 +390,7 @@ theorem principalIdele_integralUnit_finite_integral (integralUnitToFieldUnit (K := K) u)).mpr ⟨u, rfl⟩ +open scoped Classical in theorem signToNarrow_integralUnit (u : (𝓞 K)ˣ) : signToNarrow (QuotientGroup.mk' @@ -419,6 +443,7 @@ theorem signToNarrow_integralUnit (u : (𝓞 K)ˣ) : hpDecomp.symm _ = 1 := hpQuot +open scoped Classical in theorem integralUnitSignToRealSign_range_eq_signToNarrow_ker : (integralUnitSignToRealSign (K := K)).range = (signToNarrow (K := K)).ker := by @@ -517,6 +542,7 @@ theorem integralUnitSignToRealSign_range_eq_signToNarrow_ker : (narrowInfiniteCongruenceSubgroup (K := K))) hcpInfinite +open scoped Classical in /-- The exact sequence `1 → 𝓞_Kˣ / 𝓞_{K,+}ˣ → ∏_{v real} ℝˣ / ℝ_{>0}ˣ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean index f2920af78b..1e811974f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean @@ -13,7 +13,7 @@ away from the modulus. This is the algebraic input for comparing Frobenius-normalized ray reciprocity maps. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -22,6 +22,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean index a1a0e6961a..1666bdfc37 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -21,25 +21,31 @@ positive generator of an ideal prime to this modulus gives the explicit isomorphism with `(ZMod m)ˣ`. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +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 @@ -49,17 +55,22 @@ local instance rationalPrimesEquivPrimeFact ⟨(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 : @@ -68,6 +79,7 @@ theorem rational_natGenerator_injective : 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`. @@ -78,6 +90,7 @@ noncomputable def rationalFiniteModulus (m : ℕ) : FiniteModulus ℚ := m.factorization rational_natGenerator_injective.injOn +open scoped Classical in @[simp] theorem rationalFiniteModulus_apply (m : ℕ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -85,11 +98,13 @@ theorem rationalFiniteModulus_apply 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 (𝓞 ℚ)) : @@ -98,6 +113,7 @@ theorem rationalModulus_finitePart_apply 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 ↔ @@ -108,11 +124,13 @@ theorem mem_rationalFiniteModulus_support_iff · 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. -/ private noncomputable def rawRationalIdealGenerator @@ -121,6 +139,7 @@ private noncomputable def rawRationalIdealGenerator ((rationalFractionalIdeal I : FractionalIdeal (nonZeroDivisors (𝓞 ℚ)) ℚ) : Submodule (𝓞 ℚ) ℚ) +open scoped Classical in private theorem rawRationalIdealGenerator_ne_zero (I : FractionalIdealGroup ℚ) : rawRationalIdealGenerator I ≠ 0 := by @@ -130,6 +149,7 @@ private theorem rawRationalIdealGenerator_ne_zero (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 ℚ) : ℚ := @@ -138,6 +158,7 @@ noncomputable def positiveRationalIdealGenerator else -rawRationalIdealGenerator I +open scoped Classical in theorem positiveRationalIdealGenerator_pos (I : FractionalIdealGroup ℚ) : 0 < positiveRationalIdealGenerator I := by @@ -148,6 +169,7 @@ theorem positiveRationalIdealGenerator_pos (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 = @@ -169,6 +191,7 @@ theorem rationalFractionalIdeal_eq_span_positiveGenerator 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 @@ -186,6 +209,7 @@ theorem eq_of_spanSingleton_eq_of_pos simpa [Units.smul_def, Algebra.smul_def, hu1] using hu linarith +open scoped Classical in @[simp] theorem positiveRationalIdealGenerator_one : positiveRationalIdealGenerator (1 : FractionalIdealGroup ℚ) = 1 := by @@ -194,6 +218,7 @@ theorem positiveRationalIdealGenerator_one : rw [← rationalFractionalIdeal_eq_span_positiveGenerator] exact FractionalIdeal.spanSingleton_one.symm +open scoped Classical in theorem positiveRationalIdealGenerator_mul (I J : FractionalIdealGroup ℚ) : positiveRationalIdealGenerator (I * J) = @@ -209,12 +234,14 @@ theorem positiveRationalIdealGenerator_mul ← 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 ℚ) : @@ -222,6 +249,7 @@ theorem positiveRationalIdealGeneratorUnit_val positiveRationalIdealGenerator I := rfl +open scoped Classical in theorem toPrincipalIdeal_positiveRationalIdealGeneratorUnit (I : FractionalIdealGroup ℚ) : toPrincipalIdeal (𝓞 ℚ) ℚ @@ -234,6 +262,7 @@ theorem toPrincipalIdeal_positiveRationalIdealGeneratorUnit rationalFractionalIdeal I exact (rationalFractionalIdeal_eq_span_positiveGenerator I).symm +open scoped Classical in @[simp] theorem positiveRationalIdealGeneratorUnit_one : positiveRationalIdealGeneratorUnit @@ -241,6 +270,7 @@ theorem positiveRationalIdealGeneratorUnit_one : apply Units.ext exact positiveRationalIdealGenerator_one +open scoped Classical in theorem positiveRationalIdealGeneratorUnit_mul (I J : FractionalIdealGroup ℚ) : positiveRationalIdealGeneratorUnit (I * J) = @@ -249,6 +279,7 @@ theorem positiveRationalIdealGeneratorUnit_mul 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 @@ -261,6 +292,7 @@ theorem withZero_eq_one_of_log_eq_zero _ = 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 @@ -278,6 +310,7 @@ theorem valuation_eq_one_of_principal_count_eq_zero (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 @@ -298,6 +331,7 @@ theorem not_dvd_den_of_principal_count_eq_zero 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 @@ -327,6 +361,7 @@ theorem not_dvd_num_of_principal_count_eq_zero (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)) : @@ -355,6 +390,7 @@ theorem positiveGenerator_den_coprime rw [hvgen] exact hpden) +open scoped Classical in theorem positiveGenerator_num_coprime {m : ℕ} (hm : m ≠ 0) (I : primeToModulusIdeals (rationalModulus m)) : @@ -384,6 +420,7 @@ theorem positiveGenerator_num_coprime 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) : @@ -391,6 +428,7 @@ def rationalNumeratorResidueUnit 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) : @@ -398,6 +436,7 @@ def rationalDenominatorResidueUnit 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 @@ -408,6 +447,7 @@ def rationalResidueUnit 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) @@ -420,6 +460,7 @@ theorem rationalResidueUnit_congr subst r rfl +open scoped Classical in /-- Reduction of rational numbers prime to a modulus is multiplicative. -/ theorem rationalResidueUnit_mul (m : ℕ) (q r : ℚ) @@ -455,6 +496,7 @@ theorem rationalResidueUnit_mul _ = (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 @@ -462,6 +504,7 @@ theorem rationalResidueUnit_one (m : ℕ) : 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 @@ -491,6 +534,7 @@ theorem rationalResidueUnit_eq_one_iff_modEq 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 @@ -550,6 +594,7 @@ noncomputable def primeToIdealResidueHom (positiveGenerator_den_coprime hm J) hprodnum hprodden +open scoped Classical in @[simp] theorem primeToIdealResidueHom_apply (m : ℕ) (hm : m ≠ 0) @@ -562,6 +607,7 @@ theorem primeToIdealResidueHom_apply (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 @@ -595,6 +641,7 @@ theorem principalNat_mem_primeToModulusIdeals 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 @@ -619,6 +666,7 @@ theorem positiveGenerator_toPrincipalIdeal_nat _ = 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 @@ -628,6 +676,7 @@ theorem rationalNumeratorResidueUnit_natCast (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) : @@ -635,6 +684,7 @@ theorem rationalDenominatorResidueUnit_natCast apply Units.ext simp [rationalDenominatorResidueUnit] +open scoped Classical in /-- Rational reduction of a positive natural cast agrees with ordinary residue reduction. -/ theorem rationalResidueUnit_natCast @@ -653,6 +703,7 @@ theorem rationalResidueUnit_natCast 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 @@ -702,6 +753,7 @@ theorem primeToIdealResidueHom_surjective /-! ### The local congruence condition over `ℚ` -/ +open scoped Classical in /-- The integral local unit attached to a rational principal idele component. -/ def principalLocalIntegralUnit @@ -716,6 +768,7 @@ def principalLocalIntegralUnit 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 (𝓞 ℚ)) @@ -724,6 +777,7 @@ def rationalLocalIntegralValue ((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 @@ -747,6 +801,7 @@ theorem rationalLocalHigherUnitMap_eq_one_iff 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 @@ -765,6 +820,7 @@ theorem principalLocalIntegralValue_coe 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 @@ -780,6 +836,7 @@ theorem map_maximalIdeal_pow_padicIntEquiv 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 @@ -820,6 +877,7 @@ theorem rationalLocalIntegralValue_sub_mem_iff (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] @@ -830,6 +888,7 @@ theorem primesEquiv_val_eq_natGenerator 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 @@ -850,6 +909,7 @@ theorem principalFiniteComponent_mem_localHigherUnitGroup_iff · 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 @@ -858,6 +918,7 @@ theorem rational_den_mul_self_eq_num (q : ℚ) : 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 @@ -876,12 +937,14 @@ theorem principalLocalIntegralValue_den_mul 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 @@ -935,6 +998,7 @@ theorem principalLocalResidue_den_mul 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 @@ -948,6 +1012,7 @@ theorem not_dvd_den_of_valuation_eq_one (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 @@ -996,10 +1061,11 @@ theorem principalLocalHigherUnit_iff_modEq 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*} [DecidableEq ι] + {ι : Type*} (s : Finset ι) (f : ι → ℕ) (hpair : ∀ i ∈ s, ∀ j ∈ s, i ≠ j → @@ -1007,6 +1073,8 @@ theorem intModEq_finset_prod_of_pairwise_coprime {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)) @@ -1036,6 +1104,7 @@ theorem intModEq_finset_prod_of_pairwise_coprime · 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 @@ -1062,6 +1131,7 @@ theorem intModEq_of_primePower_modEq 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 @@ -1069,6 +1139,7 @@ theorem primePower_factorization_dvd 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 @@ -1114,6 +1185,7 @@ theorem principalIdele_infinite_mem_iff_pos 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. -/ @@ -1190,6 +1262,7 @@ theorem principalIdele_positiveGenerator_mem_primeTo_iff_modEq 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 @@ -1263,6 +1336,7 @@ theorem mem_principalRayIdealSubgroup_iff_modEq 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 @@ -1280,6 +1354,7 @@ theorem primeToIdealResidueHom_ker (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 @@ -1293,6 +1368,7 @@ noncomputable def idealRayClassGroupEquivZModUnits (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean index f5089fefda..4b98403b41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean @@ -20,7 +20,7 @@ the congruence subgroups are cofinal among the closed finite-index subgroups of the idele class group. -/ -open scoped Classical NumberField RestrictedProduct WithZero +open scoped NumberField RestrictedProduct WithZero open NumberField IsDedekindDomain open Topology @@ -31,6 +31,7 @@ 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)) @@ -39,6 +40,7 @@ def localIntegralValue ((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 @@ -62,6 +64,7 @@ theorem localHigherUnitMap_eq_one_iff (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)) @@ -74,6 +77,7 @@ theorem localHigherUnitGroup_antitone 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 @@ -124,6 +128,7 @@ theorem isOpen_localHigherUnitGroup 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 : ℕ) : @@ -134,6 +139,7 @@ theorem localHigherUnitGroup_le_finiteLocalUnits 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 @@ -193,6 +199,7 @@ theorem isOpen_finiteCongruenceSubgroup (m : FiniteModulus K) : 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) : @@ -223,6 +230,7 @@ theorem isOpen_infinitePositiveSubgroup (v : InfinitePlace K) : 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 : @@ -237,6 +245,7 @@ theorem isOpen_infinitePositivePiSubgroup : 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 @@ -246,6 +255,7 @@ theorem isOpen_narrowInfiniteCongruenceSubgroup : 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 @@ -280,6 +290,7 @@ theorem isOpen_infiniteCongruenceSubgroup (m : Modulus K) : rw [hU] exact hUOpen +open scoped Classical in /-- The idele congruence subgroup `I_K^m` is open. -/ theorem isOpen_ideleCongruenceSubgroup (m : Modulus K) : IsOpen @@ -289,6 +300,7 @@ theorem isOpen_ideleCongruenceSubgroup (m : Modulus 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 @@ -356,6 +368,7 @@ theorem localHigherUnit_norm_sub_one_le 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 @@ -370,6 +383,7 @@ theorem local_irreducible_norm_lt_one ((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 @@ -416,6 +430,7 @@ theorem exists_localHigherUnitGroup_subset 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 @@ -499,6 +514,7 @@ theorem exists_finiteCongruenceSubgroup_subset 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 @@ -511,6 +527,7 @@ def realCompletionContinuousMulEquiv continuous_invFun := (InfinitePlace.Completion.isometryEquivRealOfIsReal hv).symm.continuous +open scoped Classical in /-- The multiplicative topological equivalence between a complex infinite completion and `ℂ`. -/ def complexCompletionContinuousMulEquiv @@ -523,10 +540,12 @@ def complexCompletionContinuousMulEquiv 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 @@ -541,6 +560,7 @@ theorem continuous_positiveRealUnit : (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 @@ -605,6 +625,7 @@ theorem isConnected_infinitePositiveSubgroup exact e.symm.continuous omit [NumberField K] in +open scoped Classical in /-- The narrow archimedean positivity subgroup is connected. -/ theorem isConnected_narrowInfiniteCongruenceSubgroup : IsConnected @@ -642,6 +663,7 @@ theorem isConnected_narrowInfiniteCongruenceSubgroup : 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}) : @@ -651,6 +673,7 @@ def realPlaceSign (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 →* @@ -659,6 +682,7 @@ def infiniteSign : (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 : @@ -697,6 +721,7 @@ theorem infiniteSign_ker_eq_narrowInfiniteCongruenceSubgroup : 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 : @@ -704,6 +729,7 @@ instance narrowInfiniteCongruenceSubgroupFiniteIndex : 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 @@ -717,6 +743,7 @@ instance Modulus.infiniteCongruenceSubgroupFiniteIndex 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 @@ -726,6 +753,7 @@ theorem finiteCongruenceSubgroup_le_integralSubgroup 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 @@ -748,6 +776,7 @@ instance finiteCongruenceSubgroupFiniteRelIndex 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) : @@ -757,6 +786,7 @@ theorem finiteCongruenceSubgroup_antitone 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 @@ -767,6 +797,7 @@ theorem Modulus.infiniteCongruenceSubgroup_antitone 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) : @@ -776,6 +807,7 @@ theorem Modulus.ideleCongruenceSubgroup_antitone 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) : @@ -786,6 +818,7 @@ theorem Modulus.congruenceSubgroup_antitone ((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 : @@ -800,6 +833,7 @@ def integralIdeleEquiv : 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) : @@ -816,6 +850,7 @@ theorem map_ideleCongruenceSubgroup_subgroupOf_integral (m : Modulus K) : · 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 @@ -845,6 +880,7 @@ instance ideleCongruenceSubgroupFiniteRelIndex ((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) ⊔ @@ -858,6 +894,7 @@ instance ordinaryIdealClassSubgroupFiniteIndex : (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) : @@ -892,6 +929,7 @@ instance ideleCongruenceSupPrincipalFiniteIndex ← 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 @@ -907,6 +945,7 @@ theorem isOpen_congruenceSubgroup (m : Modulus K) : 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 @@ -916,6 +955,7 @@ theorem isClosed_congruenceSubgroup (m : Modulus 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 @@ -927,6 +967,7 @@ instance congruenceSubgroupFiniteIndex (m : Modulus 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 @@ -965,6 +1006,7 @@ theorem narrowInfiniteCongruenceSubgroup_mapsTo_openSubgroup ⟨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 @@ -1034,6 +1076,7 @@ theorem exists_congruenceSubgroup_le_of_isOpen 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 @@ -1043,6 +1086,7 @@ noncomputable def chosenModulusInside Classical.choose (exists_congruenceSubgroup_le_of_isOpen H hH) +open scoped Classical in /-- The chosen modulus has the required subgroup inclusion. -/ theorem chosenModulusInside_spec @@ -1052,6 +1096,7 @@ theorem chosenModulusInside_spec 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 @@ -1062,6 +1107,7 @@ noncomputable def modulusInsideClosedFiniteIndex 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 @@ -1072,6 +1118,7 @@ theorem modulusInsideClosedFiniteIndex_spec 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean index 2f35acbb4b..bf2df59315 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -17,7 +17,7 @@ usual way. For a stable finite set of finite places these actions restrict to the actual `S`-unit group. -/ -open scoped BigOperators Classical NumberField nonZeroDivisors +open scoped BigOperators NumberField nonZeroDivisors open IsDedekindDomain Module open CyclicCohomology.ProfiniteCohomology.Herbrand open CyclicCohomology @@ -28,6 +28,7 @@ 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) : @@ -36,6 +37,7 @@ noncomputable def finitePlaceEquiv HeightOneSpectrum.equivOfRingEquiv (NumberField.RingOfIntegers.mapAlgEquiv σ).toRingEquiv +open scoped Classical in /-- Transport of ideals along a ring automorphism, as a multiplicative equivalence. -/ noncomputable def idealMapMulEquiv @@ -47,6 +49,7 @@ noncomputable def idealMapMulEquiv 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] @@ -55,6 +58,7 @@ theorem idealMapMulEquiv_apply rfl omit [NumberField K] [NumberField L] in +open scoped Classical in @[simp] theorem finitePlaceEquiv_asIdeal (σ : L ≃ₐ[K] L) @@ -66,6 +70,7 @@ theorem finitePlaceEquiv_asIdeal 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)) : @@ -84,6 +89,7 @@ theorem finitePlaceEquiv_one rw [hx] omit [NumberField K] [NumberField L] in +open scoped Classical in @[simp] theorem finitePlaceEquiv_mul (σ τ : L ≃ₐ[K] L) @@ -108,6 +114,7 @@ theorem finitePlaceEquiv_mul rw [hx] omit [NumberField K] [NumberField L] in +open scoped Classical in @[simp] theorem finitePlaceEquiv_inv_apply (σ : L ≃ₐ[K] L) @@ -117,6 +124,7 @@ theorem finitePlaceEquiv_inv_apply rw [← finitePlaceEquiv_mul] simp +open scoped Classical in /-- The actual Galois action on finite places of `L`. -/ @[reducible] noncomputable def finitePlaceMulAction : @@ -127,6 +135,7 @@ noncomputable def finitePlaceMulAction : 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 @@ -159,6 +168,7 @@ theorem intValuation_finitePlaceEquiv (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 @@ -185,10 +195,11 @@ theorem valuation_finitePlaceEquiv 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] - [Module.Free ℤ R] [Infinite 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, @@ -196,6 +207,7 @@ theorem absNorm_map_ringEquiv 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 ℤ)) : @@ -205,6 +217,7 @@ private theorem toNNReal_apply_congr 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 @@ -233,6 +246,7 @@ theorem adicAbv_finitePlaceEquiv 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 @@ -242,6 +256,7 @@ theorem infinitePlace_mult_smul 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 : @@ -258,16 +273,25 @@ noncomputable def fieldUnitsMulDistribMulAction : section FinitePlaceAction -local instance : +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 -local instance : +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) @@ -275,6 +299,7 @@ theorem finitePlace_smul_def σ • 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 @@ -284,6 +309,7 @@ def IsGaloisStableFinitePlaces 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) @@ -293,6 +319,7 @@ theorem IsGaloisStableFinitePlaces.smul_mem (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) @@ -303,6 +330,7 @@ theorem IsGaloisStableFinitePlaces.smul_not_mem 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 @@ -330,6 +358,7 @@ theorem sUnit_smul_mem 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 @@ -342,7 +371,7 @@ noncomputable def sUnitMulDistribMulAction (sUnit_smul_mem K L hS) omit [NumberField K] in -@[simp] +open scoped Classical in theorem sUnit_smul_coe {S : Finset (HeightOneSpectrum (𝓞 L))} (hS : IsGaloisStableFinitePlaces K L S) @@ -353,6 +382,7 @@ theorem sUnit_smul_coe 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] @@ -371,6 +401,7 @@ noncomputable def stableFinitePlaceMulAction apply Subtype.ext exact mul_smul σ τ (v : HeightOneSpectrum (𝓞 L)) +open scoped Classical in /-- The permutation action on all logarithmic places `InfinitePlace L ⊕ S`. -/ @[reducible] @@ -409,6 +440,7 @@ noncomputable def logPlaceMulAction 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 @@ -444,6 +476,7 @@ noncomputable def additiveSUnitDistribMulAction (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] @@ -474,6 +507,7 @@ noncomputable def fullLogSpaceDistribMulAction rfl } omit [NumberField K] [NumberField L] in +open scoped Classical in @[simp] theorem fullLogSpace_smul_apply {S : Finset (HeightOneSpectrum (𝓞 L))} @@ -486,6 +520,7 @@ theorem fullLogSpace_smul_apply (σ • 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))) @@ -497,6 +532,7 @@ noncomputable def logPlacePermutationHom (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))} @@ -508,6 +544,7 @@ theorem logPlacePermutationHom_apply 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 @@ -526,6 +563,7 @@ theorem permutationRepresentation_logPlace rfl omit [NumberField K] in +open scoped Classical in /-- Coordinate sum is invariant under the place permutation. -/ theorem coordinateSum_smul {S : Finset (HeightOneSpectrum (𝓞 L))} @@ -547,6 +585,7 @@ theorem coordinateSum_smul z (σ⁻¹ • p)) z (fun _ => rfl) +open scoped Classical in /-- The constant vector whose coordinate sum is one. -/ noncomputable def normalizedLogDiagonal (S : Finset (HeightOneSpectrum (𝓞 L))) : @@ -555,6 +594,7 @@ noncomputable def normalizedLogDiagonal (Fintype.card (SUnitGroup.LogPlace (K := L) S) : ℝ)⁻¹ +open scoped Classical in @[simp] theorem coordinateSum_normalizedLogDiagonal (S : Finset (HeightOneSpectrum (𝓞 L))) : @@ -570,6 +610,7 @@ theorem coordinateSum_normalizedLogDiagonal (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 @@ -602,6 +643,7 @@ noncomputable def fullLogSpaceSplit · 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 @@ -640,6 +682,7 @@ theorem fullLogSpaceSplit_injective rw [hfirst, hsecond] _ = z' := sub_add_cancel _ _ +open scoped Classical in theorem fullLogSpaceSplit_surjective (S : Finset (HeightOneSpectrum (𝓞 L))) : Function.Surjective (fullLogSpaceSplit L S) := by @@ -668,6 +711,7 @@ theorem fullLogSpaceSplit_surjective 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 @@ -679,6 +723,7 @@ noncomputable def fullLogSpaceEquivHyperplaneProd ⟨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))) : @@ -686,6 +731,7 @@ noncomputable def fullLogSpaceContinuousEquivHyperplaneProd (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 @@ -698,6 +744,7 @@ noncomputable def fullLogLatticeRealBasis (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 @@ -708,6 +755,7 @@ noncomputable def fullLogHyperplaneDiagonalBasis ℝ (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 @@ -717,6 +765,7 @@ noncomputable def fullLogHyperplaneDiagonalLattice 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 @@ -726,6 +775,7 @@ noncomputable def extendedFullLogLattice (fullLogHyperplaneDiagonalLattice L S) (fullLogSpaceContinuousEquivHyperplaneProd L S).toLinearMap +open scoped Classical in instance instDiscreteTopology_extendedFullLogLattice (S : Finset (HeightOneSpectrum (𝓞 L))) : DiscreteTopology (extendedFullLogLattice L S) := by @@ -753,6 +803,7 @@ instance instDiscreteTopology_extendedFullLogLattice (fullLogHyperplaneDiagonalLattice L S) e.continuous e.injective +open scoped Classical in instance instIsZLattice_extendedFullLogLattice (S : Finset (HeightOneSpectrum (𝓞 L))) : IsZLattice ℝ (extendedFullLogLattice L S) := by @@ -783,6 +834,7 @@ instance instIsZLattice_extendedFullLogLattice 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 @@ -832,6 +884,7 @@ theorem fullLogAmbient_smul y simpa using h +open scoped Classical in /-- The coordinate-permutation action restricted to the coordinate-sum-zero hyperplane. -/ @[reducible] @@ -871,6 +924,7 @@ noncomputable def logHyperplaneDistribMulAction (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 @@ -893,6 +947,7 @@ theorem fullLog_smul 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 @@ -907,6 +962,7 @@ theorem fullLog_ker_eq_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 @@ -940,6 +996,7 @@ noncomputable def (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 @@ -968,6 +1025,7 @@ theorem fullLogLattice_smul_mem 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 @@ -997,6 +1055,7 @@ theorem fullLogSpaceSplit_fst_smul rfl omit [NumberField K] in +open scoped Classical in /-- Under the coordinate splitting, the diagonal coordinate is Galois-invariant. -/ theorem fullLogSpaceSplit_snd_smul @@ -1013,6 +1072,7 @@ theorem fullLogSpaceSplit_snd_smul 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 @@ -1084,6 +1144,7 @@ theorem extendedFullLogLattice_permutation_stable 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 @@ -1101,6 +1162,7 @@ theorem extendedFullLogPermutationSublattice_finite_quotient (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index 6ad22791dc..85aad8b580 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -17,7 +17,7 @@ integer direction, and combines the resulting exact sequences with the permutation-lattice calculation. -/ -open scoped BigOperators Classical NumberField nonZeroDivisors Pointwise +open scoped BigOperators NumberField nonZeroDivisors Pointwise open IsDedekindDomain Module noncomputable section @@ -31,6 +31,7 @@ variable section LogarithmicQuotient +open scoped Classical in /-- The additive Galois action restricted to the actual full logarithmic lattice. -/ @[reducible] @@ -71,6 +72,7 @@ noncomputable def fullLogLatticeDistribMulAction (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 @@ -96,6 +98,7 @@ noncomputable def sUnitFullLogMulHom (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))) : @@ -121,6 +124,7 @@ theorem sUnitFullLogMulHom_surjective 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 @@ -162,6 +166,7 @@ theorem sUnitFullLogMulHom_ker 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 @@ -202,6 +207,7 @@ theorem sUnitFullLogMulHom_equivariant 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 @@ -217,6 +223,7 @@ noncomputable def rootsOfUnityEquivSUnitTorsion (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))) : @@ -228,6 +235,7 @@ theorem sUnitTorsionFinite (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))} @@ -248,6 +256,7 @@ theorem sUnitTorsion_stable (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))) : @@ -282,6 +291,7 @@ 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 @@ -342,6 +352,7 @@ theorem mem_fullLogHyperplaneDiagonalLattice_iff 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. -/ @@ -431,6 +442,7 @@ noncomputable def fullLogLatticeProdIntToExtended congr 1 ext <;> simp +open scoped Classical in /-- The preceding map is bijective. -/ theorem fullLogLatticeProdIntToExtended_bijective (S : Finset (HeightOneSpectrum (𝓞 L))) : @@ -517,6 +529,7 @@ theorem fullLogLatticeProdIntToExtended_bijective 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 @@ -527,6 +540,7 @@ noncomputable def extendedFullLogLatticeEquivProdInt (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] @@ -561,6 +575,7 @@ noncomputable def fullLogLatticeProdIntDistribMulAction · 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 @@ -729,6 +744,7 @@ theorem fullLogLatticeProdIntToExtended_equivariant (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))} @@ -807,6 +823,7 @@ 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 @@ -821,6 +838,7 @@ def fullLogLatticeProdIntIncl 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 @@ -834,6 +852,7 @@ def fullLogLatticeProdIntProj 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 @@ -844,6 +863,7 @@ noncomputable def extendedFullLogLatticeMulEquivProdInt (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 @@ -938,6 +958,7 @@ theorem extendedFullLogLatticeMulEquivProdInt_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))} @@ -986,6 +1007,7 @@ theorem fullLogLatticeProdIntIncl_equivariant 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 @@ -1032,6 +1054,7 @@ theorem fullLogLatticeProdIntProj_equivariant intro σ z rfl +open scoped Classical in /-- Exactness of the first-factor inclusion followed by the diagonal projection. -/ theorem fullLogLatticeProdInt_exact @@ -1057,6 +1080,7 @@ theorem fullLogLatticeProdInt_exact · rintro ⟨x, rfl⟩ rfl +open scoped Classical in /-- The first-factor inclusion is injective. -/ theorem fullLogLatticeProdIntIncl_injective (S : Finset (HeightOneSpectrum (𝓞 L))) : @@ -1071,6 +1095,7 @@ theorem fullLogLatticeProdIntIncl_injective (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))) : @@ -1081,6 +1106,7 @@ theorem fullLogLatticeProdIntProj_surjective ⟨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 @@ -1357,6 +1383,7 @@ 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. -/ @@ -1589,6 +1616,7 @@ 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 @@ -1625,6 +1653,7 @@ theorem finitePlace_stabilizer_eq_idealStabilizer 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)`. -/ @@ -1634,6 +1663,7 @@ noncomputable def finiteLogPlaceLocalDegree 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 @@ -1660,6 +1690,7 @@ theorem finitePlace_stabilizer_card_eq_localDegree 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 @@ -1691,6 +1722,7 @@ theorem stableFinitePlace_stabilizer_card_eq_localDegree 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)`. -/ @@ -1704,6 +1736,7 @@ noncomputable def logPlaceLocalDegree | 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 @@ -1753,6 +1786,7 @@ theorem logPlace_stabilizer_card_eq_localDegree 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 @@ -1777,6 +1811,7 @@ theorem permutationOrbitStabilizer_card_eq_logPlaceLocalDegree 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean index dd4679b7fc..c10980cb8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -26,7 +26,7 @@ lattice. noncomputable section open IsDedekindDomain Module -open scoped Classical NumberField nonZeroDivisors +open scoped NumberField nonZeroDivisors variable {K : Type*} [Field K] [NumberField K] @@ -35,12 +35,14 @@ 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 @@ -82,6 +84,7 @@ noncomputable def reducedLog : 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 @@ -97,6 +100,7 @@ theorem adicAbv_eq_zpow_neg_divisorCoordinate · 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 @@ -113,12 +117,14 @@ theorem log_adicAbv_eq_neg_divisorCoordinate_mul_log_absNorm 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)ˣ) : @@ -129,6 +135,7 @@ theorem reducedLog_fst_fromNumberFieldUnits ext w rfl +open scoped Classical in @[simp] theorem reducedLog_snd_fromNumberFieldUnits (u : (𝓞 K)ˣ) : @@ -154,6 +161,7 @@ theorem reducedLog_snd_fromNumberFieldUnits 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)) : @@ -217,6 +225,7 @@ theorem reducedLog_eq_zero_iff 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 : @@ -227,11 +236,13 @@ theorem reducedLogLinearMap_ker : 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 @@ -255,6 +266,7 @@ theorem norm_reducedLog_finite_lt_one_implies_zero 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. -/ @@ -354,6 +366,7 @@ instance instDiscreteTopology_reducedLogLattice : 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 : @@ -382,6 +395,7 @@ theorem finrank_reducedLogLattice : _ = 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 : @@ -390,6 +404,7 @@ theorem finrank_reducedLogSpace : classical simp [NumberField.Units.rank] +open scoped Classical in /-- The reduced logarithmic lattice spans its whole real ambient space. -/ theorem reducedLogLattice_span_eq_top : @@ -427,6 +442,7 @@ theorem reducedLogLattice_span_eq_top : (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 : @@ -435,16 +451,19 @@ instance instIsZLattice_reducedLogLattice : 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 @@ -457,11 +476,13 @@ noncomputable def coordinateSum : 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 : @@ -488,6 +509,7 @@ noncomputable def fullLogAmbient : ext p cases p <;> simp [Real.log_mul, mul_add] +open scoped Classical in @[simp] theorem fullLogAmbient_infinite (x : Additive (SUnitGroup (K := K) S)) @@ -500,6 +522,7 @@ theorem fullLogAmbient_infinite SUnitGroup (K := K) S) : Kˣ) : K)) := rfl +open scoped Classical in @[simp] theorem fullLogAmbient_finite (x : Additive (SUnitGroup (K := K) S)) (v : S) : @@ -511,6 +534,7 @@ theorem fullLogAmbient_finite 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) @@ -521,6 +545,7 @@ theorem adicAbv_eq_one_of_not_mem 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 @@ -550,6 +575,7 @@ theorem finprod_finitePlace_eq_prod_adicAbv 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 @@ -610,6 +636,7 @@ theorem sum_log_absoluteValues_eq_zero _ = 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 ∈ @@ -623,6 +650,7 @@ theorem fullLogAmbient_mem_logHyperplane 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 : @@ -632,6 +660,7 @@ noncomputable def fullLog : (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) : ℝ := @@ -639,6 +668,7 @@ noncomputable def finiteLogWeight (v : S) : ℝ := (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 : @@ -650,6 +680,7 @@ theorem finiteLogWeight_ne_zero (v : S) : (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 : @@ -680,6 +711,7 @@ noncomputable def forgetDistinguishedLog : 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 : @@ -783,6 +815,7 @@ theorem forgetDistinguishedLog_injective : linarith · exact hinf ⟨w, hw⟩ +open scoped Classical in /-- Every reduced logarithmic vector has a lift to the product-formula hyperplane. -/ theorem forgetDistinguishedLog_surjective : @@ -857,6 +890,7 @@ theorem forgetDistinguishedLog_surjective : 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 : @@ -867,6 +901,7 @@ noncomputable def logHyperplaneEquivReduced : ⟨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 @@ -898,6 +933,7 @@ theorem logHyperplaneEquivReduced_fullLog 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 @@ -915,6 +951,7 @@ theorem fullLog_eq_zero_iff 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 : @@ -922,6 +959,7 @@ noncomputable def logHyperplaneContinuousEquivReduced : 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) := @@ -930,6 +968,7 @@ noncomputable def fullLogLattice : (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 : @@ -959,6 +998,7 @@ theorem fullLogLattice_eq_range : rw [logHyperplaneEquivReduced_fullLog] exact LinearMap.mem_range_self _ x +open scoped Classical in instance instDiscreteTopology_fullLogLattice : DiscreteTopology (fullLogLattice (K := K) S) := by @@ -970,6 +1010,7 @@ instance instDiscreteTopology_fullLogLattice : (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 : @@ -987,20 +1028,24 @@ 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 @@ -1010,29 +1055,45 @@ theorem torsionAdditive_eq : 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 -local instance instModule_freeQuotient : +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 : @@ -1055,6 +1116,7 @@ theorem finrank_freeQuotient : 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)) ℤ @@ -1067,6 +1129,7 @@ noncomputable def basisFreeQuotient : 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 : @@ -1129,6 +1192,7 @@ noncomputable def rootsOfUnityEquivTorsion : 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. -/ private noncomputable def torsionQuotientSection : @@ -1139,6 +1203,7 @@ private noncomputable def torsionQuotientSection : 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) = @@ -1148,6 +1213,7 @@ private theorem torsionQuotientSection_spec : 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. -/ private noncomputable def torsionProdFreeQuotientEquiv : @@ -1160,6 +1226,7 @@ private noncomputable def torsionProdFreeQuotientEquiv : rw [Submodule.range_subtype, Submodule.ker_mkQ]) (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`. -/ @@ -1171,6 +1238,7 @@ noncomputable def decompositionLinearEquiv : ((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 : @@ -1194,6 +1262,7 @@ noncomputable def multiplicativeRootsOfUnityEquiv : 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean index 798dd20ef1..026c3c95b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean @@ -17,7 +17,7 @@ universe u v formulation avoids making a global choice of ray class field. -/ def EmbedsInRayClassField (K : Type u) [Field K] [NumberField K] - (L : Type v) [Field L] [NumberField L] [Algebra K L] + (L : Type v) [Field L] [Algebra K L] (m : RayClassModulus K) : Prop := ∃ R : RayClassFieldRealization K m, Nonempty (L →ₐ[K] R.extension) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean index 834e3146d1..4ef686ce23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean @@ -17,7 +17,7 @@ The norm sends its exponent to the prime below, multiplied by the inertia degree. The resulting map on finitely supported exponent vectors is additive. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -26,6 +26,7 @@ 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) @@ -40,6 +41,7 @@ def fractionalIdealNormPrimeBelow (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. -/ @@ -47,7 +49,7 @@ def fractionalIdealNormExponentMap (K : Type u) (L : Type v) [Field K] [NumberField K] [Field L] [NumberField L] [Algebra K L] - [FiniteDimensional K L] : + : (HeightOneSpectrum (𝓞 L) →₀ ℤ) →+ (HeightOneSpectrum (𝓞 K) →₀ ℤ) := Finsupp.liftAddHom fun W => diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean index 73ea12da9b..48eda2697b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean @@ -24,7 +24,7 @@ is used; this predicate does not bound conductor exponents. -/ def IsUnramifiedOutsideModulus (K : Type u) (L : Type v) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] (m : RayClassModulus K) : Prop := (∀ v : HeightOneSpectrum (𝓞 K), v ∉ m.finitePart.support → Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal) ∧ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean index deed37faa6..a0e302fc3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean @@ -12,12 +12,13 @@ import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification noncomputable section -open scoped Classical + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean index 066e0e4287..8c74862410 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean @@ -16,7 +16,7 @@ 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. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -25,6 +25,7 @@ namespace ClassFieldTheory universe u +open scoped Classical in private def rayLocalIntegralValue {K : Type u} [Field K] [NumberField K] (v : HeightOneSpectrum (𝓞 K)) @@ -33,6 +34,7 @@ private def rayLocalIntegralValue ((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 : ℕ) @@ -51,6 +53,7 @@ private theorem rayLocalHigherUnitMap_eq_one_iff (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)) @@ -71,6 +74,7 @@ private theorem rayLocalHigherUnitGroup_antitone 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) @@ -87,6 +91,7 @@ private theorem rayCongruent_of_le · 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) : @@ -94,6 +99,7 @@ private theorem rayPrimeToIdeals_antitone 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) : @@ -102,6 +108,7 @@ private theorem rayPrincipalIdeals_antitone 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean index 67697e054f..cd569928ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean @@ -17,7 +17,7 @@ ray quotient gives its genuine ideal-norm image. This construction does not identify ideal norms with idèle-class norms. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -26,6 +26,7 @@ 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) @@ -46,6 +47,7 @@ def rayClassPrimeToIdealNormDomain 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 @@ -86,6 +88,7 @@ theorem fractionalIdealNorm_count 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 @@ -122,6 +125,7 @@ def rayClassPrimeToIdealNorm (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) @@ -133,6 +137,7 @@ def rayClassIdealNorm (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean index 6ff8cdd046..fc4b5ad108 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean @@ -26,7 +26,7 @@ universe u /-- A real infinite place of a number field. -/ abbrev RayClassRealPlace - (K : Type u) [Field K] [NumberField K] := + (K : Type u) [Field K] := {v : InfinitePlace K // v.IsReal} /-- A ray modulus: finite prime exponents together with the real places at diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean index 6f42e77c22..98b20956ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean @@ -12,7 +12,7 @@ import Mathlib.RingTheory.Frobenius # Arithmetic Frobenius at a finite prime -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -21,6 +21,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean index 1190945f00..21ad001896 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean @@ -21,8 +21,8 @@ universe u v ramification index and inertia degree equal to one. -/ def FinitePrimeSplitsCompletely (K : Type u) (L : Type v) - [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field K] + [Field L] [Algebra K L] (v : HeightOneSpectrum (𝓞 K)) : Prop := ∀ w : HeightOneSpectrum (𝓞 L), w.asIdeal.LiesOver v.asIdeal → diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean index 82ea986a9a..6f757fa093 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean @@ -20,8 +20,8 @@ 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] [NumberField K] - [Field L] [NumberField L] [Algebra K L] : Prop := + [Field K] + [Field L] [Algebra K L] : Prop := ∀ v : HeightOneSpectrum (𝓞 K), Algebra.IsUnramifiedIn (𝓞 L) v.asIdeal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean index cb9f2ef1dc..b30bd0c660 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean @@ -17,7 +17,7 @@ supported integer exponents of finite primes. This equivalence is formulated entirely in Mathlib and public Definitions vocabulary. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -30,6 +30,7 @@ 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 := @@ -37,6 +38,7 @@ def primePowerHom (v : HeightOneSpectrum (𝓞 K)) : (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 : @@ -48,6 +50,7 @@ def factorization : (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) →₀ ℤ)) : @@ -58,6 +61,7 @@ theorem factorization_val 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) : @@ -68,6 +72,7 @@ theorem finite_count_support (I : NumberFieldFractionalIdealGroup K) : (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) : @@ -79,6 +84,7 @@ def countVector (I : NumberFieldFractionalIdealGroup K) : rw [Set.Finite.mem_toFinset] exact hv) +open scoped Classical in @[simp] theorem countVector_apply (I : NumberFieldFractionalIdealGroup K) (v : HeightOneSpectrum (𝓞 K)) : @@ -87,7 +93,7 @@ theorem countVector_apply (I : NumberFieldFractionalIdealGroup K) (I : FractionalIdeal (nonZeroDivisors (𝓞 K)) K) := rfl -@[simp] +open scoped Classical in theorem count_factorization (exps : Multiplicative (HeightOneSpectrum (𝓞 K) →₀ ℤ)) (v : HeightOneSpectrum (𝓞 K)) : @@ -98,6 +104,7 @@ theorem count_factorization 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 @@ -114,6 +121,7 @@ theorem ext_count {I J : NumberFieldFractionalIdealGroup K} (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 @@ -121,6 +129,7 @@ theorem factorization_injective : 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 @@ -133,6 +142,7 @@ theorem factorization_surjective : (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) →₀ ℤ) ≃* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean index 37d282bc7f..acd6cd1807 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean @@ -19,7 +19,7 @@ universe u /-- The group of nonzero fractional ideals of a number field. -/ abbrev NumberFieldFractionalIdealGroup - (K : Type u) [Field K] [NumberField K] := + (K : Type u) [Field K] := (FractionalIdeal (nonZeroDivisors (𝓞 K)) K)ˣ end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean index 4891265d5e..cf934b1aac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean @@ -23,7 +23,7 @@ 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] [NumberField K] := + (K : Type u) [Field K] := { E : IntermediateField K (SeparableClosure K) // FiniteDimensional K E ∧ IsAbelianGalois K E } diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean index bd16ccbcb5..39a028c2b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean @@ -30,7 +30,7 @@ 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] [FiniteDimensional K L] + [Field L] [Algebra K L] (v : HeightOneSpectrum (𝓞 K)) : Subgroup (v.adicCompletion K)ˣ := (Units.map (Algebra.norm (v.adicCompletion K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean index 36be6101bb..7a8fc8037e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -26,11 +26,11 @@ universe u v valuation ring of a finite Abelian local extension. -/ def inverseHerbrandFunction (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 : ℝ) : ℝ := Function.invFun diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean index ce9b8da56d..20b05d1224 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean @@ -26,7 +26,7 @@ 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] [NumberField F] + (F : Type u) [Field F] (n : ℕ+) (v : InfinitePlace F) (a b : Fˣ) : rootsOfUnity (n : ℕ) F := by by_cases hn : (n : ℕ) = 2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean index bd7b0f8f81..0e9cbf234d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean @@ -18,7 +18,7 @@ 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] [FiniteDimensional K L] : + [Field K] [Field L] [Algebra K L] : Lˣ →* Kˣ := Units.map (Algebra.norm K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean index 85b688b937..3d4afb3005 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean @@ -23,7 +23,7 @@ determinant norm from `K_w ⊗_K L`. -/ def IsNormAtFinitePlace (K : Type u) (L : Type v) [Field K] [NumberField K] - [Field L] [Algebra K L] [FiniteDimensional K L] + [Field L] [Algebra K L] (w : HeightOneSpectrum (𝓞 K)) (x : Kˣ) : Prop := ∃ y : (w.adicCompletion K ⊗[K] L)ˣ, Algebra.norm (w.adicCompletion K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean index 14b72b953b..db4ad23982 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean @@ -22,8 +22,8 @@ universe u v completion `K_w` is a determinant norm from `K_w ⊗_K L`. -/ def IsNormAtInfinitePlace (K : Type u) (L : Type v) - [Field K] [NumberField K] - [Field L] [Algebra K L] [FiniteDimensional K L] + [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) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean index 74cf5ec122..472f5aed88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -77,7 +77,7 @@ idele class group. -/ theorem ideleClassHerbrandH0_pow_finrank_eq_one (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] (q : letI := @@ -188,7 +188,7 @@ 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] [NumberField M] + [Field M] [Field L] [NumberField L] [Field N] [NumberField N] [Algebra K M] [Algebra K L] @@ -224,15 +224,15 @@ noncomputable def actualPushoutNormQuotientMap (K M L N : Type) [Field K] [NumberField K] [Field M] [NumberField M] - [Field L] [NumberField L] - [Field N] [NumberField N] + [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] [FiniteDimensional L N] - [IsGalois K M] : + [FiniteDimensional M N] + : RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L → RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M N := fun q => @@ -241,7 +241,6 @@ noncomputable def actualPushoutNormQuotientMap /-- The actual pushout norm-quotient map sends a quotient representative to the corresponding base-changed representative. -/ -@[simp] theorem actualPushoutNormQuotientMap_mk (K M L N : Type) [Field K] [NumberField K] @@ -416,7 +415,7 @@ theorem ideleClassNormQuotient_card_le_actual_tower_mul [Algebra K M] [Algebra M L] [Algebra K L] [IsScalarTower K M L] [FiniteDimensional K M] [FiniteDimensional M L] - [IsGalois K M] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L)] [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M)] : Nat.card (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) ≤ @@ -639,7 +638,7 @@ theorem relativeIdeleClassNormQuotient_finite_of_actual_tower [Algebra K M] [Algebra M L] [Algebra K L] [IsScalarTower K M L] [FiniteDimensional K M] [FiniteDimensional M L] - [IsGalois K M] + [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient M L)] [Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K M)] : Finite (RelativeIdeleGroup.Cohomology.IdeleClassNormQuotient K L) := by @@ -1126,8 +1125,8 @@ principal relative ideles. -/ theorem principalIdelesHerbrandHMinusOne_subsingleton (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] - [FiniteDimensional K L] [IsGalois K L] + [Field L] [Algebra K L] + [FiniteDimensional K L] (σ : L ≃ₐ[K] L) (hσ : ∀ τ : L ≃ₐ[K] L, τ ∈ Subgroup.zpowers σ) : letI := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index 0459851c03..5c7405aa67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -387,7 +387,7 @@ def allInfinitePlaceLocalNormCondition {K L : Type} [Field K] [NumberField K] [Field L] [Algebra K L] - [FiniteDimensional K L] : + : Subgroup (IdeleGroup K) := ⨅ v : InfinitePlace K, (Units.map @@ -479,7 +479,7 @@ theorem relativeIdeleNorm_range_eq_allPlaceLocalNormCondition def globalFieldNormSubgroup (K L : Type) [Field K] [Field L] [Algebra K L] - [FiniteDimensional K L] : + : Subgroup Kˣ := (Units.map (Algebra.norm K : L →* K)).range @@ -520,8 +520,8 @@ relative ideles. -/ noncomputable def principalIdeleHerbrandH0Map (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] - [FiniteDimensional K L] [IsGalois K L] : + [Field L] [Algebra K L] + [FiniteDimensional K L] : letI := RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L letI := @@ -710,8 +710,8 @@ attribute [local instance] noncomputable def ideleClassToPrincipalConnecting (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] - [FiniteDimensional K L] [IsGalois K L] : + [Field L] [Algebra K L] + [FiniteDimensional K L] : letI := RelativeIdeleGroup.Cohomology.relativeIdeleMulDistribMulAction K L letI := @@ -865,8 +865,8 @@ end IdeleClassConnecting concrete global norm quotient `Kˣ / N_{L/K}(Lˣ)`. -/ noncomputable def fieldUnitsHerbrandH0EquivGlobalNormQuotient (K L : Type) - [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field K] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : letI := LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L @@ -927,9 +927,9 @@ noncomputable def fieldUnitsToRelativeIdeleHerbrandH0 field. -/ noncomputable def baseFieldUnitAsFixedUnit (K L : Type) - [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] - [FiniteDimensional K L] [IsGalois K L] + [Field K] + [Field L] [Algebra K L] + (x : Kˣ) : letI := LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L @@ -1227,7 +1227,6 @@ noncomputable def hasseNormDiagonal /-- The Hasse norm diagonal sends the class of a field unit to the class of its principal idele. -/ -@[simp] theorem hasseNormDiagonal_mk {K L : Type} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean index 3ef76f7010..1f63774471 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean @@ -16,7 +16,7 @@ This file defines the concrete idele-class subgroup attached to local power conditions and computes its archimedean local indices. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open KummerTheory @@ -26,6 +26,7 @@ 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 @@ -35,6 +36,7 @@ def ideleClassPowerLocalUnitSubgroup (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 : ℕ+) @@ -46,6 +48,7 @@ theorem mem_ideleClassPowerLocalUnitSubgroup_iff 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 @@ -55,6 +58,7 @@ abbrev IdeleClassPowerLocalUnitQuotient 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 @@ -86,6 +90,7 @@ theorem nthPowerSubgroup_le_infinitePositiveSubgroup 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) @@ -98,6 +103,7 @@ def realInfinitePlaceSignHom 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 @@ -133,6 +139,7 @@ theorem realInfinitePlaceSignHom_ker 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) @@ -155,6 +162,7 @@ theorem realInfinitePlaceSignHom_surjective 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 @@ -169,6 +177,7 @@ noncomputable def realInfinitePositiveQuotientEquivSign (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) @@ -189,6 +198,7 @@ theorem card_realInfinitePositiveQuotient 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 @@ -213,6 +223,7 @@ theorem nthPowerSubgroup_eq_infinitePositiveSubgroup 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 : ℕ+) @@ -265,6 +276,7 @@ theorem nthPowerSubgroup_eq_top_of_real_odd 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean index a86889393b..e96030da75 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean @@ -15,7 +15,7 @@ This file supplies the completion instances and local cardinality formulas used to evaluate finite-place factors in idele power quotients. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain noncomputable section @@ -24,6 +24,7 @@ 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 @@ -80,7 +81,7 @@ theorem card_finitePlace_nthPowerQuotient Module.finrank ℚ_[F.residueCharacteristic] (v₀.adicCompletion K) obtain ⟨a, e⟩ := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation ν hν let U := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup @@ -136,6 +137,7 @@ theorem card_finitePlace_nthPowerQuotient (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. -/ @@ -162,6 +164,7 @@ noncomputable def finitePlaceNthPowerDefect 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 @@ -288,6 +291,7 @@ theorem finitePlaceNthPowerDefect_eq_absNorm_maxPowDividing hI, hmult] +open scoped Classical in /-- The finite local power-index formula with the residue-characteristic contribution packaged as `finitePlaceNthPowerDefect`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean index d08538d467..cdf50f4d7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean @@ -17,7 +17,7 @@ This file relates global ideal norms to the residue fields and ramification invariants of the corresponding finite completions. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -28,6 +28,7 @@ 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 @@ -41,6 +42,7 @@ theorem absNorm_eq_card_adicResidueField (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 @@ -81,7 +83,8 @@ theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex let target := F.toCompleteDVF let : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).IsRankOneDiscrete := - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).instCompleteDiscrete.isRankOneDiscrete + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).instCompleteDiscrete.isRankOneDiscrete let ϖ : base.valuationSubring := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p (p : ℤ_[p]) @@ -184,6 +187,7 @@ theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex 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 @@ -245,6 +249,7 @@ theorem card_localField_residueField_eq_pow_residueDegree 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] @@ -288,6 +293,7 @@ theorem finrank_qp_eq_ramificationIndex_mul_residueDegree LocalFieldTheory.DiscreteValuationField.ValuedExtension.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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean index 08fe385973..0e1d294d51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean @@ -27,7 +27,7 @@ This file proves that the concrete local-condition subgroup lies in the global idele norm range, and descends that inclusion to idele classes. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open KummerTheory @@ -41,6 +41,7 @@ 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 : ℕ) @@ -83,6 +84,7 @@ theorem idelePowerLocalUnitSubgroup_le_relativeIdeleNorm_range (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index a21ccc3763..5820b5fdd6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -19,7 +19,7 @@ This file combines the supported local index, principal-ideles exact sequence, and norm containment to prove the prime-power Kummer norm-index theorem. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open KummerTheory @@ -32,6 +32,7 @@ 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 @@ -65,6 +66,7 @@ theorem card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient_eq_power_two_tot card_supportedIdeleQuotient_eq_power_two_totalPlaceCard (K := K) n hmu S T hS] +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; @@ -311,6 +313,7 @@ theorem _ = Module.finrank K E := IsGalois.card_aut_eq_finrank K E +open scoped Classical 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 @@ -470,6 +473,7 @@ theorem (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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean index 9c686b8fb0..77f6b0d813 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean @@ -14,7 +14,7 @@ This file expresses the supported idele quotient as the product of its local archimedean and finite-place power indices and evaluates its cardinality. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open KummerTheory @@ -27,6 +27,7 @@ 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 @@ -64,6 +65,7 @@ theorem card_supportedIdeleQuotient_eq_localPowerIndexProduct 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 @@ -131,6 +133,7 @@ theorem prod_absNorm_maxPowDividing_natCast rw [Ideal.absNorm_span_natCast, NumberField.RingOfIntegers.rank] +open scoped Classical in /-- Product of the actual finite-place power defects. -/ theorem prod_finitePlaceNthPowerDefect (n : ℕ+) @@ -162,6 +165,7 @@ theorem prod_finitePlaceNthPowerDefect 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 @@ -195,6 +199,7 @@ theorem prod_infinitePlace_nthPowerIndex 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`. -/ @@ -252,6 +257,7 @@ theorem prod_infinitePlace_nthPowerIndex_mul_natDegree 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`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean index 45c9dace27..7a387768c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -16,7 +16,7 @@ This file identifies supported principal ideles with the corresponding `S`-unit group and derives the exact-sequence cardinal identities. -/ -open scoped NumberField Classical NNReal ValuativeRel TensorProduct +open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open KummerTheory @@ -29,6 +29,7 @@ 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 @@ -40,6 +41,7 @@ def supportedPrincipalIdeleSubgroup (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 @@ -105,6 +107,7 @@ noncomputable def sUnitEquivSupportedPrincipalIdeleSubgroup 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] @@ -121,6 +124,7 @@ theorem sUnitEquivSupportedPrincipalIdeleSubgroup_coe 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 @@ -130,6 +134,7 @@ def sUnitPrincipalIdelePowerSubgroup (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 @@ -186,6 +191,7 @@ theorem sUnitPrincipalIdelePowerSubgroup_map 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. -/ @@ -209,6 +215,7 @@ noncomputable def (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 @@ -226,6 +233,7 @@ theorem card_supportedPrincipalQuotient_eq_sUnitPrincipalQuotient (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`. -/ @@ -240,10 +248,14 @@ def supportedIdeleClassPowerDenominator 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 @@ -259,6 +271,7 @@ def supportedIdeleToClassPowerQuotient (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 @@ -342,6 +355,7 @@ theorem supportedIdeleToClassPowerQuotient_ker 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 @@ -388,6 +402,7 @@ theorem supportedIdeleToClassPowerQuotient_surjective rw [hpOne] simp +open scoped Classical in /-- Supported realization of the idele-class index quotient. -/ noncomputable def supportedIdeleClassPowerQuotientEquiv @@ -411,6 +426,7 @@ noncomputable def (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 @@ -434,6 +450,7 @@ theorem card_ideleClassPowerLocalUnitQuotient_eq_supported 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ˣ) @@ -473,6 +490,7 @@ theorem card_supportedPrincipalQuotient_mul_card_supportedClassQuotient 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 @@ -501,6 +519,7 @@ theorem card_supportedPrincipalQuotient_mul_card_ideleClassQuotient 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 : ℕ+) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index 3114ccb037..4a73e8d49a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -18,7 +18,7 @@ global norm containment and principal-intersection identity used in the idele-class norm-index argument. -/ -open scoped NumberField Classical NNReal IsMulCommutative +open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification @@ -31,13 +31,14 @@ 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] - [FiniteDimensional K L] [IsGalois K L] + [IsGalois K L] (S : Finset (HeightOneSpectrum (𝓞 K))) : Subgroup (IdeleGroup K) := ⨅ v : ↥S, @@ -45,6 +46,7 @@ def finitePlaceLocalNormCondition (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} @@ -61,6 +63,7 @@ theorem mem_finitePlaceLocalNormCondition_iff (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. -/ @@ -87,6 +90,7 @@ theorem idelePowerLocalUnitSubgroup_le_finitePlaceLocalNormCondition ((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. -/ @@ -122,24 +126,26 @@ theorem idelePowerLocalUnitSubgroup_le_unionLocalNormCondition (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] - [FiniteDimensional K L] [IsGalois 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] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] (n : ℕ+) (r : ℕ) (eG : @@ -180,12 +186,13 @@ theorem idelePowerLocalUnitSubgroup_le_allFinitePlaceLocalNormCondition ((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] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] : (RelativeIdeleGroup.norm K L).range ≤ allFinitePlaceLocalNormCondition @@ -198,6 +205,7 @@ theorem relativeIdeleNorm_range_le_allFinitePlaceLocalNormCondition _root_.relativeIdeleNorm_finiteComponent_mem_chosenLocalNormSubgroup (K := K) (L := L) v b +open scoped Classical 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean index f3ec28d31f..24583cc373 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean @@ -14,7 +14,7 @@ places and integral units elsewhere, together with its intersection with principal ideles and the corresponding subgroup of S-unit powers. -/ -open scoped NumberField Classical NNReal IsMulCommutative +open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -24,6 +24,7 @@ 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 @@ -45,6 +46,7 @@ def idelePowerLocalUnitSubgroup (v.adicCompletionIntegers K).units.comap (IdeleGroup.finiteComponent v)) +open scoped Classical in /-- Membership in `idelePowerLocalUnitSubgroup` expressed componentwise. -/ theorem mem_idelePowerLocalUnitSubgroup_iff (n : ℕ+) @@ -66,6 +68,7 @@ theorem mem_idelePowerLocalUnitSubgroup_iff 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 @@ -75,6 +78,7 @@ def principalIdelePowerLocalUnitSubgroup (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 : ℕ+) @@ -85,6 +89,7 @@ def sUnitNthPowersInField 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`. -/ @@ -124,6 +129,7 @@ theorem mem_sUnitNthPowersInField_iff ⟨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 @@ -181,6 +187,7 @@ theorem sUnitNthPowersInField_le_principalIdelePowerLocalUnitSubgroup 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean index 63b625feed..b055391425 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean @@ -17,7 +17,7 @@ This module proves that local powers, and then the concrete simple-Kummer power subgroup, lie in the norm subgroup at a chosen finite place. -/ -open scoped NumberField Classical NNReal IsMulCommutative +open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification @@ -31,6 +31,7 @@ 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 @@ -48,6 +49,7 @@ theorem galois_pow_eq_one_of_field_equiv_pi_zmod 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 @@ -89,7 +91,7 @@ private theorem let : IsGalois vK.Completion E := HilbertRamification.algebraicLocalization_isGalois vK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -167,6 +169,7 @@ private theorem · 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 @@ -189,6 +192,7 @@ theorem nthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean index 912c6c01ea..e5f0a854d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean @@ -35,7 +35,7 @@ private theorem isFieldNorm_iff_mem_globalFieldNormSubgroup private theorem isNormAtFinitePlace_iff (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] (w : HeightOneSpectrum (𝓞 K)) (x : Kˣ) : ClassFieldTheory.IsNormAtFinitePlace K L w x ↔ @@ -68,7 +68,7 @@ private theorem isNormAtFinitePlace_iff private theorem isNormAtInfinitePlace_iff (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] (w : InfinitePlace K) (x : Kˣ) : ClassFieldTheory.IsNormAtInfinitePlace K L w x ↔ @@ -139,7 +139,7 @@ private theorem isEverywhereLocalNorm_iff_mem_everywhereLocalFieldNormSubgroup private theorem norm_includeRight (K L A : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] - [CommRing A] [Algebra K A] [Nontrivial A] + [CommRing A] [Algebra K A] (y : L) : Algebra.norm A (Algebra.TensorProduct.includeRight (R := K) (A := A) (B := L) y) = @@ -160,7 +160,7 @@ extension to any completion. No Galois hypothesis is needed. -/ theorem globalNorm_isEverywhereLocalNorm (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] (x : Kˣ) : ClassFieldTheory.IsFieldNorm K L x → diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean index 5830573e71..7853681ade 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean @@ -15,7 +15,7 @@ pairwise distinct base places outside the finite avoidance set. Distinctness is obtained from Mathlib's Hall marriage theorem. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -28,6 +28,7 @@ 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 @@ -84,6 +85,7 @@ noncomputable def sUnitKummerCoordinateBasePlaceCandidates _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 @@ -174,6 +176,7 @@ theorem sUnitKummerCoordinateBasePlaceCandidates_infinite (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`. -/ @@ -209,6 +212,7 @@ noncomputable def sUnitKummerAvoidedBasePlaces 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 @@ -230,6 +234,7 @@ theorem 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 @@ -304,6 +309,7 @@ theorem exists_sUnitKummerChosenBasePlaces 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] @@ -329,6 +335,7 @@ noncomputable def 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] @@ -354,6 +361,7 @@ theorem sUnitKummerChosenBasePlaces_injective (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 @@ -386,6 +394,7 @@ theorem (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 @@ -416,6 +425,7 @@ theorem sUnitKummerChosenBasePlaces_not_mem_avoided (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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean index 11e279ef84..3a1cfe52c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -14,7 +14,7 @@ the finite Kummer radical and records the support-enlargement consequence used by the global reciprocity argument. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -27,6 +27,7 @@ section FinitePlaces variable {K : Type} [Field K] [NumberField K] +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`. -/ @@ -394,6 +395,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean index 691897a72e..86db7b67aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean @@ -14,7 +14,7 @@ Kummer extension and proves the required decomposition and unramifiedness properties. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -27,6 +27,7 @@ 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 @@ -128,6 +129,7 @@ theorem exists_sUnitKummerCoordinatePlace ⊤ 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] @@ -152,6 +154,7 @@ noncomputable def 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] @@ -206,6 +209,7 @@ theorem sUnitKummerCoordinatePlace_below (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] @@ -267,6 +271,7 @@ theorem sUnitKummerCoordinatePlace_decompositionGroup (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 @@ -320,6 +325,7 @@ theorem sUnitKummerChosenBasePlace_not_mem_ramified 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean index 19bc033c5e..8138f6912a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean @@ -15,7 +15,7 @@ coordinate subgroups, proves complete splitting in the prescribed extension, and identifies the associated decomposition fields. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -28,6 +28,7 @@ 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 @@ -155,6 +156,7 @@ theorem sUnitKummerKernelGenerator_mem_decompositionGroup 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 @@ -297,6 +299,7 @@ theorem sUnitKummerChosenDecompositionGroup_eq_zpowers 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 @@ -362,6 +365,7 @@ theorem finitePlaceSplitsCompletely_of_mem_sUnitKummerPrimeSet (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 41f06b1b13..2e124a02a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -16,13 +16,14 @@ proves cyclicity for the decomposition group at a chosen unramified place. The results are independent of the S-unit Kummer construction. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain noncomputable section namespace GlobalClassFieldTheory.ClassFieldAxiom +open scoped Classical in /-- Full relative decomposition above `q` puts every `M`-automorphism inside the global chosen decomposition group below `q`. -/ @@ -35,7 +36,7 @@ theorem [Algebra F M] [Algebra M L] [Algebra F L] [IsScalarTower F M L] [FiniteDimensional F L] - [FiniteDimensional M L] + [IsGalois F L] [IsGalois M L] [IsMulCommutative (L ≃ₐ[F] L)] (p : HeightOneSpectrum (𝓞 F)) @@ -143,11 +144,12 @@ theorem 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] [NumberField L] [Algebra F L] + [Field L] [Algebra F L] [FiniteDimensional F L] [IsGalois F L] (v : HeightOneSpectrum (𝓞 F)) (hunram : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean index 2a828d7dd5..c343cc76c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean @@ -12,7 +12,7 @@ This file packages the chosen base places as a finite set and proves its cardinality and disjointness properties. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -25,6 +25,7 @@ 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 @@ -48,6 +49,7 @@ noncomputable def sUnitKummerPrimeSet (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 @@ -77,6 +79,7 @@ theorem sUnitKummerPrimeSet_card 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean index e83f7e84dd..e45a0d51d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean @@ -13,7 +13,7 @@ enlarged S-unit Kummer extension to coordinate generators, their required number, and their cyclic fixed fields. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -26,6 +26,7 @@ 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 @@ -40,6 +41,7 @@ def sUnitKummerPrimeCount (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 @@ -66,6 +68,7 @@ noncomputable def sUnitKummerKernelGenerator (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 @@ -163,6 +166,7 @@ theorem iSup_zpowers_sUnitKummerKernelGenerator_eq_top 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] @@ -207,6 +211,7 @@ theorem orderOf_sUnitKummerKernelGenerator 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 @@ -235,6 +240,7 @@ noncomputable def sUnitKummerCoordinateFixedField (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean index 137594c71a..35d7cb8819 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -24,7 +24,7 @@ finite product of local unit power classes and proves its kernel and surjectivity properties for the Kummer prime set. -/ -open scoped NumberField Classical NNReal IsMulCommutative +open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification @@ -37,6 +37,7 @@ 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`. -/ @@ -86,6 +87,7 @@ def sUnitLocalUnitPowerMap ((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 @@ -179,6 +181,7 @@ theorem mem_powMonoidHom_range_adicCompletionIntegers_iff (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 @@ -236,6 +239,7 @@ theorem sUnitLocalUnitPowerMap_ker rw [localUnit_toField v] exact hx v +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean index 0f80337a16..6a9277b098 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean @@ -14,7 +14,7 @@ the prescribed finite places and identifies the resulting quotient with the product of its archimedean and finite local power-class groups. -/ -open scoped NumberField Classical NNReal IsMulCommutative +open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open KummerTheory @@ -24,6 +24,7 @@ namespace GlobalClassFieldTheory.ClassFieldAxiom variable {K : Type*} [Field K] [NumberField K] +open scoped Classical in private noncomputable def quotientEquivOfSurjectiveWithKernel {G H : Type*} [Group G] [Group H] (f : G →* H) @@ -34,6 +35,7 @@ private noncomputable def quotientEquivOfSurjectiveWithKernel (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 @@ -46,6 +48,7 @@ def supportedIdelePowerLocalUnitSubgroup (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 @@ -62,6 +65,7 @@ theorem idelePowerLocalUnitSubgroup_le_supportedAt (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. -/ @@ -124,6 +128,7 @@ def supportedIdelePowerClassMap · 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 @@ -168,6 +173,7 @@ theorem supportedIdelePowerClassMap_ker 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`. -/ @@ -235,6 +241,7 @@ theorem supportedIdelePowerClassMap_surjective 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 @@ -272,6 +279,7 @@ noncomputable def supportedIdeleQuotientEquivLocalPowerClasses (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean index 2b197c35ee..dd3b03da22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean @@ -19,8 +19,7 @@ modules; this file contains only the global class-field-theoretic conclusion. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -32,6 +31,7 @@ variable [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. @@ -120,6 +120,7 @@ theorem finrank_eq_one_of_finite_nonSplittingPlaces 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean index 3b4fb436f5..4801eb817a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean @@ -23,8 +23,7 @@ finite places outside a finite set split completely, then the idele class norm is surjective. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -44,6 +43,7 @@ variable [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. -/ @@ -91,6 +91,7 @@ theorem 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. -/ @@ -152,6 +153,7 @@ theorem (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 @@ -229,6 +231,7 @@ theorem ideleClassNorm_range_eq_top_of_splitsCompletely_outside (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 @@ -246,6 +249,7 @@ theorem ideleClassNorm_index_eq_one_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. -/ @@ -298,6 +302,7 @@ theorem 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 @@ -342,6 +347,7 @@ theorem cyclic_prime_power_infinite_fullDecompositionPlaces 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 @@ -373,6 +379,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index 865a956698..be509b6960 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -36,7 +36,7 @@ the unramified integral factors outside the support, and the exact sequence from `S`-units to supported ideles and idele classes. -/ -open scoped Classical NumberField TensorProduct +open scoped NumberField TensorProduct open NumberField IsDedekindDomain noncomputable section @@ -58,6 +58,7 @@ variable [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 @@ -77,6 +78,7 @@ theorem (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. -/ @@ -165,6 +167,7 @@ theorem 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 @@ -232,6 +235,7 @@ theorem 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. -/ @@ -375,6 +379,7 @@ theorem (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 @@ -389,6 +394,7 @@ noncomputable def sUnitToRelativeIdeleSupported (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 @@ -402,6 +408,7 @@ noncomputable def relativeIdeleSupportedToClass (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 @@ -446,6 +453,7 @@ theorem sUnitToRelativeIdeleSupported_equivariant 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))) : @@ -483,6 +491,7 @@ theorem relativeIdeleSupportedToClass_equivariant 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 @@ -501,6 +510,7 @@ theorem sUnitToRelativeIdeleSupported_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 @@ -546,6 +556,7 @@ theorem relativeIdeleSupportedToClass_surjective (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 @@ -605,6 +616,7 @@ theorem sUnit_supportedIdele_ideleClass_exact 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 @@ -620,6 +632,7 @@ def AboveSUnitHerbrandQuotientDefined (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 @@ -633,6 +646,7 @@ def RelativeIdeleSupportedHerbrandQuotientDefined (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. -/ @@ -649,6 +663,7 @@ noncomputable def aboveSLogPlaceMulAction (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 @@ -666,6 +681,7 @@ noncomputable def logPlaceBelowRelativeUnrestrictedIndex (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 @@ -730,6 +746,7 @@ theorem logPlaceBelowRelativeUnrestrictedIndex_smul 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))) : @@ -758,6 +775,7 @@ noncomputable def logPlaceOrbitBelowRelativeUnrestrictedIndex (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] @@ -776,6 +794,7 @@ theorem logPlaceOrbitBelowRelativeUnrestrictedIndex_mk (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`. -/ @@ -934,6 +953,7 @@ noncomputable def 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 @@ -1021,6 +1041,7 @@ theorem (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. -/ @@ -1107,6 +1128,7 @@ theorem (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|`. -/ @@ -1325,6 +1347,7 @@ theorem (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 @@ -1403,6 +1426,7 @@ theorem σ (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. -/ @@ -1515,6 +1539,7 @@ theorem hUnit hSupported q hq hSupportedValue' hUnitValue' +open scoped Classical in /-- The corresponding norm-index lower bound with all supported local calculations substituted. -/ theorem @@ -1548,6 +1573,7 @@ theorem σ (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 @@ -1565,6 +1591,7 @@ theorem card_le_ideleClassNorm_index (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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean index f3c99b8677..729ce03989 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -28,7 +28,7 @@ requires the compatibility between the actual global norm-residue map and the chosen local Artin map on one-place ideles. -/ -open scoped NumberField Classical NumberField.LiesOver +open scoped NumberField NumberField.LiesOver noncomputable section @@ -44,6 +44,7 @@ variable [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)) @@ -69,6 +70,7 @@ private theorem (K := K) (L := L) v) exact hx +open scoped Classical in private theorem narrowFiniteHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup (v : HeightOneSpectrum (𝓞 K)) : @@ -98,6 +100,7 @@ private theorem (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 @@ -113,6 +116,7 @@ theorem ideleClassNormDefiningModulus_le_narrowFiniteConductor : (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. -/ @@ -125,6 +129,7 @@ theorem ideleClassNorm_narrowFiniteConductor_eq_normDefiningModulus : (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 @@ -151,6 +156,7 @@ theorem 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. -/ @@ -190,6 +196,7 @@ theorem exact hP.over.symm · exact hchosen +open scoped Classical in /-- The actual local norm modulus vanishes exactly when no finite base place ramifies. -/ theorem @@ -201,6 +208,7 @@ theorem ← 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 @@ -230,6 +238,7 @@ theorem 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 @@ -242,6 +251,7 @@ theorem 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 @@ -254,6 +264,7 @@ theorem 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 @@ -357,6 +368,7 @@ private theorem infiniteTensorNormSubgroup_ne_top_of_isRamified 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. -/ @@ -405,6 +417,7 @@ theorem infiniteTensorNormSubgroup_eq_top_iff_isUnramifiedIn 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 : @@ -452,6 +465,7 @@ theorem ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus : (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. -/ @@ -476,6 +490,7 @@ theorem 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 @@ -511,6 +526,7 @@ variable [Field L] [NumberField L] [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] +open scoped Classical 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 @@ -526,6 +542,7 @@ theorem abelianFullConductor_finiteExponent_eq_localConductorExponent GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent (K := K) (L := L) v +open scoped Classical in /-- A finite place has conductor exponent zero precisely when the chosen local extension is unramified. -/ theorem abelianFullConductor_finiteExponent_eq_zero_iff_unramified @@ -535,12 +552,14 @@ theorem abelianFullConductor_finiteExponent_eq_zero_iff_unramified _root_.ChosenFinitePlaceIsUnramified (K := K) (L := L) v := by rw [abelianFullConductor_finiteExponent_eq_localConductorExponent] - rw [← GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + rw [← + GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent (K := K) (L := L) v] exact GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified (K := K) (L := L) v +open scoped Classical 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean index c238761be3..6c9e88f7b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean @@ -15,8 +15,7 @@ ramification locus, while the minimal narrow finite conductor has support contained in that locus. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -30,6 +29,7 @@ variable [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 @@ -54,6 +54,7 @@ theorem (hunramified v)] rfl +open scoped Classical in /-- The locally constructed norm modulus is nonzero exactly when some chosen completed extension is ramified. -/ theorem @@ -67,6 +68,7 @@ theorem 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 @@ -86,6 +88,7 @@ theorem (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean index 5b548ed79c..17567063bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean @@ -17,7 +17,7 @@ the local exponent occurring in the idèle-class norm conductor with the conductor exponent of the chosen localized extension. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel noncomputable section @@ -30,6 +30,7 @@ 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. -/ @@ -119,6 +120,7 @@ theorem finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup _ = y := congrArg Subtype.val huy _ = x := hyx +open scoped Classical 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 @@ -176,6 +178,7 @@ 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. -/ @@ -269,6 +272,7 @@ 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 @@ -296,7 +300,7 @@ noncomputable def ideleClassNormChosenFinitePlaceLocalConductorExponent LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w letI : NontriviallyNormedField vK.Completion := - _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtension_completionNontriviallyNormedField + _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtensionCompletionNontriviallyNormedField vK hvK letI : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -327,6 +331,7 @@ noncomputable def ideleClassNormChosenFinitePlaceLocalConductorExponent 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. -/ @@ -359,7 +364,7 @@ theorem ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w let : NontriviallyNormedField vK.Completion := - _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtension_completionNontriviallyNormedField + _root_.AlgebraicNumberTheory.Valuations.absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean index faf851cc36..dfdc4ae07c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean @@ -22,7 +22,7 @@ class field theory, and the local conductor-zero criterion then detects unramifiedness. -/ -open scoped NumberField Classical NNReal ValuativeRel +open scoped NumberField NNReal ValuativeRel noncomputable section @@ -41,6 +41,7 @@ variable [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. -/ @@ -82,7 +83,7 @@ theorem LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -246,6 +247,7 @@ theorem 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean index 938d6d2fd8..9aa14ba550 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean @@ -24,7 +24,7 @@ canonical arithmetic reciprocity homeomorphism are fixed rather than merely asserted to exist. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -36,6 +36,7 @@ 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. -/ @@ -45,6 +46,9 @@ local instance 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)) @@ -114,6 +118,7 @@ private noncomputable def (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 @@ -127,9 +132,9 @@ noncomputable def (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. -/ -@[simp] theorem arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient_globalNormResidue (H : Subgroup (IdeleClassGroup K)) @@ -146,9 +151,9 @@ theorem (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. -/ -@[simp] theorem arithmeticClosedFiniteIndexClassFieldGaloisContinuousMulEquivNormQuotient_symm_mk (H : Subgroup (IdeleClassGroup K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean index 6045a921c7..9e3b26236f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean @@ -22,7 +22,7 @@ public bundle here is `MulEquiv`; the preceding Galois/norm-quotient factor remains a `ContinuousMulEquiv`. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -34,6 +34,7 @@ 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 @@ -42,6 +43,9 @@ local instance 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 @@ -80,6 +84,7 @@ private theorem _ = 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 @@ -109,6 +114,7 @@ private theorem (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) ≃* @@ -134,6 +140,7 @@ private noncomputable def arithmeticBigHilbertClassFieldReciprocityData (bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K))⟩ +open scoped Classical in private noncomputable def arithmeticSmallHilbertClassFieldReciprocityData (K : Type) [Field K] [NumberField K] : { e : Gal((smallHilbertClassField K) / K) ≃* @@ -159,6 +166,7 @@ private noncomputable def arithmeticSmallHilbertClassFieldReciprocityData (smallHilbertClassFieldQuotientEquivClassGroup (K := K))⟩ +open scoped Classical in /-- Arithmetic global reciprocity for the selected big Hilbert class field over the original number field. -/ noncomputable def @@ -167,9 +175,9 @@ noncomputable def RayClass.NarrowClassGroup K := (arithmeticBigHilbertClassFieldReciprocityData K).1 +open scoped Classical in /-- The arithmetic global norm-residue symbol maps to its genuine narrow ideal class. -/ -@[simp] theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_globalNormResidue (c : IdeleClassGroup K) : @@ -183,9 +191,9 @@ theorem (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. -/ -@[simp] theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_idele (a : IdeleGroup K) : @@ -201,6 +209,7 @@ theorem 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 @@ -209,9 +218,9 @@ noncomputable def ClassGroup (𝓞 K) := (arithmeticSmallHilbertClassFieldReciprocityData K).1 +open scoped Classical in /-- The arithmetic global norm-residue symbol maps to its genuine ordinary ideal class. -/ -@[simp] theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal_globalNormResidue (c : IdeleClassGroup K) : @@ -225,9 +234,9 @@ theorem (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. -/ -@[simp] theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal_idele (a : IdeleGroup K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean index b6f4846312..03ea34fb5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -16,7 +16,7 @@ idèle norm range, the finite Krull topology, and the native ray-class quotient topology. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -26,6 +26,7 @@ namespace GlobalClassFields open NumberField open Reciprocity +open scoped Classical in private theorem arithmeticRayClassIdeleClassGroupIsMulCommutative {F : Type} [Field F] [NumberField F] : IsMulCommutative (IdeleClassGroup F) := @@ -35,6 +36,7 @@ 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 @@ -72,6 +74,7 @@ private theorem _ = 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 @@ -104,6 +107,7 @@ noncomputable def 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 @@ -119,9 +123,9 @@ private theorem 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. -/ -@[simp] theorem arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_globalNormResidue (m : RayClass.Modulus K) @@ -153,9 +157,9 @@ theorem (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. -/ -@[simp] theorem arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup_symm_mk (m : RayClass.Modulus K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean index 7bf640eba0..0264963e2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean @@ -18,8 +18,7 @@ element used in the ideal-theoretic formulation: the ordinary normalized prime idèle maps to arithmetic Frobenius. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -33,6 +32,7 @@ variable [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 @@ -41,6 +41,7 @@ noncomputable def arithmeticFinitePlacePrimeArtin 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] @@ -52,9 +53,9 @@ theorem arithmeticFinitePlacePrimeArtin_eq_arithmeticChosenFinitePlaceArtin rw [arithmeticFinitePlacePrimeArtin, finitePrimeIdele, Reciprocity.arithmeticGlobalArtinMonoidHom_finitePlaceIdele] +open scoped Classical in /-- Arithmetic and geometric prime Artin elements are inverse automorphisms. -/ -@[simp] theorem arithmeticFinitePlacePrimeArtin_eq_inv (v : HeightOneSpectrum (𝓞 K)) : arithmeticFinitePlacePrimeArtin (K := K) (L := L) v = @@ -63,6 +64,7 @@ theorem arithmeticFinitePlacePrimeArtin_eq_inv 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 @@ -79,6 +81,7 @@ noncomputable def chosenFinitePlaceArithmeticFrobenius (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 @@ -114,6 +117,7 @@ theorem arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius 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 @@ -133,6 +137,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean index d2a57e9957..e9de640a6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -19,7 +19,7 @@ norm subgroup as the selected big Hilbert class field. Arithmetic global reciprocity therefore gives its narrow-class-group Artin isomorphism. -/ -open scoped Classical NumberField IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain noncomputable section @@ -28,10 +28,14 @@ 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 /-- An intrinsic big Hilbert class field is equivalent over `K` to the selected realization. -/ noncomputable def bigHilbertClassFieldEquivOfIsBig @@ -42,13 +46,15 @@ noncomputable def bigHilbertClassFieldEquivOfIsBig (GlobalClassFieldTheory.GlobalClassFields.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_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 /-- Every intrinsic big Hilbert class field has the selected field's idèle-class norm subgroup. -/ theorem bigHilbertClassField_ideleClassNorm_range_of_isBig @@ -65,9 +71,10 @@ theorem bigHilbertClassField_ideleClassNorm_range_of_isBig GlobalClassFieldTheory.GlobalClassFields.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 arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig +noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig (E : FiniteAbelianExtension K) (hE : IsBigHilbertClassField E) : (E ≃ₐ[K] E) ≃* RayClass.NarrowClassGroup K := by let reciprocity : (E ≃ₐ[K] E) ≃* @@ -89,12 +96,13 @@ noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_i (K := K) exact (reciprocity.trans transport).trans narrow +open scoped Classical 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) : - arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig E hE + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K E c) = GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup @@ -129,12 +137,13 @@ theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResi hReciprocity _ = _ := rfl +open scoped Classical 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)) : - arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig E hE + arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin (K := K) (L := E) v) = QuotientGroup.mk' (RayClass.narrowDenominator (K := K)) @@ -154,9 +163,11 @@ theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_prime (IdeleGroup.finitePrimeIdele v)).symm rw [hArtin] rw [arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue] - exact GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean index fb751f040c..9a659475a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean @@ -17,7 +17,7 @@ transport on the big-Hilbert reciprocity quotient and on the narrow class group, with formulas on genuine idele representatives. -/ -open scoped NumberField NumberField.LiesOver Classical TensorProduct +open scoped NumberField NumberField.LiesOver TensorProduct noncomputable section @@ -31,6 +31,7 @@ variable [Field K] [NumberField K] [Field M] [NumberField M] +open scoped Classical in private theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk (a : IdeleGroup K) : bigHilbertClassFieldQuotientEquivNarrowClassGroup @@ -43,6 +44,7 @@ private theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk (RayClass.narrowDenominator (K := K)) a := rfl +open scoped Classical in private noncomputable def infinitePlaceCompletionCongrHom (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) : @@ -58,6 +60,7 @@ private noncomputable def infinitePlaceCompletionCongrHom NumberField.LiesOver.completionMap (v := v) (w := W) +open scoped Classical in private theorem infinitePlaceCompletionCongrHom_algebraMap (e : K ≃ₐ[ℚ] M) (W : InfinitePlace M) @@ -93,6 +96,7 @@ private theorem infinitePlaceCompletionCongrHom_algebraMap WithAbs.algebraMap_right_apply, Algebra.algebraMap_self_apply] +open scoped Classical in private theorem relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr_infiniteComponent_tmul (e : K ≃ₐ[ℚ] M) @@ -173,6 +177,7 @@ private theorem relativeAdeleBaseChangeRingEquiv_infiniteComponent_tmul] exact hcomponent qv hq +open scoped Classical in private theorem adeleCongr_infiniteComponent (e : K ≃ₐ[ℚ] M) (a : NumberField.AdeleRing (𝓞 K) K) @@ -218,6 +223,7 @@ private theorem adeleCongr_infiniteComponent relativeAdeleBaseChangeRingEquiv_relativeAdeleCongr_infiniteComponent_tmul e b x W +open scoped Classical in private theorem ideleCongr_infiniteComponent (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) @@ -235,6 +241,7 @@ private theorem ideleCongr_infiniteComponent (NumberField.AdeleRing (𝓞 K) K)ˣ) : NumberField.AdeleRing (𝓞 K) K)) W +open scoped Classical in private theorem infinitePlaceCompletionCongrHom_extensionEmbeddingOfIsReal (e : K ≃ₐ[ℚ] M) @@ -270,6 +277,7 @@ private theorem InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply, infinitePlaceCompletionCongrHom] using hComplex +open scoped Classical in private theorem infinitePlaceCompletionCongrHom_mem_infinitePositiveSubgroup_iff (e : K ≃ₐ[ℚ] M) @@ -316,6 +324,7 @@ private theorem e W hW] simpa only using hpos +open scoped Classical in private theorem ideleCongr_mem_infiniteCongruenceSubgroup_iff (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) : @@ -364,6 +373,7 @@ private theorem ideleCongr_mem_infiniteCongruenceSubgroup_iff 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) : @@ -396,6 +406,7 @@ private theorem ideleCongr_mem_ideleCongruenceSubgroup_zero_iff (ideleCongr_mem_infiniteCongruenceSubgroup_iff e a) hfiniteZero +open scoped Classical in private theorem ideleCongruenceSubgroup_zero_map_ideleCongr (e : K ≃ₐ[ℚ] M) : ((RayClass.Modulus.narrowOfFinite @@ -420,6 +431,7 @@ private theorem ideleCongruenceSubgroup_zero_map_ideleCongr · exact (ideleCongr e).apply_symm_apply b +open scoped Classical in private theorem narrowDenominator_map_ideleCongr (e : K ≃ₐ[ℚ] M) : (RayClass.narrowDenominator (K := K)).map @@ -439,6 +451,7 @@ private theorem narrowDenominator_map_ideleCongr 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. -/ @@ -473,6 +486,7 @@ theorem bigHilbertClassFieldNormSubgroup_map_ideleClassCongr 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 @@ -487,9 +501,9 @@ noncomputable def bigHilbertClassFieldQuotientCongr (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. -/ -@[simp] theorem bigHilbertClassFieldQuotientCongr_mk (e : K ≃ₐ[ℚ] M) (c : IdeleClassGroup K) : @@ -501,6 +515,7 @@ theorem bigHilbertClassFieldQuotientCongr_mk (ideleClassCongr e c) := rfl +open scoped Classical in /-- Canonical transport of narrow ideal classes determined by the big-Hilbert reciprocity quotient. -/ noncomputable def bigHilbertNarrowClassGroupCongr @@ -513,6 +528,7 @@ noncomputable def bigHilbertNarrowClassGroupCongr (bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := M))) +open scoped Classical in /-- Naturality of the canonical identification of the big-Hilbert reciprocity quotient with the narrow class group. -/ @[simp] @@ -529,6 +545,7 @@ theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_naturality 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 @@ -547,9 +564,9 @@ theorem 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. -/ -@[simp] theorem bigHilbertNarrowClassGroupCongr_mk (e : K ≃ₐ[ℚ] M) (a : IdeleGroup K) : @@ -589,6 +606,7 @@ theorem bigHilbertNarrowClassGroupCongr_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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean index a5778b35db..6065c91db8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean @@ -15,7 +15,7 @@ the selected field is a finite abelian Galois extension of the original number field, with degree equal to the narrow class number. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -24,12 +24,14 @@ 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 : @@ -39,6 +41,7 @@ noncomputable def bigHilbertClassFieldBaseEquivOverOriginal : (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 : @@ -49,6 +52,7 @@ noncomputable instance bigHilbertClassFieldAlgebraOverOriginal : (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] @@ -61,6 +65,7 @@ theorem bigHilbertClassField_algebraMap_original (bigHilbertClassFieldBaseEquiv (K := K) x) := rfl +open scoped Classical in /-- The canonical base fixed field has degree one over the original number field. -/ noncomputable instance @@ -69,6 +74,7 @@ noncomputable instance (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 : @@ -77,6 +83,7 @@ noncomputable instance bigHilbertClassFieldScalarTowerOverOriginal : (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 @@ -86,6 +93,7 @@ noncomputable instance (bigHilbertClassFieldBase K) (bigHilbertClassField K) +open scoped Classical in /-- The canonical base fixed field has relative degree one. -/ @[simp] theorem bigHilbertClassFieldBase_finrank_over_original : @@ -94,6 +102,7 @@ theorem bigHilbertClassFieldBase_finrank_over_original : (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 : @@ -115,6 +124,7 @@ theorem bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card : (bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K)).toEquiv +open scoped Classical in /-- The selected big Hilbert class field is Galois over the original number field. -/ noncomputable instance bigHilbertClassFieldIsGaloisOverOriginal : @@ -154,6 +164,7 @@ noncomputable instance bigHilbertClassFieldIsGaloisOverOriginal : (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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean index 48eb03edc1..084b9c274d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -97,7 +97,7 @@ noncomputable instance [hKfinite : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(Ω / k)) K (le_baseField K))] + (baseField Gal(Ω/k)) K (le_baseField K))] (L : FiniteAbelianSubextension K) : FiniteDimensional (abstractFixedField k Ω K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean index 813f9ef5c8..f914c04809 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean @@ -16,7 +16,7 @@ idèle-class subgroup. Norm-range and reciprocity statements live in later leaves so their elaboration environments do not remain resident here. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -27,6 +27,7 @@ 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 @@ -35,6 +36,7 @@ noncomputable abbrev closedFiniteIndexClassFieldNormAmbient [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 @@ -48,6 +50,7 @@ theorem closedFiniteIndexClassFieldNormAmbient_normRange_le (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 @@ -58,6 +61,7 @@ noncomputable abbrev closedFiniteIndexClassFieldBaseSubgroup (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 @@ -73,6 +77,7 @@ noncomputable abbrev (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 @@ -88,6 +93,7 @@ noncomputable abbrev closedFiniteIndexClassFieldSubextension (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 @@ -98,6 +104,7 @@ noncomputable abbrev closedFiniteIndexClassFieldBase (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)) @@ -109,6 +116,7 @@ noncomputable abbrev closedFiniteIndexClassField (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean index 113943e860..1542549265 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean @@ -12,7 +12,7 @@ This leaf compares the selected abstract norm subgroup with the actual idèle-class norm range over the canonical fixed-field base. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -23,6 +23,7 @@ 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. -/ @@ -34,6 +35,7 @@ private theorem subgroup_map_toAddSubgroup_mulEquiv (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. -/ @@ -49,6 +51,7 @@ private noncomputable def closedFiniteIndexClassFieldIdeleClassEquiv (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 @@ -74,6 +77,7 @@ private theorem closedFiniteIndexClassField_ideleClassNorm_range_toAddSubgroup (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. -/ @@ -101,6 +105,7 @@ private theorem (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 @@ -156,6 +161,7 @@ theorem closedFiniteIndexClassField_ideleClassNorm_range_over_base (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean index 5a9d9f8df4..7b5f4e4cf9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean @@ -12,7 +12,7 @@ This leaf installs the original-field algebra tower and transports the canonical norm-range computation back to the original idèle class group. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -23,6 +23,7 @@ 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 @@ -35,6 +36,7 @@ noncomputable instance closedFiniteIndexClassFieldBaseAlgebraOverOriginal (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 @@ -49,6 +51,7 @@ noncomputable def closedFiniteIndexClassFieldBaseEquivOverOriginal (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 @@ -67,6 +70,7 @@ noncomputable instance closedFiniteIndexClassFieldAlgebraOverOriginal (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] @@ -87,6 +91,7 @@ theorem closedFiniteIndexClassField_algebraMap_original (K := K) H hclosed x) := rfl +open scoped Classical in noncomputable instance closedFiniteIndexClassFieldBaseFiniteDimensionalOverOriginal (H : Subgroup (IdeleClassGroup K)) @@ -98,6 +103,7 @@ noncomputable instance (closedFiniteIndexClassFieldBaseEquivOverOriginal (K := K) H hclosed).toLinearEquiv.finiteDimensional +open scoped Classical in noncomputable instance closedFiniteIndexClassFieldScalarTowerOverOriginal (H : Subgroup (IdeleClassGroup K)) (hclosed : IsClosed (H : Set (IdeleClassGroup K))) @@ -109,6 +115,7 @@ noncomputable instance closedFiniteIndexClassFieldScalarTowerOverOriginal (K := K) H hclosed) := IsScalarTower.of_algebraMap_eq' rfl +open scoped Classical in noncomputable instance closedFiniteIndexClassFieldFiniteDimensionalOverOriginal (H : Subgroup (IdeleClassGroup K)) @@ -123,6 +130,7 @@ noncomputable instance (closedFiniteIndexClassField (K := K) H hclosed) +open scoped Classical in noncomputable instance closedFiniteIndexClassFieldIsGaloisOverOriginal (H : Subgroup (IdeleClassGroup K)) (hclosed : IsClosed (H : Set (IdeleClassGroup K))) @@ -183,6 +191,7 @@ noncomputable instance closedFiniteIndexClassFieldIsGaloisOverOriginal (closedFiniteIndexClassField (K := K) H hclosed))) x := rfl +open scoped Classical in noncomputable instance closedFiniteIndexClassFieldIsAbelianGaloisOverOriginal (H : Subgroup (IdeleClassGroup K)) @@ -197,6 +206,7 @@ noncomputable instance (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean index 09e3ca6123..7cf225c684 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean @@ -17,13 +17,14 @@ continuous provider. This avoids a second specialization of the full finite global reciprocity instance tower. -/ -open scoped Classical IsMulCommutative NumberField +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] : @@ -34,6 +35,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean index ea3f802e2c..9648195062 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean @@ -13,7 +13,7 @@ multiplicative equivalence of the continuous provider, its evaluation theorem is inherited without reconstructing the selected class-field instance tower. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -22,8 +22,8 @@ namespace GlobalClassFields variable {K : Type} [Field K] [NumberField K] +open scoped Classical in /-- Evaluation of the direct non-topological reciprocity equivalence. -/ -@[simp] theorem closedFiniteIndexClassFieldGaloisEquivNormQuotient_apply (H : Subgroup (IdeleClassGroup K)) (hclosed : IsClosed (H : Set (IdeleClassGroup K))) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean index 03d9a5b9e9..3245d7d43a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean @@ -13,7 +13,7 @@ This leaf derives the degree of the selected class field from its exact idèle-class norm range. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -24,6 +24,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean index 98d08acab0..3fa2bff8a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean @@ -13,7 +13,7 @@ This leaf proves that the selected class-field reciprocity equivalence sends the global norm-residue symbol to the corresponding quotient class. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -22,6 +22,7 @@ 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] : @@ -32,6 +33,7 @@ attribute [local instance] closedFiniteIndexNormResidueClassGroupIsMulCommutativ 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] @@ -53,10 +55,10 @@ private theorem quotientTransport_inverse_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`. -/ -@[simp] theorem closedFiniteIndexClassFieldGaloisEquivNormQuotient_globalNormResidue (H : Subgroup (IdeleClassGroup K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean index 187f676bed..81ae5f72b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean @@ -14,7 +14,7 @@ elimination preserves the native quotient topology, so no discrete topology instances are reconstructed here. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -23,6 +23,7 @@ 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] : @@ -33,6 +34,7 @@ attribute [local instance] closedFiniteIndexTopologicalClassGroupIsMulCommutativ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean index bf97933575..20716f81c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean @@ -12,7 +12,7 @@ The public theorem uses the named reducible value provider and specializes the generic transported-reciprocity calculation. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -21,6 +21,7 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean index 76d183a4af..e3e9a1c680 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean @@ -14,7 +14,7 @@ selected class-field instance tower once while remaining definitionally equivalent to the historical formula. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -23,6 +23,7 @@ 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] : @@ -33,6 +34,7 @@ attribute [local instance] closedFiniteIndexEvaluationValueClassGroupIsMulCommut 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean index 5609f79789..b23bb72fc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean @@ -23,8 +23,7 @@ single defining modulus bounds the support, so these pointwise minima assemble into a genuine finitely supported modulus. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -34,6 +33,7 @@ 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 @@ -41,6 +41,7 @@ def IsDefiningModulus (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. -/ @@ -49,6 +50,7 @@ abbrev ConductorialSubgroup {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. -/ @@ -63,18 +65,21 @@ theorem exists_definingFiniteExponent 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 @@ -82,6 +87,7 @@ noncomputable def narrowFiniteConductorBoundingModulus 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) : @@ -90,6 +96,7 @@ theorem narrowFiniteConductorBoundingModulus_spec 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 @@ -97,6 +104,7 @@ noncomputable def narrowFiniteConductorExponent (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 @@ -107,6 +115,7 @@ theorem narrowFiniteConductorExponent_spec 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 @@ -119,6 +128,7 @@ theorem narrowFiniteConductorExponent_le (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 @@ -145,6 +155,7 @@ noncomputable def narrowFiniteConductor 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] @@ -154,6 +165,7 @@ theorem narrowFiniteConductor_apply 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 @@ -164,6 +176,7 @@ theorem narrowFiniteConductor_le 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) @@ -180,6 +193,7 @@ theorem le_narrowFiniteConductor_iff 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 @@ -188,12 +202,14 @@ theorem isOpen 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) : @@ -201,6 +217,7 @@ instance finiteIndex 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 @@ -216,6 +233,7 @@ theorem narrowFiniteConductor_is_gcd end ConductorialSubgroup +open scoped Classical in /-- A closed finite-index subgroup always has at least one defining modulus. -/ theorem exists_definingModulus_of_isClosed_finiteIndex @@ -230,6 +248,7 @@ theorem exists_definingModulus_of_isClosed_finiteIndex namespace ConductorialSubgroup +open scoped Classical in /-- The conductorial subgroup canonically associated to a closed finite-index idèle-class subgroup. -/ noncomputable def ofClosedFiniteIndex diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean index b59fafa154..dda8878669 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -14,8 +14,7 @@ property exactly when the whole one-place idèle-class image is already contained in the target subgroup. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -25,12 +24,14 @@ 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 @@ -69,6 +70,7 @@ theorem infinitePlaceIdeleClass_range_le_congruenceSubgroup_of_not_mem 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) @@ -162,6 +164,7 @@ private theorem eraseRealPlace_isDefiningModulus_of_range_le 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. -/ @@ -184,6 +187,7 @@ theorem eraseRealPlace_isDefiningModulus_iff · 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. -/ @@ -212,6 +216,7 @@ theorem eraseRealPlaces_isDefiningModulus_of_ranges_le 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 @@ -219,6 +224,7 @@ noncomputable def fullConductorInfinitePart (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] @@ -229,6 +235,7 @@ theorem mem_fullConductorInfinitePart_iff 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} @@ -241,6 +248,7 @@ theorem fullConductorInfinitePart_subset_of_isDefiningModulus ((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 @@ -248,6 +256,7 @@ noncomputable def fullConductor finitePart := H.narrowFiniteConductor infinitePart := H.fullConductorInfinitePart +open scoped Classical in /-- The full conductor is itself a defining modulus. -/ theorem fullConductor_isDefiningModulus (H : ConductorialSubgroup K) : @@ -278,6 +287,7 @@ theorem fullConductor_isDefiningModulus 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean index 910c87412d..bd997f709a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean @@ -17,8 +17,7 @@ for a compositum. For a generated subgroup one obtains the complementary divisibility by the pointwise minimum. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -28,6 +27,7 @@ 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) : @@ -38,6 +38,7 @@ theorem rayClassFiniteCongruenceSubgroup_antitone 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 @@ -49,6 +50,7 @@ theorem rayClassInfiniteCongruenceSubgroup_antitone 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) : @@ -61,6 +63,7 @@ theorem rayClassIdeleCongruenceSubgroup_antitone 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 @@ -75,6 +78,7 @@ theorem rayClassCongruenceSubgroup_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 @@ -88,6 +92,7 @@ theorem isDefiningModulus_mono 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 @@ -99,6 +104,7 @@ theorem narrowFiniteConductor_isDefiningModulus 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 @@ -114,6 +120,7 @@ theorem inf_narrowFiniteConductor_isDefiningModulus 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 @@ -124,6 +131,7 @@ noncomputable def inf (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) : @@ -132,6 +140,7 @@ noncomputable def sup ⟨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 @@ -152,6 +161,7 @@ theorem narrowFiniteConductor_inf 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 @@ -161,6 +171,7 @@ theorem narrowFiniteConductor_inf_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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean index 241a2d0b7f..fe6669ccda 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean @@ -21,8 +21,7 @@ idele into its one-place component and the remaining defining-modulus component. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -32,6 +31,7 @@ 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 @@ -48,12 +48,14 @@ theorem exists_localDefiningExponent 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 @@ -63,6 +65,7 @@ theorem narrowFiniteLocalConductorExponent_spec (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) @@ -73,6 +76,7 @@ theorem narrowFiniteLocalConductorExponent_le 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 @@ -90,6 +94,7 @@ theorem narrowFiniteLocalConductorExponent_eq_zero_iff 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 @@ -187,6 +192,7 @@ theorem replaceFiniteExponent_definingModulus 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 @@ -220,6 +226,7 @@ theorem narrowFiniteConductorExponent_eq_narrowFiniteLocalConductorExponent 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 @@ -230,6 +237,7 @@ theorem narrowFiniteConductor_apply_eq_narrowFiniteLocalConductorExponent 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. -/ @@ -282,6 +290,7 @@ theorem exists_definingModulus_finitePart_agrees_on_finset 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 @@ -311,6 +320,7 @@ theorem exists_definingModulus_finitePart_eq_narrowFiniteConductor 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean index 13241a942d..632108dea9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean @@ -57,7 +57,6 @@ noncomputable def narrowFiniteConductorRayClassGroupToQuotient /-- The exact narrow finite conductor quotient map preserves every idèle-class representative. -/ -@[simp] theorem narrowFiniteConductorRayClassGroupToQuotient_mk (H : ConductorialSubgroup K) (c : IdeleClassGroup K) : @@ -215,7 +214,6 @@ noncomputable def narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq /-- The maximal exact narrow finite conductor equivalence preserves every idèle-class representative. -/ -@[simp] theorem narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq_mk (H : ConductorialSubgroup K) (hcard : @@ -330,7 +328,6 @@ def ideleClassQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqQuoti /-- The canonical equivalence between maximal exact narrow finite conductor quotients preserves every idèle-class representative. -/ -@[simp] theorem ideleClassQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqQuotientCards_mk (H J : ConductorialSubgroup K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean index 1f738fbd60..2e83129b1f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean @@ -110,7 +110,6 @@ def cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExten /-- The canonical equivalence between the two maximal cyclic norm quotients preserves every idèle-class representative. -/ -@[simp] theorem cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExtensionDegrees_mk (hconductor : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean index c24be33184..ff27872593 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean @@ -24,7 +24,7 @@ The final normal-closure step turns the resulting finite extension of `K` into a genuine finite Galois extension without enlarging its norm subgroup. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain open KummerTheory @@ -37,10 +37,14 @@ 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 : ℕ+) : @@ -48,6 +52,9 @@ noncomputable local instance IsCyclotomicExtension.finiteDimensional {(n : ℕ)} K (CyclotomicField (n : ℕ) K) +attribute [local instance] cyclotomicKummerNormDescent_cyclotomicFiniteDimensional + +open scoped Classical in noncomputable local instance cyclotomicKummerNormDescent_cyclotomicIsGalois (n : ℕ+) : @@ -55,6 +62,9 @@ noncomputable local instance IsCyclotomicExtension.isGalois {(n : ℕ)} K (CyclotomicField (n : ℕ) K) +attribute [local instance] cyclotomicKummerNormDescent_cyclotomicIsGalois + +open scoped Classical in private theorem cyclotomicKummerNormDescent_primitiveRoots_nonempty (n : ℕ+) : (primitiveRoots (n : ℕ) @@ -64,11 +74,13 @@ private theorem cyclotomicKummerNormDescent_primitiveRoots_nonempty (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. @@ -89,6 +101,7 @@ noncomputable def cyclotomicKummerNormSupport 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 @@ -100,6 +113,7 @@ theorem subset_cyclotomicKummerNormSupport 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 @@ -112,6 +126,7 @@ noncomputable def cyclotomicKummerNormSupportAbove 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] @@ -130,6 +145,7 @@ theorem mem_cyclotomicKummerNormSupportAbove_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 @@ -185,6 +201,7 @@ theorem sUnitKummerNormSupport_cyclotomicKummerNormSupportAbove · 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 @@ -221,6 +238,7 @@ theorem cyclotomicKummerNormSupport_idem (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 @@ -240,6 +258,7 @@ noncomputable abbrev cyclotomicFullSUnitKummerExtension (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 @@ -256,6 +275,7 @@ theorem cyclotomicFullSUnitKummerExtension_isGalois (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 @@ -278,6 +298,7 @@ theorem cyclotomicFullSUnitKummerExtension_finiteDimensional (sUnitKummerNormSupport (K := C) n (cyclotomicKummerNormSupportAbove (K := K) n seed))) +open scoped Classical in noncomputable local instance cyclotomicKummerNormDescent_kummerFiniteDimensional (n : ℕ+) @@ -288,6 +309,9 @@ noncomputable local instance 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 @@ -301,6 +325,7 @@ private theorem cyclotomicKummerNormDescent_kummerNumberField (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 @@ -343,9 +368,11 @@ private theorem (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 - cyclotomicKummerNormDescent_kummerAlgebraOverBase + cyclotomicKummerNormDescentKummerAlgebraOverBase (n : ℕ+) (seed : Finset (HeightOneSpectrum (𝓞 K))) : Algebra K @@ -355,6 +382,9 @@ noncomputable local instance (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 @@ -363,9 +393,10 @@ private noncomputable def SMul K (cyclotomicFullSUnitKummerExtension (K := K) n seed) := Algebra.toSMul - (self := cyclotomicKummerNormDescent_kummerAlgebraOverBase + (self := cyclotomicKummerNormDescentKummerAlgebraOverBase (K := K) n seed) +open scoped Classical in @[reducible] private noncomputable def cyclotomicKummerNormDescent_kummerModuleOverBase @@ -375,6 +406,7 @@ private noncomputable def (cyclotomicFullSUnitKummerExtension (K := K) n seed) := Algebra.toModule +open scoped Classical in private theorem cyclotomicKummerNormDescent_kummerScalarTower (n : ℕ+) @@ -384,6 +416,7 @@ private theorem (cyclotomicFullSUnitKummerExtension (K := K) n seed) := IsScalarTower.of_algebraMap_eq' rfl +open scoped Classical in noncomputable local instance cyclotomicKummerNormDescent_kummerFiniteDimensionalOverBase (n : ℕ+) @@ -399,6 +432,9 @@ noncomputable local instance (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 @@ -447,6 +483,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean index 176c4f5317..2c0fc53e24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -31,7 +31,7 @@ extension yields the intrinsic containment criterion over the original number field. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -46,6 +46,7 @@ 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₂) @@ -56,6 +57,7 @@ private theorem subgroup_map_toAddSubgroup_mulEquiv_eq 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₂) @@ -66,6 +68,7 @@ private theorem subgroup_toAddSubgroup_map_mono_mulEquiv (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`. -/ @@ -78,6 +81,7 @@ noncomputable def closedFiniteIndexClassFieldBaseEmbedding (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] @@ -95,6 +99,7 @@ theorem closedFiniteIndexClassFieldBaseEquiv_coe (K := K) H hclosed x := by rfl +open scoped Classical in private noncomputable def finiteAbelianClassFieldContainmentIdeleClassEquiv (H : Subgroup (IdeleClassGroup K)) @@ -108,6 +113,7 @@ private noncomputable def (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`. -/ @@ -125,6 +131,7 @@ noncomputable def closedFiniteIndexClassFieldCompatibleEmbedding (closedFiniteIndexClassFieldBaseEmbedding (K := K) H hclosed)) +open scoped Classical in /-- The compatible top embedding restricts to the distinguished embedding of the original base field. -/ @[simp] @@ -146,6 +153,7 @@ theorem (closedFiniteIndexClassFieldBaseEmbedding (K := K) H hclosed)) +open scoped Classical in /-- Evaluation on the original scalar map agrees with the distinguished base embedding. -/ @[simp] @@ -167,6 +175,7 @@ theorem closedFiniteIndexClassFieldCompatibleEmbedding_algebraMap (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] @@ -192,6 +201,7 @@ theorem closedFiniteIndexClassFieldCompatibleEmbedding_baseSubgroup 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 @@ -213,6 +223,7 @@ noncomputable def (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] @@ -238,6 +249,7 @@ theorem (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. -/ @@ -370,6 +382,7 @@ private theorem (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. -/ @@ -407,6 +420,7 @@ theorem ordinaryIdeleClassNormSubgroup_embeddedAbelianSubextension_named (K := K) H hclosed E +open scoped Classical in private theorem ordinaryIdeleClassNormSubgroup_closedFiniteIndexClassFieldSubextension_named (H : Subgroup (IdeleClassGroup K)) @@ -437,6 +451,7 @@ private theorem 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`. -/ @@ -496,6 +511,7 @@ theorem (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 @@ -519,6 +535,7 @@ private theorem 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. -/ @@ -566,6 +583,7 @@ private theorem (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`. -/ @@ -609,6 +627,7 @@ noncomputable def (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 @@ -628,6 +647,7 @@ theorem ⟨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 @@ -676,6 +696,7 @@ noncomputable def 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 @@ -684,7 +705,7 @@ theorem ideleClassNorm_range_le_of_algHom [Field L₂] [NumberField L₂] [Algebra K L₁] [Algebra K L₂] [FiniteDimensional K L₁] [FiniteDimensional K L₂] - [IsAbelianGalois K L₁] [IsAbelianGalois K L₂] + (f : L₁ →ₐ[K] L₂) : (_root_.ideleClassNorm K L₂).range ≤ (_root_.ideleClassNorm K L₁).range := by @@ -699,6 +720,7 @@ theorem ideleClassNorm_range_le_of_algHom 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. -/ @@ -735,6 +757,7 @@ noncomputable def finiteAbelianExtensionEmbeddingOfNormRangeLE 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 @@ -751,6 +774,7 @@ theorem finiteAbelianExtension_nonempty_algHom_of_normRange_le ⟨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 @@ -772,6 +796,7 @@ theorem nonempty_algHom_iff_ideleClassNorm_range_le 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean index bd0ae02c15..aa24d6e907 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean @@ -38,7 +38,7 @@ open Reciprocity /-- Fix the rational algebra structure used by every occurrence of the absolute Galois group in this module. -/ noncomputable local instance - finiteAbelianClassFieldCorrespondence_separableClosureAlgebra : + finiteAbelianClassFieldCorrespondenceSeparableClosureAlgebra : Algebra ℚ (SeparableClosure ℚ) := rationalSeparableClosureAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean index cfbe9817d4..9da9e27d28 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean @@ -22,7 +22,7 @@ subgroup, together with its norm-range and degree-index theorems, is provided by `ClosedFiniteIndexClassField`. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -33,19 +33,24 @@ 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 - finiteAbelianClassFieldCorrespondenceTopology_separableClosureAlgebra : + 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 @@ -54,6 +59,7 @@ abbrev ordinaryIdeleClassNormExtension (L : FiniteAbelianSubextension K.field) : Type := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below +open scoped Classical in noncomputable instance ordinaryIdeleClassNormBaseFiniteDimensional (K : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : @@ -61,6 +67,7 @@ noncomputable instance ordinaryIdeleClassNormBaseFiniteDimensional abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) K.field K.finite +open scoped Classical in noncomputable instance ordinaryIdeleClassNormExtensionFiniteDimensional (K : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -72,6 +79,7 @@ noncomputable instance ordinaryIdeleClassNormExtensionFiniteDimensional ℚ (SeparableClosure ℚ) K.field L.field L.below K.finite L.finite +open scoped Classical in noncomputable instance ordinaryIdeleClassNormScalarTower (K : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -81,6 +89,7 @@ noncomputable instance ordinaryIdeleClassNormScalarTower (ordinaryIdeleClassNormExtension K L) := IsScalarTower.of_algebraMap_eq' rfl +open scoped Classical in noncomputable instance ordinaryIdeleClassNormExtensionAbsoluteFiniteDimensional (K : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -91,12 +100,14 @@ noncomputable instance ordinaryIdeleClassNormExtensionAbsoluteFiniteDimensional (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 ℚ)) @@ -105,6 +116,7 @@ noncomputable instance ordinaryIdeleClassNormExtensionNumberField NumberField.of_module_finite ℚ (ordinaryIdeleClassNormExtension K L) +open scoped Classical in noncomputable instance ordinaryIdeleClassNormExtensionIsAbelianGalois (K : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -114,6 +126,7 @@ noncomputable instance ordinaryIdeleClassNormExtensionIsAbelianGalois (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 @@ -128,6 +141,7 @@ theorem ordinaryIdeleClassNormSubgroup_eq_namedNormRange 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. -/ @@ -146,6 +160,7 @@ theorem ordinaryIdeleClassNormSubgroup_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 @@ -163,6 +178,7 @@ theorem ordinaryIdeleClassNormSubgroup_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 @@ -180,6 +196,7 @@ theorem ordinaryIdeleClassNormSubgroup_finiteIndex (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean index fc00bd4347..993adc5e72 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean @@ -24,7 +24,7 @@ then realizes `H`, transported to the canonical embedded copy of the base field, as an exact determinant-norm subgroup. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -36,6 +36,7 @@ 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 @@ -49,6 +50,7 @@ noncomputable def closedFiniteIndexNormExponent ⟨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)) @@ -63,6 +65,7 @@ theorem closedFiniteIndexNormExponent_eq_index 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 @@ -85,6 +88,7 @@ theorem one_lt_closedFiniteIndexNormExponent 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`. -/ @@ -95,6 +99,7 @@ noncomputable def closedFiniteIndexNormSeed 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)) @@ -102,12 +107,14 @@ noncomputable abbrev closedFiniteIndexNormCyclotomicField 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] : @@ -119,6 +126,7 @@ noncomputable instance CyclotomicField.isCyclotomicExtension (closedFiniteIndexNormExponent (K := K) H : ℕ) K +open scoped Classical in noncomputable instance closedFiniteIndexNormCyclotomicFieldFiniteDimensional (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : @@ -128,6 +136,7 @@ noncomputable instance {(closedFiniteIndexNormExponent (K := K) H : ℕ)} K (closedFiniteIndexNormCyclotomicField (K := K) H) +open scoped Classical in noncomputable instance closedFiniteIndexNormCyclotomicFieldNumberField (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : NumberField @@ -135,6 +144,7 @@ noncomputable instance closedFiniteIndexNormCyclotomicFieldNumberField NumberField.of_module_finite K (closedFiniteIndexNormCyclotomicField (K := K) H) +open scoped Classical in noncomputable instance closedFiniteIndexNormCyclotomicFieldIsGalois (H : Subgroup (IdeleClassGroup K)) [H.FiniteIndex] : IsGalois K @@ -143,6 +153,7 @@ noncomputable instance closedFiniteIndexNormCyclotomicFieldIsGalois {(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 @@ -153,6 +164,7 @@ noncomputable abbrev closedFiniteIndexNormKummerField (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))) @@ -167,6 +179,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldFiniteDimensional (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))) @@ -180,6 +193,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldIsGalois (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))) @@ -189,6 +203,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldNumberField (closedFiniteIndexNormCyclotomicField (K := K) H) (closedFiniteIndexNormKummerField (K := K) H hclosed) +open scoped Classical in @[reducible] noncomputable instance closedFiniteIndexNormKummerFieldAlgebraOverBase (H : Subgroup (IdeleClassGroup K)) @@ -201,6 +216,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldAlgebraOverBase (algebraMap K (closedFiniteIndexNormCyclotomicField (K := K) H))).toAlgebra +open scoped Classical in @[reducible] noncomputable instance closedFiniteIndexNormKummerFieldSMulOverBase (H : Subgroup (IdeleClassGroup K)) @@ -210,6 +226,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldSMulOverBase Algebra.toSMul (self := closedFiniteIndexNormKummerFieldAlgebraOverBase H hclosed) +open scoped Classical in @[reducible] noncomputable instance closedFiniteIndexNormKummerFieldModuleOverBase (H : Subgroup (IdeleClassGroup K)) @@ -218,6 +235,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldModuleOverBase 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))) @@ -227,6 +245,7 @@ noncomputable instance closedFiniteIndexNormKummerFieldScalarTower (closedFiniteIndexNormKummerField (K := K) H hclosed) := by exact IsScalarTower.of_algebraMap_eq' rfl +open scoped Classical in noncomputable instance closedFiniteIndexNormKummerFieldFiniteDimensionalOverBase (H : Subgroup (IdeleClassGroup K)) @@ -238,6 +257,7 @@ noncomputable instance (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 @@ -247,6 +267,7 @@ noncomputable abbrev closedFiniteIndexNormAmbient finiteNormalClosure K (closedFiniteIndexNormKummerField (K := K) H hclosed) +open scoped Classical in noncomputable instance closedFiniteIndexNormAmbientFiniteDimensional (H : Subgroup (IdeleClassGroup K)) (hclosed : IsClosed (H : Set (IdeleClassGroup K))) @@ -256,6 +277,7 @@ noncomputable instance closedFiniteIndexNormAmbientFiniteDimensional unfold closedFiniteIndexNormAmbient infer_instance +open scoped Classical in noncomputable instance closedFiniteIndexNormAmbientNumberField (H : Subgroup (IdeleClassGroup K)) (hclosed : IsClosed (H : Set (IdeleClassGroup K))) @@ -266,6 +288,7 @@ noncomputable instance closedFiniteIndexNormAmbientNumberField 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))) @@ -276,6 +299,7 @@ noncomputable instance closedFiniteIndexNormAmbientIsGalois 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean index 2efbd30ec8..7d3441afa2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean @@ -16,8 +16,7 @@ identifies the concrete local norm quotient with the decomposition group. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -31,6 +30,7 @@ variable [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 @@ -48,6 +48,7 @@ noncomputable def chosenFinitePlaceArtinToDecompositionGroup (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 @@ -68,6 +69,7 @@ theorem chosenFinitePlaceArtinToDecompositionGroup_surjective 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 @@ -81,6 +83,7 @@ theorem chosenFinitePlaceArtinToDecompositionGroup_ker 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 @@ -97,6 +100,7 @@ noncomputable def chosenFinitePlaceNormQuotientEquivDecompositionGroup (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] @@ -110,6 +114,7 @@ theorem chosenFinitePlaceNormQuotientEquivDecompositionGroup_mk (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean index a5c5ea83f4..b67f85c487 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean @@ -15,7 +15,7 @@ embeds. The proof combines the ray-field embedding criterion with the minimality theorem for the full conductor. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -26,6 +26,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean index 6b0a7a4cd5..39d95f6137 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -42,7 +42,6 @@ local instance /-- On an idele representative, the big-Hilbert quotient equivalence is the canonical representative in the narrow class group. -/ -@[simp] theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk (a : IdeleGroup K) : bigHilbertClassFieldQuotientEquivNarrowClassGroup @@ -57,7 +56,6 @@ theorem bigHilbertClassFieldQuotientEquivNarrowClassGroup_mk /-- On an idele representative, the small-Hilbert quotient equivalence is the ordinary ideal-class map. -/ -@[simp] theorem smallHilbertClassFieldQuotientEquivClassGroup_mk (a : IdeleGroup K) : smallHilbertClassFieldQuotientEquivClassGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean index 150eb44f24..2905f81ec7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean @@ -588,7 +588,6 @@ noncomputable def bigHilbertClassFieldBaseEmbedding /-- The canonical fixed-field equivalence has the distinguished base embedding as its underlying map into the rational separable closure. -/ -@[simp] theorem bigHilbertClassFieldBaseEquiv_coe (K : Type) [Field K] [NumberField K] (x : K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean index d787639821..23124710f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean @@ -30,7 +30,7 @@ quotients: the narrow class number for the big Hilbert class field and the ordinary class number for the small Hilbert class field. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -44,6 +44,7 @@ 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 : @@ -51,6 +52,7 @@ instance bigHilbertClassFieldNormSubgroupFiniteIndex : 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) @@ -60,6 +62,7 @@ noncomputable abbrev bigHilbertClassFieldNormAmbient (K : Type) (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) @@ -69,6 +72,7 @@ noncomputable abbrev smallHilbertClassFieldNormAmbient (K : Type) (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) @@ -77,6 +81,7 @@ noncomputable abbrev bigHilbertClassFieldBaseSubgroup (K : Type) (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. -/ @@ -88,6 +93,7 @@ noncomputable abbrev bigHilbertClassFieldSubextension (K : Type) (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) @@ -96,6 +102,7 @@ noncomputable abbrev bigHilbertClassFieldBase (K : Type) (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) @@ -104,6 +111,7 @@ noncomputable abbrev bigHilbertClassField (K : Type) (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 : @@ -112,6 +120,7 @@ noncomputable abbrev bigHilbertClassFieldBaseEquiv : (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 : @@ -120,6 +129,7 @@ def bigHilbertClassFieldTransportedNormSubgroup : (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 : @@ -134,6 +144,7 @@ theorem bigHilbertClassField_ideleClassNorm_range : (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)) @@ -174,6 +185,7 @@ private theorem (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 : @@ -200,6 +212,7 @@ theorem bigHilbertClassField_finrank_eq_narrowClassGroup_card : (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) @@ -208,6 +221,7 @@ noncomputable abbrev smallHilbertClassFieldBaseSubgroup (K : Type) (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) @@ -218,6 +232,7 @@ noncomputable abbrev smallHilbertClassFieldSubextension (K : Type) (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) @@ -226,6 +241,7 @@ noncomputable abbrev smallHilbertClassFieldBase (K : Type) (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) @@ -234,6 +250,7 @@ noncomputable abbrev smallHilbertClassField (K : Type) (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 : @@ -242,6 +259,7 @@ noncomputable abbrev smallHilbertClassFieldBaseEquiv : (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 : @@ -250,6 +268,7 @@ def smallHilbertClassFieldTransportedNormSubgroup : (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 : @@ -264,6 +283,7 @@ theorem smallHilbertClassField_ideleClassNorm_range : (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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean index a2bb16cc10..5b127fb711 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -14,7 +14,7 @@ This leaf specializes the shared reciprocity transport to the actual base field of the selected big Hilbert class field. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -25,12 +25,16 @@ 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 : @@ -44,6 +48,7 @@ theorem bigHilbertClassField_ideleClassNorm_range_eq_intrinsic : 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. -/ @@ -75,6 +80,7 @@ private noncomputable def bigHilbertClassFieldReciprocityData : 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 : @@ -83,10 +89,10 @@ noncomputable def bigHilbertClassFieldGaloisEquivNarrowClassGroup : 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. -/ -@[simp] theorem bigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue (c : IdeleClassGroup (bigHilbertClassFieldBase K)) : bigHilbertClassFieldGaloisEquivNarrowClassGroup (K := K) @@ -102,10 +108,10 @@ theorem bigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResidue (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. -/ -@[simp] theorem bigHilbertClassFieldGaloisEquivNarrowClassGroup_idele (a : IdeleGroup (bigHilbertClassFieldBase K)) : bigHilbertClassFieldGaloisEquivNarrowClassGroup (K := K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean index 3efaf1b1ff..05586e3a5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -13,7 +13,7 @@ The original-base specialization is compiled separately from the realized-base specialization and reuses the shared reciprocity transport provider. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -25,12 +25,16 @@ 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. -/ @@ -67,6 +71,7 @@ theorem bigHilbertClassField_ideleClassNorm_range_over_original : (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. -/ @@ -91,6 +96,7 @@ private noncomputable def 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 @@ -99,9 +105,9 @@ noncomputable def 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. -/ -@[simp] theorem bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_globalNormResidue (c : IdeleClassGroup K) : @@ -116,9 +122,9 @@ theorem exact (bigHilbertClassFieldReciprocityOverOriginalData (K := K)).2 c +open scoped Classical in /-- On an actual idèle, direct big-Hilbert reciprocity is its narrow ideal class. -/ -@[simp] theorem bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal_idele (a : IdeleGroup K) : bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean index c44e615509..067d1cadcc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -13,7 +13,7 @@ This leaf specializes the shared reciprocity transport to the actual base field of the selected small Hilbert class field. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -25,12 +25,16 @@ 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 : @@ -44,6 +48,7 @@ theorem smallHilbertClassField_ideleClassNorm_range_eq_intrinsic : 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. -/ @@ -75,6 +80,7 @@ private noncomputable def smallHilbertClassFieldReciprocityData : 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 : @@ -83,11 +89,11 @@ noncomputable def smallHilbertClassFieldGaloisEquivClassGroup : 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. -/ -@[simp] theorem smallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue (c : IdeleClassGroup (smallHilbertClassFieldBase K)) : smallHilbertClassFieldGaloisEquivClassGroup (K := K) @@ -103,10 +109,10 @@ theorem smallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue (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. -/ -@[simp] theorem smallHilbertClassFieldGaloisEquivClassGroup_idele (a : IdeleGroup (smallHilbertClassFieldBase K)) : smallHilbertClassFieldGaloisEquivClassGroup (K := K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean index f902d22b86..ed8d617a80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean @@ -13,7 +13,7 @@ The original-base specialization is compiled separately from the realized-base specialization and reuses the shared reciprocity transport provider. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -25,12 +25,16 @@ 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. -/ @@ -67,6 +71,7 @@ theorem smallHilbertClassField_ideleClassNorm_range_over_original : (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. -/ @@ -91,6 +96,7 @@ private noncomputable def 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 : @@ -98,9 +104,9 @@ noncomputable def smallHilbertClassFieldGaloisEquivClassGroupOverOriginal : 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. -/ -@[simp] theorem smallHilbertClassFieldGaloisEquivClassGroupOverOriginal_globalNormResidue (c : IdeleClassGroup K) : @@ -115,9 +121,9 @@ theorem exact (smallHilbertClassFieldReciprocityOverOriginalData (K := K)).2 c +open scoped Classical in /-- On an actual idèle, direct small-Hilbert reciprocity is its ordinary ideal class. -/ -@[simp] theorem smallHilbertClassFieldGaloisEquivClassGroupOverOriginal_idele (a : IdeleGroup K) : smallHilbertClassFieldGaloisEquivClassGroupOverOriginal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean index de6ec2b6e7..dfc3a5c1f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean @@ -14,7 +14,7 @@ reuse the named data provider without rebuilding the generic reciprocity composite. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -23,18 +23,23 @@ 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 @@ -59,6 +64,7 @@ theorem hilbertClassFieldQuotientTransport_inverse_apply_with _ = 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 @@ -75,6 +81,7 @@ noncomputable def hilbertClassFieldGlobalReciprocityTransportEquiv (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 @@ -122,6 +129,7 @@ theorem hilbertClassFieldGlobalReciprocityTransport_globalNormResidue ((_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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean index 10f137b539..a99d130dff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean @@ -95,7 +95,6 @@ def bigHilbertClassFieldQuotientToIdeleClassNormQuotient /-- The big-Hilbert quotient transition sends an idele class to the same class modulo the actual norm subgroup. -/ -@[simp] theorem bigHilbertClassFieldQuotientToIdeleClassNormQuotient_mk (hunramified : _root_.ramifiedBaseFinitePlaces diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean index 2b81e81c00..1d65be9cfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean @@ -14,7 +14,7 @@ Composing this transport with the infinite Galois correspondence gives the order-reversing infinite abelian class-field correspondence. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -24,6 +24,7 @@ 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 @@ -33,6 +34,7 @@ noncomputable def mapContinuousMulEquiv 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 @@ -60,6 +62,7 @@ noncomputable def orderIsoMapContinuousMulEquiv 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) : @@ -81,6 +84,7 @@ noncomputable def orderDualIsoMapContinuousMulEquiv 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) : @@ -99,6 +103,7 @@ 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. -/ @@ -110,6 +115,7 @@ noncomputable def infiniteAbelianClassFieldCorrespondence : (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] @@ -121,6 +127,7 @@ theorem infiniteAbelianClassFieldCorrespondence_apply (ideleClassComponentQuotientEquivMaximalAbelianGalois K) H) := rfl +open scoped Classical in /-- The inverse correspondence is the fixing subgroup transported back to the idele-class component quotient. -/ @[simp] @@ -134,6 +141,7 @@ theorem infiniteAbelianClassFieldCorrespondence_symm_apply 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 @@ -145,6 +153,7 @@ theorem infiniteAbelianClassFieldCorrespondence_fixingSubgroup 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean index a9204fcc50..ef872c8be6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean @@ -92,7 +92,7 @@ theorem ideleNorm_mem_powerLocalUnitSubgroup_of_supports_above finitePlaceExtensionEquivAbove (K := K) (L := L) v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v₀} := @@ -128,7 +128,7 @@ theorem ideleNorm_mem_powerLocalUnitSubgroup_of_supports_above finitePlaceExtensionEquivAbove (K := K) (L := L) v₀ let := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let : Fintype {W : HeightOneSpectrum (𝓞 L) // _root_.finitePlaceBelow (K := K) W = v₀} := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean index 9c645cab83..980218db7d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -179,7 +179,8 @@ private theorem normConductorRayClassModulus_isDefining (rayClassModulusToOriginal K (normConductorRayClassModulus K L)) ≤ (_root_.ideleClassNorm K L).range := by rw [normConductorRayClassModulus_original K L] - exact GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_isDefiningModulus + exact + GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_isDefiningModulus (K := K) (L := L) /-- Arithmetic global reciprocity, descended to the public ray class group @@ -245,7 +246,8 @@ theorem normConductorArtin_prime change GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap (K := K) (L := L) m' hm (RayClass.primeToModulusIdeal m' v hv') = _ - exact GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin + exact + GlobalClassFieldTheory.IdealClassFieldTheory.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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean index adedf19e3c..38ee8e4bb0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean @@ -30,7 +30,7 @@ finite places. The full conductor, including an archimedean component, is deliberately not defined here. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative noncomputable section @@ -45,6 +45,7 @@ variable [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 @@ -52,7 +53,10 @@ local instance normConductorIdeleClassGroupIsMulCommutative 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. -/ @@ -79,6 +83,7 @@ theorem exists_localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup 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 @@ -88,6 +93,7 @@ noncomputable def ideleClassNormLocalHigherUnitExponent (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 @@ -102,6 +108,7 @@ theorem ideleClassNormLocalHigherUnitExponent_spec (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. -/ @@ -120,6 +127,7 @@ theorem ideleClassNormLocalHigherUnitExponent_min 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. -/ @@ -143,6 +151,7 @@ theorem ideleClassNormLocalHigherUnitExponent_eq_zero_iff 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 @@ -161,6 +170,7 @@ theorem ideleClassNormLocalHigherUnitExponent_eq_zero_of_chosenUnramified _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 @@ -188,6 +198,7 @@ theorem ideleClassNormLocalHigherUnitExponent_eq_zero_of_not_mem_ramified (_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 : @@ -203,6 +214,7 @@ noncomputable def ideleClassNormDefiningModulus : (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] @@ -213,6 +225,7 @@ theorem ideleClassNormDefiningModulus_apply (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 @@ -226,6 +239,7 @@ theorem ideleClassNormDefiningModulus_local_spec 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 @@ -242,6 +256,7 @@ theorem ideleClassNormDefiningModulus_le_of_localHigherUnitGroup_le 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. -/ @@ -260,6 +275,7 @@ theorem mem_ideleClassNormDefiningModulus_support_iff (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 : @@ -278,6 +294,7 @@ theorem ideleClassNormDefiningModulus_support_subset_ramifiedBaseFinitePlaces : (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 @@ -310,6 +327,7 @@ theorem 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 : @@ -354,6 +372,7 @@ theorem ideleClassNormDefiningModulus_isDefiningModulus : 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 : @@ -364,12 +383,14 @@ noncomputable def ideleClassNormConductorialSubgroup : 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 : @@ -381,6 +402,7 @@ theorem ideleClassNorm_range_isOpen : (ideleClassNormConductorialSubgroup (K := K) (L := L)).isOpen +open scoped Classical in /-- The actual idele-class norm subgroup is closed. -/ theorem ideleClassNorm_range_isClosed : IsClosed @@ -390,12 +412,14 @@ theorem ideleClassNorm_range_isClosed : (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 : @@ -406,6 +430,7 @@ theorem ideleClassNorm_narrowFiniteConductor_isDefiningModulus : (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 @@ -425,9 +450,9 @@ noncomputable def 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. -/ -@[simp] theorem narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_mk (x : IdeleClassGroup K) : narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient @@ -441,6 +466,7 @@ theorem narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_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 @@ -460,6 +486,7 @@ theorem (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 @@ -491,6 +518,7 @@ theorem 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 @@ -517,6 +545,7 @@ noncomputable def (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. -/ @@ -576,6 +605,7 @@ theorem 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 @@ -593,6 +623,7 @@ theorem (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 : @@ -603,6 +634,7 @@ theorem ideleClassNorm_narrowFiniteConductor_le_normDefiningModulus : (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. -/ @@ -620,6 +652,7 @@ theorem ideleClassNorm_narrowFiniteConductor_apply_le_localHigherUnitExponent 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. -/ @@ -641,6 +674,7 @@ theorem ((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. -/ @@ -664,6 +698,7 @@ theorem ((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. -/ @@ -685,6 +720,7 @@ theorem 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 @@ -706,6 +742,7 @@ theorem (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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean index 35e28395a2..1ff3bcb4dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -240,7 +240,6 @@ def normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotien /-- The canonical equivalence between maximal narrow finite conductor ray-class norm quotients preserves every idèle-class representative. -/ -@[simp] theorem normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotientCards_mk {M : Type} diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean index f4443a310e..91375d1887 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean @@ -123,7 +123,6 @@ def ideleClassNormQuotientTowerMap : 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. -/ -@[simp] theorem ideleClassNormQuotientTowerMap_mk (x : IdeleClassGroup K) : ideleClassNormQuotientTowerMap @@ -166,7 +165,6 @@ 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. -/ -@[simp] theorem narrowFiniteConductorRayClassGroupToIntermediateIdeleClassNormQuotient_mk (x : IdeleClassGroup K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean index 8207c8c004..3d6ae26a4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean @@ -26,8 +26,7 @@ This is the concrete power-congruence core used in the existence proof for global class fields. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -38,6 +37,7 @@ 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`. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean index 1e0a383f2d..77a9778d41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean @@ -17,18 +17,19 @@ idèle-class norm kernel. We then compare that kernel with the established ideal-theoretic Artin map on the same ray modulus. -/ -open scoped Classical NumberField IsMulCommutative +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] - [FiniteDimensional K L] [IsAbelianGalois K L] + [IsAbelianGalois K L] (D : FiniteAbelianReciprocityData K L) (v : HeightOneSpectrum (𝓞 K)) (hv : v ∉ D.modulus.finitePart.support) : @@ -51,6 +52,7 @@ private theorem finiteAbelianReciprocity_primeArtin_eq_original (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] @@ -77,6 +79,7 @@ private theorem finiteAbelianReciprocity_originalPrimeNormalization 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. -/ @@ -104,6 +107,7 @@ theorem finiteAbelianReciprocity_modulus_isDefining 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean index fdea9dd430..e697e67e39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean @@ -17,18 +17,19 @@ prime by prime. The reverse inclusion needs a separate approximation argument and is not asserted here. -/ -open scoped Classical NumberField IsMulCommutative +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] - [FiniteDimensional K L] + (m : RayClassModulus K) : rayClassPrimeToIdealNormDomain K L m = RayClass.primeToModulusIdeals @@ -60,6 +61,7 @@ private theorem publicIdealNormDomain_eq_source rw [RayClass.mem_idealNormLiftedModulus_support_iff, ← hbelow] exact hW +open scoped Classical in private theorem fractionalIdealNorm_prime (K L : Type) [Field K] [NumberField K] @@ -104,6 +106,7 @@ private theorem fractionalIdealNorm_prime · 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean index 5c1ceec418..cb5cc270b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean @@ -15,18 +15,19 @@ 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. -/ -open scoped Classical NumberField IsMulCommutative +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] - [FiniteDimensional K L] + (m : RayClassModulus K) : rayClassPrimeToIdealNormDomain K L m = RayClass.primeToModulusIdeals @@ -58,6 +59,7 @@ private theorem publicIdealNormDomain_eq_source' 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean index 3fdfdd7120..f7b77c3da7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -31,7 +31,7 @@ This module supplies the implementation proofs for the compact conductor and ray-class-field statements in the parent `Theorems` directory. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -40,6 +40,7 @@ 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 @@ -48,6 +49,7 @@ def rayClassModulusToOriginal 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 @@ -72,6 +74,7 @@ private theorem principalIdele_mem_infinitePositiveSubgroup_iff · 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 @@ -120,6 +123,7 @@ theorem principalIdele_mem_primeTo_iff_isRayCongruent 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 @@ -135,6 +139,7 @@ theorem principalIdele_mem_narrowPrimeTo_iff_isRayCongruent 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 @@ -191,6 +196,7 @@ theorem rayPrincipalIdealSubgroup_eq · 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 @@ -203,6 +209,7 @@ theorem narrowRayPrincipalIdealSubgroup_eq (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 @@ -221,6 +228,7 @@ noncomputable def rayClassGroupEquivOriginal 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 @@ -253,6 +261,7 @@ theorem rayClassGroupEquivOriginal_prime (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. -/ @@ -265,6 +274,7 @@ noncomputable def rayClassGroupEquivOriginalIdele (RayClass.rayClassGroupEquivIdealRayClassGroup (rayClassModulusToOriginal K m)).symm +open scoped Classical 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 @@ -308,9 +318,11 @@ theorem rayClassGroupEquivOriginalIdele_prime _ = e (QuotientGroup.mk' (RayClass.Modulus.congruenceSubgroup m') (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) (a : IdeleGroup K))) := by - exact (GlobalClassFieldTheory.GlobalClassFields.rayClassGroupEquivIdealRayClassGroup_mk_primeTo + 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 @@ -325,6 +337,7 @@ noncomputable def narrowRayClassGroupEquivNarrowClassGroup ((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 @@ -335,6 +348,7 @@ theorem rayClassField_normSubgroup RayClass.Modulus.congruenceSubgroup m := GlobalClassFieldTheory.GlobalClassFields.rayClassField_ideleClassNorm_range_over_original m +open scoped Classical in /-- Any finite abelian extension whose norm group contains the ray congruence subgroup is unramified outside that modulus. -/ theorem unramifiedOutsideModulus_of_definingModulus @@ -391,6 +405,7 @@ theorem unramifiedOutsideModulus_of_definingModulus 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 @@ -405,6 +420,7 @@ theorem rayClassField_unramifiedOutsideModulus 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 @@ -416,6 +432,7 @@ theorem rayClassField_reciprocity 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 @@ -426,6 +443,7 @@ theorem rayClassField_degree 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 @@ -441,6 +459,7 @@ theorem embedsInRayClassField_iff_conductor_le (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] @@ -504,6 +523,7 @@ end ClassFieldTheory.GlobalClassFieldComparison namespace ClassFieldTheory +open scoped Classical 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. -/ @@ -531,7 +551,8 @@ theorem normFullConductor_isAbelianConductor 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 GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + apply + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv m' e intro v hv have hvm : v ∉ m.finitePart.support := hv diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean index 7c330ecbde..84c5c291ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean @@ -18,7 +18,7 @@ one-place prime idèle represents the direct residue unit `q` in compare rational ray reciprocity with the cyclotomic character. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -27,6 +27,7 @@ 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 @@ -47,6 +48,7 @@ noncomputable def rationalRayClassGroupContinuousMulEquivZModUnits 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. -/ @@ -59,6 +61,7 @@ theorem rationalRayClassGroupContinuousMulEquivZModUnits_apply 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 @@ -75,6 +78,7 @@ theorem rationalPrime_not_mem_rationalModulus_support 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 `𝓞 ℚ ≃+* ℤ`. -/ @@ -113,6 +117,7 @@ theorem rationalPrime_asIdeal_eq_span_integerGenerator 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`. -/ @@ -135,6 +140,7 @@ theorem rationalPrime_fractionalIdeal_eq_toPrincipalIdeal 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 @@ -149,6 +155,7 @@ noncomputable def rationalPrimePrincipalPrimeToModulusIdeal 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 @@ -164,9 +171,9 @@ theorem primeToModulusIdeal_rationalPrime_eq_principal 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`. -/ -@[simp] theorem primeToIdealResidueHom_rationalPrime (m : ℕ) (hm : m ≠ 0) (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : @@ -218,10 +225,10 @@ theorem primeToIdealResidueHom_rationalPrime 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)ˣ`. -/ -@[simp] theorem rationalRayClassGroupEquivZModUnits_finitePrimeIdeleClass (m : ℕ) (hm : m ≠ 0) (q : Nat.Primes) (hq : ¬ q.1 ∣ m) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index 3e91f3b10d..27f3ee8e78 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -36,7 +36,7 @@ that original field, and obtain the genuine reciprocity equivalence `Gal(K^m / K) ≃ C_K / C_K^m`. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -51,6 +51,7 @@ 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 @@ -60,6 +61,7 @@ noncomputable abbrev rayClassFieldNormAmbient (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 @@ -69,6 +71,7 @@ noncomputable abbrev rayClassFieldBaseSubgroup (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 @@ -80,6 +83,7 @@ noncomputable abbrev rayClassFieldSubextension (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 @@ -89,6 +93,7 @@ noncomputable abbrev rayClassFieldBase (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`. -/ @@ -99,6 +104,7 @@ noncomputable abbrev rayClassField (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 @@ -108,6 +114,7 @@ noncomputable abbrev rayClassFieldBaseEquiv (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 @@ -118,6 +125,7 @@ def rayClassFieldTransportedCongruenceSubgroup (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 @@ -133,6 +141,7 @@ theorem rayClassField_ideleClassNorm_range (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 @@ -142,6 +151,7 @@ noncomputable abbrev rayClassFieldBaseAlgebraOverOriginal (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 @@ -151,6 +161,7 @@ noncomputable abbrev rayClassFieldBaseEquivOverOriginal (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 @@ -160,6 +171,7 @@ noncomputable abbrev rayClassFieldAlgebraOverOriginal (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] @@ -176,6 +188,7 @@ theorem rayClassField_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 @@ -184,6 +197,7 @@ noncomputable def rayClassFieldEmbedding 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 @@ -192,6 +206,7 @@ noncomputable def rayClassFieldSubfield 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 @@ -201,6 +216,7 @@ theorem rayClassFieldSubfield_eq_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 @@ -212,6 +228,7 @@ theorem rayClassField_ideleClassNorm_range_over_original (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 @@ -229,6 +246,7 @@ theorem 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. -/ @@ -249,6 +267,7 @@ theorem rayClassField_ideleClassNorm_range_antitone (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 @@ -266,6 +285,7 @@ theorem rayClassField_nonempty_algHom_of_le (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 @@ -286,6 +306,7 @@ theorem rayClassFieldSubfield_mono 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. -/ @@ -306,6 +327,7 @@ theorem 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 @@ -333,6 +355,7 @@ theorem (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 @@ -354,6 +377,7 @@ theorem (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 @@ -368,6 +392,7 @@ theorem finiteAbelianExtension_exists_rayClassFieldEmbedding 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. -/ @@ -402,6 +427,7 @@ theorem ((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 @@ -424,6 +450,7 @@ noncomputable def 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] @@ -438,10 +465,10 @@ theorem (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`. -/ -@[simp] theorem rayClassFieldGaloisContinuousMulEquivRayClassGroup_globalNormResidue (m : RayClass.Modulus K) @@ -458,6 +485,7 @@ theorem (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 @@ -482,6 +510,7 @@ theorem rayClassField_finrank_eq_rayClassGroup_card 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 @@ -492,6 +521,7 @@ noncomputable abbrev rayClassFieldGaloisEquivRayClassGroup (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 @@ -501,6 +531,7 @@ noncomputable def rayClassSubgroupFixedField 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 @@ -510,6 +541,7 @@ noncomputable def rayClassSubgroupSubfield (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) @@ -525,6 +557,7 @@ noncomputable def rayClassSubgroupSubextension (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 @@ -537,6 +570,7 @@ noncomputable def rayClassSubgroupFixedFieldArtin (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 @@ -549,6 +583,7 @@ theorem rayClassSubgroupFixedFieldArtin_surjective 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) @@ -568,6 +603,7 @@ theorem rayClassSubgroupFixedFieldArtin_ker · 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 @@ -579,6 +615,7 @@ private theorem rayClassGroup_mul_comm 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. -/ @@ -590,6 +627,7 @@ private def rayClassGroupInvHom (m : RayClass.Modulus K) : 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. -/ @@ -606,6 +644,7 @@ noncomputable def rayClassSubgroupArtin ((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) @@ -622,6 +661,7 @@ theorem rayClassSubgroupArtin_surjective (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) @@ -643,6 +683,7 @@ theorem rayClassSubgroupArtin_ker · 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. -/ @@ -670,9 +711,9 @@ theorem rayClassSubgroupSubextension_norm_range _ = (_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. -/ -@[simp] theorem rayClassFieldGaloisEquivRayClassGroup_globalNormResidue (m : RayClass.Modulus K) (c : IdeleClassGroup K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean index d62b59ed5c..aa21c091fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean @@ -16,8 +16,7 @@ to a smaller one. The public ray-class groups use the comparison equivalence to transport this map. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace ClassFieldTheory @@ -26,14 +25,21 @@ 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) : @@ -44,6 +50,7 @@ def originalRayClassModulusProjection (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) : @@ -54,6 +61,7 @@ theorem originalRayClassModulusProjection_surjective 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 @@ -67,6 +75,7 @@ noncomputable def rayClassModulusProjection ((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) @@ -79,6 +88,7 @@ theorem rayClassModulusProjection_apply (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) : @@ -111,6 +121,7 @@ theorem rayClassModulusProjection_surjective _ = 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 @@ -143,6 +154,7 @@ theorem rayClassModulusProjection_prime 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean index f4f005af89..baf0b3dac2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean @@ -105,7 +105,6 @@ theorem idealRayProjection_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. -/ -@[simp] theorem rayClassGroupEquivIdeleQuotient_mk_mk (m : RayClass.Modulus K) (a : IdeleGroup K) : @@ -127,7 +126,6 @@ theorem rayClassGroupEquivIdeleQuotient_mk_mk /-- 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. -/ -@[simp] theorem rayClassGroupEquivIdealRayClassGroup_mk_primeTo (m : RayClass.Modulus K) (a : RayClass.idelePrimeToModulusSubgroup m) : @@ -166,7 +164,6 @@ variable {K : Type} [Field K] [NumberField K] 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. -/ -@[simp] theorem idealArtinMap_primeToIdealMap (m : RayClass.Modulus K) (N : Subgroup (IdeleClassGroup K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean index dca3435379..c4580d6342 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean @@ -13,12 +13,12 @@ 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. -/ -open scoped NumberField Classical - +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean index 647a37b949..6dbbe01b80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean @@ -14,7 +14,7 @@ Arithmetic reciprocity on a ray-class fixed field agrees, at each ordinary prime idèle, with the arithmetic global Artin symbol of that field. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -23,6 +23,7 @@ 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] @@ -41,6 +42,7 @@ private theorem arithmeticFinitePlacePrimeArtin_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) : @@ -51,6 +53,7 @@ private theorem rayClassFieldGaloisEquivRayClassGroup_symm_mk 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) @@ -78,6 +81,7 @@ private theorem rayClassField_arithmeticFinitePlacePrimeArtin 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) @@ -120,6 +124,7 @@ private theorem rayClassSubgroup_restrict_transport _ = 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean index deba601152..966006f35d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean @@ -18,13 +18,14 @@ compares the given map and genuine global reciprocity at a common multiple of the given modulus and the extension's full conductor. -/ -open scoped Classical NumberField IsMulCommutative +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) := @@ -32,6 +33,7 @@ private theorem rayRigidity_ideleClassGroupIsMulCommutative 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 @@ -105,6 +107,7 @@ theorem rayModulus_isDefining_of_arithmeticPrimeArtinEquiv 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 @@ -155,6 +158,7 @@ theorem rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv 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. -/ @@ -221,6 +225,7 @@ theorem rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean index 4553c084be..9a81aceca6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean @@ -14,7 +14,7 @@ ray class group. This follows from factorization of prime-to-modulus fractional ideals and the idelic-to-ideal ray-class equivalence. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -23,6 +23,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index d50d8c88be..33221a8c92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -26,7 +26,7 @@ These are the two concrete cardinal ingredients in the class-field existence argument. -/ -open scoped NumberField Classical BigOperators +open scoped NumberField BigOperators noncomputable section @@ -39,6 +39,7 @@ 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 @@ -73,6 +74,7 @@ theorem even_or_no_realInfinitePlace_of_primitiveRoots 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. -/ @@ -86,6 +88,7 @@ noncomputable def sUnitKummerNormSupport (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 @@ -96,6 +99,7 @@ theorem subset_sUnitKummerNormSupport 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. -/ @@ -124,6 +128,7 @@ theorem valuation_natCast_eq_one_of_not_mem_sUnitKummerNormSupport 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 @@ -143,6 +148,7 @@ theorem mem_sUnitKummerNormSupport_of_asIdeal_dvd_natCast (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 @@ -164,6 +170,7 @@ theorem supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top (Finset.mem_union_right _ hv) · exact le_rfl +open scoped Classical in /-- On the chosen Kummer norm support, the principal part of the local power subgroup consists exactly of powers of `S`-units. -/ theorem @@ -398,6 +405,7 @@ theorem 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 @@ -472,6 +480,7 @@ theorem card_ideleClassPowerLocalUnitQuotient_on_kummerNormSupport (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean index 8c5cb4089f..2d62e1a6b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean @@ -20,8 +20,7 @@ from the independently computed quotient cardinal and the global norm-residue index formula. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -33,6 +32,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean index 01bd0e544c..b7d7a20b7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean @@ -185,7 +185,6 @@ noncomputable def /-- The big-to-small Hilbert quotient transition sends the class of an idele class to the same class modulo the larger norm subgroup. -/ -@[simp] theorem bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient_mk (x : IdeleClassGroup K) : bigHilbertClassFieldQuotientToSmallHilbertClassFieldQuotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index fd11202e1b..348f23b0a0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -21,7 +21,7 @@ that of the selected class field. Arithmetic global reciprocity then gives the Artin map, with its prime normalization obtained from the prime idèle. -/ -open scoped Classical NumberField IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain noncomputable section @@ -30,10 +30,14 @@ 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 /-- All intrinsic small Hilbert class fields have the selected field's actual idèle-class norm subgroup. -/ theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall @@ -50,6 +54,7 @@ theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_ideleClassNorm_range_over_original (K := K) +open scoped Classical in private noncomputable def arithmeticHilbertClassGroupEquivOfNormRange (E : FiniteAbelianExtension K) (hNorm : (_root_.ideleClassNorm K E).range = @@ -71,20 +76,22 @@ private noncomputable def arithmeticHilbertClassGroupEquivOfNormRange (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 arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall +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 /-- 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) : - arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall E hE + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K E c) = GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup @@ -119,12 +126,13 @@ theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue hReciprocity _ = _ := rfl +open scoped Classical 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)) : - arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall E hE + arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin (K := K) (L := E) v) = ClassGroup.mk K (finitePrimeFractionalIdeal v) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean index a5509c52d3..a31e0bf6c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean @@ -66,7 +66,6 @@ noncomputable def smallHilbertClassFieldQuotientCongr /-- On representatives, the small-Hilbert quotient transport is induced by the existing transport of ordinary idele classes. -/ -@[simp] theorem smallHilbertClassFieldQuotientCongr_mk (e : K ≃ₐ[ℚ] M) (c : IdeleClassGroup K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean index e5206f6c68..f922dbcdca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean @@ -19,7 +19,7 @@ This is the scalar structure used by the final extension-of-ideals map in the principal ideal theorem. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -28,6 +28,7 @@ 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. -/ @@ -35,6 +36,7 @@ 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 : @@ -44,6 +46,7 @@ noncomputable def smallHilbertClassFieldBaseEquivOverOriginal : (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 : @@ -54,6 +57,7 @@ noncomputable instance smallHilbertClassFieldAlgebraOverOriginal : (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. -/ @@ -67,6 +71,7 @@ theorem smallHilbertClassField_algebraMap_original (smallHilbertClassFieldBaseEquiv (K := K) x) := rfl +open scoped Classical in /-- The canonical fixed-field copy has degree one over the original number field. -/ noncomputable instance @@ -75,6 +80,7 @@ noncomputable instance (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. -/ @@ -84,6 +90,7 @@ noncomputable instance smallHilbertClassFieldScalarTowerOverOriginal : (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 @@ -93,6 +100,7 @@ noncomputable instance (smallHilbertClassFieldBase K) (smallHilbertClassField K) +open scoped Classical in /-- The canonical fixed-field copy has relative degree one over the original number field. -/ @[simp] @@ -102,6 +110,7 @@ theorem smallHilbertClassFieldBase_finrank_over_original : (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 : @@ -122,6 +131,7 @@ theorem smallHilbertClassField_finrank_over_original_eq_classNumber : 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. -/ @@ -162,6 +172,7 @@ noncomputable instance smallHilbertClassFieldIsGaloisOverOriginal : (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean index 93089b0843..49a7a36f0c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean @@ -228,7 +228,6 @@ def smallHilbertClassFieldQuotientToIdeleClassNormQuotient /-- The small-Hilbert quotient transition sends an idele class to the same class modulo the actual norm subgroup. -/ -@[simp] theorem smallHilbertClassFieldQuotientToIdeleClassNormQuotient_mk [_root_.IsUnramifiedAtInfinitePlaces K L] (hunramifiedFinite : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean index 246f1607ba..338c1a7011 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean @@ -24,8 +24,7 @@ decomposition law: the prime Artin element is trivial exactly when the place splits completely. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -39,6 +38,7 @@ variable [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 @@ -47,6 +47,7 @@ def finitePlacePrimeArtin 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] @@ -59,6 +60,7 @@ theorem finitePlacePrimeArtin_eq_chosenFinitePlaceArtin 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 @@ -99,6 +101,7 @@ theorem 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. -/ @@ -137,6 +140,7 @@ theorem (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 @@ -172,6 +176,7 @@ theorem ← 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 @@ -209,6 +214,7 @@ theorem _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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean index 8930ae467d..96b78f1ce9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean @@ -23,8 +23,7 @@ corresponding prime class in the global idèle-class norm quotient, so the order of the global class divides the local degree. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -32,6 +31,7 @@ namespace GlobalClassFields open NumberField IsDedekindDomain +open scoped Classical in private theorem unramifiedPrimeNormClassGroupIsMulCommutative (F : Type) [Field F] [NumberField F] : IsMulCommutative (IdeleClassGroup F) := @@ -48,6 +48,7 @@ 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 @@ -58,6 +59,7 @@ def finitePlacePrimeNormClass (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. -/ @@ -87,6 +89,7 @@ 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] @@ -122,6 +125,7 @@ theorem (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 @@ -140,6 +144,7 @@ theorem orderOf_finitePlacePrimeNormClass_dvd_finitePlaceLocalDegree (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 @@ -199,6 +204,7 @@ theorem (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 @@ -219,6 +225,7 @@ theorem (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean index 658480f425..f2689abb46 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean @@ -19,8 +19,7 @@ ordinary prime ideal to arithmetic Frobenius, has the genuine idèle norm kernel, and induces the canonical ideal class-field isomorphism. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -37,6 +36,7 @@ variable attribute [local instance] ideleClassSubgroupNormal idealArtinKernelNormal +open scoped Classical in /-- The genuine Galois-valued ideal Artin map in arithmetic Frobenius normalization. -/ noncomputable def arithmeticIdealArtinGaloisMap @@ -51,6 +51,7 @@ noncomputable def arithmeticIdealArtinGaloisMap (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] @@ -68,9 +69,9 @@ theorem arithmeticIdealArtinGaloisMap_apply ((_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. -/ -@[simp] theorem arithmeticIdealArtinGaloisMap_eq_inv_idealArtinGaloisMap (m : RayClass.Modulus K) (hm : @@ -86,6 +87,7 @@ theorem arithmeticIdealArtinGaloisMap_eq_inv_idealArtinGaloisMap Reciprocity.globalNormResidueContinuousMulEquiv_apply, idealArtinGaloisMap_apply] +open scoped Classical in /-- The arithmetic ideal Artin map is surjective. -/ theorem arithmeticIdealArtinGaloisMap_surjective (m : RayClass.Modulus K) @@ -100,6 +102,7 @@ theorem arithmeticIdealArtinGaloisMap_surjective (idealArtinMap_surjective m ((_root_.ideleClassNorm K L).range) hm) +open scoped Classical in /-- Arithmetic normalization leaves the defining ideal group unchanged. -/ @[simp] @@ -128,6 +131,7 @@ theorem arithmeticIdealArtinGaloisMap_ker · 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 @@ -144,9 +148,9 @@ noncomputable def arithmeticIdealClassQuotientEquivGaloisGroup (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. -/ -@[simp] theorem arithmeticIdealClassQuotientEquivGaloisGroup_mk (m : RayClass.Modulus K) (hm : @@ -162,6 +166,7 @@ theorem arithmeticIdealClassQuotientEquivGaloisGroup_mk (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 @@ -191,6 +196,7 @@ theorem (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 @@ -214,6 +220,7 @@ theorem 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 @@ -233,6 +240,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean index 07c32a5cb3..cdd329f200 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean @@ -16,8 +16,7 @@ reciprocity map, while the image of an ordinary prime ideal is the genuine arithmetic Frobenius automorphism. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -31,6 +30,7 @@ variable [Field L] [NumberField L] [Algebra K L] [IsAbelianGalois K L] +open scoped Classical 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. -/ @@ -58,6 +58,7 @@ theorem 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 @@ -83,6 +84,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean index 1d1ffd01ce..32a3053c09 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean @@ -55,7 +55,6 @@ def rayClassToNormQuotient /-- The ray-class quotient map sends the class of an idele class to its class modulo the norm subgroup. -/ -@[simp] theorem rayClassToNormQuotient_mk (m : RayClass.Modulus K) (N : Subgroup (IdeleClassGroup K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean index b3e21ecadb..13c383c519 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean @@ -58,7 +58,6 @@ noncomputable def idealClassQuotientEquivNormQuotient /-- The ideal class-field equivalence sends a quotient representative to its ideal Artin image. -/ -@[simp] theorem idealClassQuotientEquivNormQuotient_mk (m : RayClass.Modulus K) (N : Subgroup (IdeleClassGroup K)) @@ -109,7 +108,6 @@ noncomputable def idealClassQuotientEquivGaloisGroup /-- On a representative ideal, the actual ideal class-field isomorphism evaluates to the genuine Galois-valued ideal Artin map. -/ -@[simp] theorem idealClassQuotientEquivGaloisGroup_mk (m : RayClass.Modulus K) (hm : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean index 81b7364931..20e537204f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean @@ -25,7 +25,7 @@ to give the complete decomposition law: are related by the global ideal decomposition law. -/ -open scoped NumberField Classical BigOperators +open scoped NumberField BigOperators noncomputable section @@ -43,6 +43,7 @@ variable 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. @@ -74,6 +75,7 @@ theorem idealArtinGaloisMap_primeToIdealMap_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 @@ -97,6 +99,7 @@ theorem idealArtinGaloisMap_primeIdeal_eq_finitePlacePrimeArtin 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. -/ @@ -116,6 +119,7 @@ theorem idealArtinGaloisMap_primeIdeal_eq_chosenFinitePlaceArtin 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 @@ -137,6 +141,7 @@ theorem idealClassQuotientEquivGaloisGroup_primeIdeal 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 @@ -171,6 +176,7 @@ theorem ramificationIndex_eq_one_of_chosenFinitePlaceUnramified 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 @@ -238,6 +244,7 @@ theorem finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified _ = 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. -/ @@ -287,6 +294,7 @@ theorem orderOf_idealPrimeClass_eq_inertiaDegree_of_chosenUnramified 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 @@ -309,6 +317,7 @@ theorem unramifiedPrime_pow_mem_idealArtinKernel_iff_inertiaDegree_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 @@ -335,6 +344,7 @@ theorem unramifiedPrime_numberOfPrimes_eq_extensionDegree_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 @@ -360,6 +370,7 @@ theorem unramifiedPrime_idealMap_eq_product_primesOver (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 @@ -381,6 +392,7 @@ theorem primeAbove_inertiaDegree_eq_common (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. -/ @@ -408,6 +420,7 @@ theorem unramifiedPrime_numberOfPrimes_eq_extensionDegree_div_idealClassOrder 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 @@ -455,6 +468,7 @@ 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. -/ @@ -479,6 +493,7 @@ theorem 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. -/ @@ -502,6 +517,7 @@ theorem smallHilbertClassField_chosenFinitePlaceIsUnramified 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean index 5c280a2261..b2e51eabb4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean @@ -15,8 +15,7 @@ The general unramified Galois identity `r * f = n` belongs to `RamificationTheory.HilbertRamification.Dedekind.Basic`. -/ -open scoped NumberField Classical - +open scoped NumberField noncomputable section namespace GlobalClassFieldTheory @@ -29,6 +28,7 @@ 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. -/ @@ -42,6 +42,7 @@ def idealFrobeniusClass 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 @@ -59,6 +60,7 @@ theorem orderOf_idealFrobeniusClass (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. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean index f42884568c..e8c50967b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -19,7 +19,7 @@ corresponding quotient, and states the unramified decomposition law entirely in terms of this norm-defined ideal group. -/ -open scoped NumberField Classical IsMulCommutative +open scoped NumberField IsMulCommutative noncomputable section @@ -37,6 +37,7 @@ variable 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 @@ -51,6 +52,7 @@ theorem arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup 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 @@ -72,6 +74,7 @@ theorem arithmeticIdealArtinGaloisMap_eq_one_iff_mem_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 @@ -89,6 +92,7 @@ theorem arithmeticIdealArtin_norm_exact ⟨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`. @@ -113,9 +117,9 @@ noncomputable def idealNormQuotientEquivIdeleClassNormQuotient ((_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. -/ -@[simp] theorem idealNormQuotientEquivIdeleClassNormQuotient_mk (m : RayClass.Modulus K) (hm : @@ -156,6 +160,7 @@ theorem idealNormQuotientEquivIdeleClassNormQuotient_mk 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 @@ -177,9 +182,9 @@ noncomputable def arithmeticIdealNormQuotientArtinMap 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. -/ -@[simp] theorem arithmeticIdealNormQuotientArtinMap_mk (m : RayClass.Modulus K) (hm : @@ -195,6 +200,7 @@ theorem arithmeticIdealNormQuotientArtinMap_mk (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 @@ -229,6 +235,7 @@ theorem arithmeticIdealNormQuotientArtinMap_injective 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 @@ -250,6 +257,7 @@ theorem arithmeticIdealNormQuotientArtinMap_surjective 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 @@ -277,6 +285,7 @@ theorem arithmeticIdealNormQuotientArtinMap_eq_normResidue 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)`. @@ -298,9 +307,9 @@ noncomputable def arithmeticIdealNormQuotientEquivGaloisGroup ⟨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. -/ -@[simp] theorem arithmeticIdealNormQuotientEquivGaloisGroup_mk (m : RayClass.Modulus K) (hm : @@ -316,6 +325,7 @@ theorem arithmeticIdealNormQuotientEquivGaloisGroup_mk (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 @@ -336,6 +346,7 @@ theorem arithmeticIdealNormQuotientEquivGaloisGroup_eq_normResidue 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 @@ -361,6 +372,7 @@ theorem 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 @@ -385,6 +397,7 @@ theorem 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 @@ -416,6 +429,7 @@ theorem unramifiedPrime_idealNormDecompositionLaw unramifiedPrime_idealDecompositionLaw (K := K) (L := L) m hm v hv hunram +open scoped Classical 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 @@ -469,6 +483,7 @@ variable [Field L] [NumberField L] [Algebra K L] [IsAbelianGalois K L] +open scoped Classical 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 @@ -485,6 +500,7 @@ theorem arithmeticIdealArtin_ker_eq_norm_range_sup_ray_principal (GlobalClassFieldTheory.IdealClassFieldTheory.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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean index 970d0bd5dd..3567d6dcb9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean @@ -69,7 +69,6 @@ noncomputable def smallHilbertClassFieldIdeleExtensionMap : omit [IsGalois K L] in /-- Evaluation of the small-Hilbert idele-extension map on a quotient representative. -/ -@[simp] theorem smallHilbertClassFieldIdeleExtensionMap_mk' (c : IdeleClassGroup K) : smallHilbertClassFieldIdeleExtensionMap K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean index 62660153f0..51692cd5ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -29,7 +29,7 @@ small Hilbert tower and transport it to genuine idèle-class extension and norm maps. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -44,18 +44,25 @@ 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 @@ -79,6 +86,7 @@ private theorem ideleClassExtension_range_le_of_intermediate 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 @@ -182,6 +190,7 @@ private theorem 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 @@ -261,6 +270,7 @@ private theorem 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] @@ -284,6 +294,7 @@ private noncomputable def (hKfinite := K₀.finite) (hHLfinite := hHMfinite) K₀.field H N.field hHK hMH c +open scoped Classical in private theorem smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement_proof : smallHilbertClassFieldCanonicalFiniteNormClassZeroStatement K := by @@ -322,6 +333,7 @@ private theorem (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] @@ -356,6 +368,7 @@ private noncomputable def (hHLfinite := hHMfinite) K₀.field H N.field hHK hMH hHKnormal hMHnormal c +open scoped Classical in private theorem smallHilbertClassFieldCanonicalNormMembershipStatement_proof : smallHilbertClassFieldCanonicalNormMembershipStatement K := by @@ -406,6 +419,7 @@ private theorem 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 @@ -505,10 +519,12 @@ private noncomputable abbrev (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] : Type where + (K : Type) [Field K] [NumberField K] : Prop where membership : smallHilbertClassFieldExplicitNormMembershipStatement K +open scoped Classical in private noncomputable def smallHilbertClassFieldExplicitNormMembershipData_proof : SmallHilbertClassFieldExplicitNormMembershipData K where @@ -564,6 +580,7 @@ private noncomputable def (hHfinite := hHfinite) (hHLfinite := hHMfinite) K₀.field H N.field hHK hMH hHKnormal hMHnormal c hmembership +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 @@ -576,6 +593,7 @@ noncomputable def smallHilbertClassFieldBaseSecondNormRangeContainment : Prop := 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. -/ @@ -605,6 +623,7 @@ theorem (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] @@ -613,10 +632,12 @@ noncomputable def smallHilbertClassFieldSecondNormRangeContainment : Prop := smallHilbertClassFieldNormSubgroup (K := smallHilbertClassField K) +open scoped Classical in private structure SmallHilbertClassFieldSecondNormRangeContainmentData - (K : Type) [Field K] [NumberField K] : Type where + (K : Type) [Field K] [NumberField K] : Prop where containment : smallHilbertClassFieldSecondNormRangeContainment K +open scoped Classical in private noncomputable def smallHilbertClassFieldSecondNormRangeContainmentData_proof : SmallHilbertClassFieldSecondNormRangeContainmentData K where @@ -634,6 +655,7 @@ private noncomputable def (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean index f3c6061fc8..cc56622914 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean @@ -260,7 +260,7 @@ structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeMembershipD [hHLfinite : Finite (H.toSubgroup ⧸ extensionSubgroup H L hLH)] (c : rationalFiniteNormTransferBaseIdeleClass - (hKfinite := hKfinite) K) : Type where + (hKfinite := hKfinite) K) : Prop where /-- The packaged finite-norm-representative membership proof. -/ membership : rationalFiniteNormTransferCanonicalFiniteNormRepresentativeAbsoluteNormMembership @@ -325,7 +325,7 @@ structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZer [hHLfinite : Finite (H.toSubgroup ⧸ extensionSubgroup H L hLH)] (c : rationalFiniteNormTransferBaseIdeleClass - (hKfinite := hKfinite) K) : Type where + (hKfinite := hKfinite) K) : Prop where /-- The packaged quotient-zero equality. -/ equality : rationalFiniteNormTransferCanonicalFiniteNormRepresentativeQuotientZero @@ -395,7 +395,7 @@ structure RationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZeroD [hHLfinite : Finite (H.toSubgroup ⧸ extensionSubgroup H L hLH)] (c : rationalFiniteNormTransferBaseIdeleClass - (hKfinite := hKfinite) K) : Type where + (hKfinite := hKfinite) K) : Prop where /-- The packaged target-zero equality. -/ equality : rationalFiniteNormTransferCanonicalFiniteNormRepresentativeTargetZero @@ -422,7 +422,7 @@ structure RationalFiniteNormTransferCanonicalAbsoluteNormMembershipData [hHLfinite : Finite (H.toSubgroup ⧸ extensionSubgroup H L hLH)] (c : rationalFiniteNormTransferBaseIdeleClass - (hKfinite := hKfinite) K) : Type where + (hKfinite := hKfinite) K) : Prop where /-- The packaged absolute norm-membership proof. -/ membership : rationalFiniteNormTransferCanonicalOrdinaryExtensionAbsoluteNormMembership @@ -449,7 +449,7 @@ structure RationalFiniteNormTransferCanonicalNormMembershipData [hHLfinite : Finite (H.toSubgroup ⧸ extensionSubgroup H L hLH)] (c : rationalFiniteNormTransferBaseIdeleClass - (hKfinite := hKfinite) K) : Type where + (hKfinite := hKfinite) K) : Prop where /-- The packaged relative norm-membership proof. -/ membership : rationalFiniteNormTransferCanonicalOrdinaryExtensionNormMembership diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean index 44e556ea5a..fe283d9455 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean @@ -27,7 +27,7 @@ then gives the class-group, integral-ideal, and fractional-ideal forms of principalization over the original number field. -/ -open scoped Classical IsMulCommutative NumberField +open scoped IsMulCommutative NumberField noncomputable section @@ -40,20 +40,29 @@ 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 - smallHilbertPrincipalization_smallHilbertQuotientGroup + smallHilbertPrincipalizationSmallHilbertQuotientGroup {F : Type} [Field F] [NumberField F] : Group (IdeleClassGroup F ⧸ @@ -61,17 +70,25 @@ local instance 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 - smallHilbertPrincipalization_smallHilbertQuotientOne + smallHilbertPrincipalizationSmallHilbertQuotientOne {F : Type} [Field F] [NumberField F] : One (IdeleClassGroup F ⧸ smallHilbertClassFieldNormSubgroup (K := F)) := - ⟨(smallHilbertPrincipalization_smallHilbertQuotientGroup + ⟨(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)) : @@ -112,6 +129,7 @@ private theorem smallHilbertClassFieldIdeleExtensionMap_apply_eq_one (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. -/ @@ -135,6 +153,7 @@ theorem smallHilbertClassFieldIdeleExtensionMap_eq_one : 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 @@ -166,6 +185,7 @@ private theorem smallHilbertClassFieldClassGroupExtension_apply_eq_one (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 @@ -183,6 +203,7 @@ theorem smallHilbertClassFieldClassGroupExtension_eq_one : 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 : @@ -195,6 +216,7 @@ theorem allIdealsBecomePrincipalInSmallHilbertClassField : (𝓞 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean index f4aa7e6c17..1b5a07e06d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -24,7 +24,7 @@ conjugate closed subgroup rather than over the first-stage subgroup itself. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -40,6 +40,7 @@ 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] @@ -50,6 +51,7 @@ private noncomputable def smallHilbertTowerIdeleClassCommGroup 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) : @@ -57,6 +59,7 @@ private theorem addSubgroup_comap_symm_eq_map 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] @@ -75,6 +78,7 @@ variable (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (L : FiniteAbelianSubextension K.field) +open scoped Classical in private noncomputable abbrev smallHilbertTowerMiddleFiniteAbstractField : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := @@ -102,6 +106,7 @@ local notation "E" => local notation "N" => smallHilbertClassFieldNormAmbient E +open scoped Classical in private noncomputable instance smallHilbertTowerMiddleAbstractQuotientFinite : Finite @@ -113,17 +118,20 @@ private noncomputable instance 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. -/ @@ -136,6 +144,7 @@ noncomputable def smallHilbertTowerMiddleNormSubgroup : 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 : @@ -149,6 +158,7 @@ theorem smallHilbertTowerMiddleNormSubgroup_eq_map : (rationalAbstractFixedFieldIdeleClassEquivFixed L.field (hfinite := smallHilbertTowerMiddleAbstractQuotientFinite K L)) +open scoped Classical in @[reducible] private noncomputable def smallHilbertTowerNormAmbientAlgebra : @@ -159,6 +169,7 @@ private noncomputable def attribute [local instance] smallHilbertTowerNormAmbientAlgebra +open scoped Classical in @[reducible] private noncomputable def smallHilbertTowerNormAmbientSMul : @@ -166,6 +177,7 @@ private noncomputable def Algebra.toSMul (self := smallHilbertTowerNormAmbientAlgebra K L) +open scoped Classical in @[reducible] private noncomputable def smallHilbertTowerNormAmbientModule : @@ -173,6 +185,7 @@ private noncomputable def @Algebra.toModule E N _ _ (smallHilbertTowerNormAmbientAlgebra K L) +open scoped Classical in private theorem smallHilbertTowerNormAmbientScalarTower : @IsScalarTower ℚ E N @@ -184,6 +197,7 @@ private theorem (RingHom.ext_rat (algebraMap ℚ N) ((algebraMap E N).comp (algebraMap ℚ E))) +open scoped Classical in private noncomputable def smallHilbertTowerNormAmbientAlgHom : E →ₐ[ℚ] N := @@ -194,12 +208,14 @@ private noncomputable def ((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 @@ -212,6 +228,7 @@ private theorem attribute [local instance] smallHilbertTowerNormAmbientIsGalois +open scoped Classical in private noncomputable def smallHilbertNormNeighborhoodForwardAlignment : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := by @@ -225,6 +242,7 @@ private noncomputable def (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. -/ @@ -233,6 +251,7 @@ private noncomputable def SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ := (smallHilbertNormNeighborhoodForwardAlignment K L).symm +open scoped Classical in @[simp] private theorem smallHilbertNormNeighborhoodForwardAlignment_apply (x : E) : @@ -258,6 +277,7 @@ private theorem smallHilbertNormNeighborhoodForwardAlignment_apply 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 ℚ`. -/ @@ -267,6 +287,7 @@ private noncomputable def (smallHilbertNormNeighborhoodAlignment K L).toAlgHom.comp (numberFieldSeparableClosureEmbedding N) +open scoped Classical in @[simp] private theorem smallHilbertNormNeighborhoodEmbedding_algebraMap (x : E) : @@ -282,6 +303,7 @@ private theorem smallHilbertNormNeighborhoodEmbedding_algebraMap exact (smallHilbertNormNeighborhoodForwardAlignment K L).symm_apply_apply _ +open scoped Classical in private abbrev smallHilbertNormNeighborhoodEmbeddedBase : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := @@ -290,6 +312,7 @@ private abbrev smallHilbertNormNeighborhoodEmbeddedBase : ((smallHilbertNormNeighborhoodEmbedding K L).comp (smallHilbertTowerNormAmbientAlgHom K L))) +open scoped Classical in private abbrev smallHilbertNormNeighborhoodEmbeddedField : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) := @@ -297,6 +320,7 @@ private abbrev smallHilbertNormNeighborhoodEmbeddedField : (AlgHom.fieldRange (smallHilbertNormNeighborhoodEmbedding K L)) +open scoped Classical in private theorem smallHilbertNormNeighborhoodEmbeddedField_le_base : (smallHilbertNormNeighborhoodEmbeddedField K L).toSubgroup ≤ (smallHilbertNormNeighborhoodEmbeddedBase K L).toSubgroup := by @@ -315,6 +339,7 @@ private theorem smallHilbertNormNeighborhoodEmbeddedField_le_base : (smallHilbertTowerNormAmbientAlgHom K L) (smallHilbertNormNeighborhoodEmbedding K L) +open scoped Classical in private theorem smallHilbertNormNeighborhoodEmbeddedBase_eq : smallHilbertNormNeighborhoodEmbeddedBase K L = L.field := by have hi : @@ -338,6 +363,7 @@ private theorem smallHilbertNormNeighborhoodEmbeddedBase_eq : closedFixingSubgroup_abstractFixedField_eq ℚ (SeparableClosure ℚ) L.field +open scoped Classical in private noncomputable def smallHilbertNormNeighborhoodSeparableClosureEquiv : let j := smallHilbertNormNeighborhoodEmbedding K L @@ -359,6 +385,7 @@ private noncomputable def IsSepClosure.equiv E (SeparableClosure E) (SeparableClosure ℚ) +open scoped Classical in private noncomputable def smallHilbertFiniteGaloisNormNeighborhoodRaw : FiniteGaloisSubextension @@ -399,6 +426,7 @@ private noncomputable def closedFixingSubgroup ℚ (SeparableClosure ℚ) (j.comp f).fieldRange) hi exact hB ▸ raw +open scoped Classical in private noncomputable def rebaseFiniteGaloisSubextension {G : Type} [Group G] [TopologicalSpace G] {B B' : ClosedSubgroup G} (h : B = B') @@ -406,6 +434,7 @@ private noncomputable def rebaseFiniteGaloisSubextension FiniteGaloisSubextension B' := h ▸ P +open scoped Classical in @[simp] private theorem rebaseFiniteGaloisSubextension_field {G : Type} [Group G] [TopologicalSpace G] @@ -415,6 +444,7 @@ private theorem rebaseFiniteGaloisSubextension_field cases h rfl +open scoped Classical in private theorem rebaseRationalFiniteGaloisSubextension_fixedField_eq {B B' : ClosedSubgroup @@ -427,6 +457,7 @@ private theorem 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. -/ @@ -436,6 +467,7 @@ noncomputable def smallHilbertFiniteGaloisNormNeighborhood : (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 : @@ -445,6 +477,7 @@ noncomputable def smallHilbertFiniteGaloisNormNeighborhoodNormSubgroup : (smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup rationalIdeleClassRepresentation +open scoped Classical in private noncomputable abbrev smallHilbertFiniteGaloisNormNeighborhoodTopField : Type := abstractRelativeFixedField ℚ (SeparableClosure ℚ) @@ -453,6 +486,7 @@ private noncomputable abbrev local notation "E₂" => smallHilbertFiniteGaloisNormNeighborhoodTopField K L +open scoped Classical in private noncomputable instance smallHilbertFiniteGaloisNormNeighborhoodQuotientFinite : Finite @@ -462,6 +496,7 @@ private noncomputable instance (smallHilbertFiniteGaloisNormNeighborhood K L).below) := (smallHilbertFiniteGaloisNormNeighborhood K L).finite +open scoped Classical in private noncomputable instance smallHilbertFiniteGaloisNormNeighborhoodFiniteDimensional : FiniteDimensional E E₂ := @@ -471,21 +506,25 @@ private noncomputable instance (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₂ := @@ -495,6 +534,7 @@ private noncomputable instance (smallHilbertFiniteGaloisNormNeighborhood K L).below (smallHilbertFiniteGaloisNormNeighborhood K L).normal +open scoped Classical in private theorem smallHilbertFiniteGaloisNormNeighborhood_fixedField_eq_range : (abstractRelativeFixedField ℚ (SeparableClosure ℚ) @@ -515,6 +555,7 @@ private theorem (AlgHom.fieldRange (smallHilbertNormNeighborhoodEmbedding K L)) +open scoped Classical in private noncomputable def smallHilbertFiniteGaloisNormNeighborhoodTopEquiv : N ≃ₐ[ℚ] @@ -525,7 +566,7 @@ private noncomputable def (smallHilbertFiniteGaloisNormNeighborhood_fixedField_eq_range K L).symm) -@[simp] +open scoped Classical in private theorem smallHilbertFiniteGaloisNormNeighborhoodTopEquiv_algebraMap (x : E) : @@ -540,6 +581,7 @@ private theorem (x : SeparableClosure ℚ) exact smallHilbertNormNeighborhoodEmbedding_algebraMap K L x +open scoped Classical in private noncomputable def smallHilbertFiniteGaloisNormNeighborhoodRelativeTopEquiv : N ≃ₐ[E] E₂ := { @@ -548,6 +590,7 @@ private noncomputable def smallHilbertFiniteGaloisNormNeighborhoodTopEquiv_algebraMap K L x } +open scoped Classical in private theorem smallHilbertFiniteGaloisNormNeighborhood_ordinaryNorm_le : (_root_.ideleClassNorm E N).range ≤ @@ -557,6 +600,7 @@ private theorem (K := E) (smallHilbertClassFieldNormSubgroup (K := E)) (smallHilbertClassFieldNormSubgroup_isClosed (K := E))) +open scoped Classical in private theorem smallHilbertFiniteGaloisNormNeighborhood_ordinaryNormRange_eq : (_root_.ideleClassNorm E N).range = @@ -567,6 +611,7 @@ private theorem (smallHilbertFiniteGaloisNormNeighborhoodRelativeTopEquiv K L)).symm +open scoped Classical in private theorem smallHilbertFiniteGaloisNormNeighborhood_abstractNormMap_eq : ((smallHilbertFiniteGaloisNormNeighborhood K L).normSubgroup @@ -591,6 +636,7 @@ private theorem (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. -/ @@ -606,6 +652,7 @@ private theorem (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 @@ -621,6 +668,7 @@ private theorem (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; @@ -652,6 +700,7 @@ theorem smallHilbertFiniteGaloisNormNeighborhood_normSubgroup_le : 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 : @@ -668,6 +717,7 @@ theorem smallHilbertNormSubgroupInRationalClassFormation_isNormOpen : 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 : @@ -683,6 +733,7 @@ noncomputable def secondSmallHilbertClassFieldSubextension : 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] @@ -702,12 +753,14 @@ theorem secondSmallHilbertClassFieldSubextension_normSubgroup : (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 @@ -717,6 +770,7 @@ private noncomputable instance (secondSmallHilbertClassFieldSubextension K L).below) := (secondSmallHilbertClassFieldSubextension K L).finite +open scoped Classical in private noncomputable instance secondSmallHilbertClassFieldTopFiniteDimensional : FiniteDimensional E T₂ := @@ -726,21 +780,25 @@ private noncomputable instance (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₂ := @@ -750,6 +808,7 @@ private noncomputable instance (secondSmallHilbertClassFieldSubextension K L).below (secondSmallHilbertClassFieldSubextension K L).normal +open scoped Classical in private theorem secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_actualNormRange : ((secondSmallHilbertClassFieldSubextension K L).normSubgroup @@ -774,6 +833,7 @@ private theorem (secondSmallHilbertClassFieldSubextension K L).below (secondSmallHilbertClassFieldSubextension K L).normal +open scoped Classical in private theorem secondSmallHilbertClassFieldSubextension_abstractNormMap_eq_smallHilbertNormSubgroup : ((secondSmallHilbertClassFieldSubextension K L).normSubgroup @@ -801,6 +861,7 @@ private theorem 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] @@ -814,6 +875,7 @@ theorem secondSmallHilbertClassFieldSubextension_ideleClassNorm_range : (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 : @@ -834,6 +896,7 @@ 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 : @@ -844,6 +907,7 @@ noncomputable def smallHilbertTowerSecondSubextension : (smallHilbertClassFieldNormAmbient K)) (smallHilbertClassFieldSubextension K) +open scoped Classical in /-- Exact norm-subgroup equation for the actual second stage. -/ @[simp] theorem smallHilbertTowerSecondSubextension_normSubgroup : @@ -858,6 +922,7 @@ theorem smallHilbertTowerSecondSubextension_normSubgroup : (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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 30c5ccaa14..13fc24c8e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -440,9 +440,11 @@ noncomputable local instance (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 - [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) : Algebra (abstractFixedField ℚ (SeparableClosure ℚ) @@ -527,7 +529,6 @@ noncomputable def numberFieldEmbeddedAbstractTopFieldEquiv /-- The two explicit fixed-field equivalences commute with the tower algebra maps. -/ -@[simp] theorem numberFieldEmbeddedAbstractFieldEquiv_algebraMap (j : L →ₐ[ℚ] SeparableClosure ℚ) (x : K) : @@ -630,7 +631,7 @@ private noncomputable def numberFieldEmbeddedFiniteNormClassPublicValue a) private noncomputable def numberFieldEmbeddedFiniteNormClassExpectedValue - [FiniteDimensional K L] [IsGalois K L] + (j : L →ₐ[ℚ] SeparableClosure ℚ) (a : ambientFixedAddSubgroup rationalIdeleClassRepresentation (numberFieldEmbeddedBaseSubgroup K L j)) : @@ -805,7 +806,6 @@ theorem /-- 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. -/ -@[simp] theorem numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass [FiniteDimensional K L] [IsGalois K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean index eef50d8d3f..ce68737f62 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean @@ -59,9 +59,9 @@ variable /-- Reuse the quotient topology chosen by topological global reciprocity. -/ local instance - arithmeticGlobalNormResidueAbelianization_galoisAbelianizationTopology : + arithmeticGlobalNormResidueAbelianizationGaloisAbelianizationTopology : TopologicalSpace (Abelianization (Gal(L / K))) := - topologicalGlobalNormResidueAbelianization_galoisAbelianizationTopology + topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology K L /-- The quotient topology above carries the quotient topological-group @@ -158,7 +158,6 @@ noncomputable def /-- The inverse of arithmetic reciprocity is literally the arithmetic global norm-residue symbol on every idèle class. -/ -@[simp] theorem arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv_symm_mk (c : IdeleClassGroup K) : @@ -270,7 +269,6 @@ noncomputable def arithmeticGlobalReciprocityContinuousMulEquiv : /-- Applying inverse arithmetic reciprocity to a quotient representative recovers the arithmetic norm-residue symbol. -/ -@[simp] theorem arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk (c : IdeleClassGroup K) : (arithmeticGlobalReciprocityContinuousMulEquiv K L).symm @@ -281,7 +279,6 @@ theorem arithmeticGlobalReciprocityContinuousMulEquiv_symm_mk /-- Arithmetic reciprocity sends the arithmetic norm-residue symbol of an idèle class to its literal representative in the norm quotient. -/ -@[simp] theorem arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue (c : IdeleClassGroup K) : arithmeticGlobalReciprocityContinuousMulEquiv K L @@ -405,7 +402,6 @@ theorem arithmeticGlobalArtinMonoidHom_apply /-- The arithmetic global Artin symbol of a finite one-place idèle is literally the arithmetic chosen local Artin symbol. -/ -@[simp] theorem arithmeticGlobalArtinMonoidHom_finitePlaceIdele (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) : @@ -419,7 +415,6 @@ theorem arithmeticGlobalArtinMonoidHom_finitePlaceIdele 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. -/ -@[simp] theorem arithmeticGlobalArtinMonoidHom_infinitePlaceIdele (v : InfinitePlace K) (x : v.Completionˣ) : @@ -431,7 +426,6 @@ theorem arithmeticGlobalArtinMonoidHom_infinitePlaceIdele arithmeticChosenInfinitePlaceArtinMonoidHom_apply] /-- Arithmetic global Artin kills every principal idèle. -/ -@[simp] theorem arithmeticGlobalArtinMonoidHom_principalIdele (x : Kˣ) : arithmeticGlobalArtinMonoidHom K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean index c3d75532a4..6400d45baf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -14,7 +14,7 @@ then transports the special overextension computation through global norm-residue naturality. -/ -open scoped Classical IsMulCommutative +open scoped IsMulCommutative open NumberField open IdeleGroup @@ -31,12 +31,16 @@ variable [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 @@ -55,6 +59,7 @@ noncomputable def ramifiedInfinitePlaceRealFixedPlace (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 @@ -111,6 +116,7 @@ theorem ramifiedInfinitePlaceRealFixedPlace_isReal · 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 @@ -152,6 +158,7 @@ theorem infinitePlaceBelow_ramifiedInfinitePlaceRealFixedPlace (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 @@ -180,6 +187,7 @@ theorem (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 @@ -233,6 +241,7 @@ theorem 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. -/ @@ -258,6 +267,7 @@ theorem 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 @@ -274,6 +284,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionRestriction (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. -/ @@ -339,6 +350,7 @@ theorem ramifiedInfinitePlaceOverextensionRestriction_conjugation (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 @@ -358,6 +370,7 @@ noncomputable def (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 @@ -377,6 +390,7 @@ theorem (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 @@ -474,6 +488,7 @@ theorem _ = 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 @@ -563,6 +578,7 @@ theorem 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) : @@ -570,6 +586,7 @@ noncomputable def ramifiedInfinitePlaceGlobalNormResidueNegOneValue 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) : @@ -577,6 +594,7 @@ noncomputable def ramifiedInfinitePlaceLocalArtinNegOneValue 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 @@ -590,6 +608,7 @@ noncomputable def (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 @@ -603,6 +622,7 @@ theorem 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) @@ -618,6 +638,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionNegOneIdeleClass (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 @@ -639,6 +660,7 @@ noncomputable def (ramifiedInfinitePlaceOverextensionNegOneIdeleClass (K := K) (L := L) v hRamified) +open scoped Classical in /-- The upper norm-residue value after actual Galois restriction. -/ noncomputable def ramifiedInfinitePlaceRestrictedOverextensionNormResidueNegOneValue @@ -651,6 +673,7 @@ noncomputable def (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 @@ -667,6 +690,7 @@ noncomputable def (ramifiedInfinitePlaceOverextensionNegOneIdeleClass (K := K) (L := L) v hRamified)) +open scoped Classical in private theorem ramifiedInfinitePlace_normResidueDiamond_neg_one (v : InfinitePlace K) (hRamified : @@ -691,6 +715,7 @@ private theorem ramifiedInfinitePlace_normResidueDiamond_neg_one (K := K) (L := L) v hRamified) omit [FiniteDimensional K L] in +open scoped Classical in private theorem ramifiedInfinitePlace_restrictedOverextensionNormResidue_neg_one (v : InfinitePlace K) @@ -708,6 +733,7 @@ private theorem ramifiedInfinitePlaceOverextension_globalNormResidueOfEmbedding_neg_one, ramifiedInfinitePlaceOverextensionRestriction_conjugation] +open scoped Classical in private theorem ramifiedInfinitePlace_normedNormResidue_neg_one (v : InfinitePlace K) (hRamified : @@ -733,6 +759,7 @@ private theorem ramifiedInfinitePlace_normedNormResidue_neg_one 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. @@ -741,7 +768,6 @@ 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. -/ -@[simp] theorem globalNormResidueMonoidHom_infinitePlaceIdeleClass_neg_one_of_ramified (v : InfinitePlace K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean index 1074936fdc..301347cf6f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -12,7 +12,7 @@ This module realizes the embedded field `L(i)` inside `ℂ`, constructs its complex place, and identifies ambient complex conjugation on that field. -/ -open scoped Classical IsMulCommutative +open scoped IsMulCommutative open NumberField noncomputable section @@ -27,6 +27,7 @@ variable [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 @@ -56,6 +57,7 @@ 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 @@ -65,6 +67,9 @@ def infinitePlaceComplexificationOverfield (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 @@ -75,6 +80,9 @@ noncomputable local instance (infinitePlaceComplexificationOverfield (K := K) (L := L) v).algebra' +attribute [local instance] infinitePlaceComplexificationOverfieldRationalAlgebra + +open scoped Classical in noncomputable instance infinitePlaceComplexificationOverfield_finiteDimensional (v : InfinitePlace K) : @@ -90,6 +98,7 @@ noncomputable instance IntermediateField.finiteDimensional_sup φ.fieldRange complexFourthRootField +open scoped Classical in noncomputable instance infinitePlaceComplexificationOverfield_numberField (v : InfinitePlace K) : @@ -100,6 +109,7 @@ noncomputable instance (infinitePlaceComplexificationOverfield (K := K) (L := L) v) +open scoped Classical in /-- The chosen top-field embedding `L → L(i)`. -/ noncomputable def infinitePlaceComplexificationOverfieldEmbedding (v : InfinitePlace K) : @@ -122,6 +132,7 @@ noncomputable def infinitePlaceComplexificationOverfieldEmbedding (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] @@ -140,8 +151,9 @@ theorem infinitePlaceComplexificationOverfieldEmbedding_coe (chosenInfinitePlaceAbove (L := L) v) x rfl +open scoped Classical in noncomputable instance - infinitePlaceComplexificationOverfield_algebra + infinitePlaceComplexificationOverfieldAlgebra (v : InfinitePlace K) : Algebra L (infinitePlaceComplexificationOverfield @@ -149,16 +161,18 @@ noncomputable instance (infinitePlaceComplexificationOverfieldEmbedding (K := K) (L := L) v).toRingHom.toAlgebra +open scoped Classical in /-- The scalar action belonging to the chosen top-field embedding. -/ noncomputable instance - infinitePlaceComplexificationOverfield_smul + infinitePlaceComplexificationOverfieldSmul (v : InfinitePlace K) : SMul L (infinitePlaceComplexificationOverfield (K := K) (L := L) v) := - (infinitePlaceComplexificationOverfield_algebra + (infinitePlaceComplexificationOverfieldAlgebra (K := K) (L := L) v).toSMul +open scoped Classical in instance infinitePlaceComplexificationOverfield_ratScalarTower (v : InfinitePlace K) : @@ -169,8 +183,9 @@ instance (infinitePlaceComplexificationOverfieldEmbedding (K := K) (L := L) v).comp_algebraMap.symm +open scoped Classical in noncomputable instance - infinitePlaceComplexificationOverfield_baseAlgebra + infinitePlaceComplexificationOverfieldBaseAlgebra (v : InfinitePlace K) : Algebra K (infinitePlaceComplexificationOverfield @@ -179,16 +194,18 @@ noncomputable instance (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 - infinitePlaceComplexificationOverfield_baseSmul + infinitePlaceComplexificationOverfieldBaseSmul (v : InfinitePlace K) : SMul K (infinitePlaceComplexificationOverfield (K := K) (L := L) v) := - (infinitePlaceComplexificationOverfield_baseAlgebra + (infinitePlaceComplexificationOverfieldBaseAlgebra (K := K) (L := L) v).toSMul +open scoped Classical in instance infinitePlaceComplexificationOverfield_baseRatScalarTower (v : InfinitePlace K) : @@ -200,6 +217,7 @@ instance (K := K) (L := L) v).comp (IsScalarTower.toAlgHom ℚ K L)).comp_algebraMap).symm +open scoped Classical in instance infinitePlaceComplexificationOverfield_scalarTower (v : InfinitePlace K) : @@ -208,6 +226,7 @@ instance (K := K) (L := L) v) := IsScalarTower.of_algebraMap_eq' rfl +open scoped Classical in noncomputable instance infinitePlaceComplexificationOverfield_finiteDimensional_over_extension (v : InfinitePlace K) : @@ -218,6 +237,7 @@ noncomputable instance (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 @@ -234,8 +254,9 @@ noncomputable def le_sup_right)).comp (rationalComplexificationComplexEquiv.toAlgHom) +open scoped Classical in noncomputable instance - rationalComplexification_infinitePlaceOverfield_algebra + rationalComplexificationInfinitePlaceOverfieldAlgebra (v : InfinitePlace K) : Algebra rationalComplexificationCyclotomicField (infinitePlaceComplexificationOverfield @@ -243,18 +264,20 @@ noncomputable instance (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 - rationalComplexification_infinitePlaceOverfield_smul + rationalComplexificationInfinitePlaceOverfieldSmul (v : InfinitePlace K) : SMul rationalComplexificationCyclotomicField (infinitePlaceComplexificationOverfield (K := K) (L := L) v) := - (rationalComplexification_infinitePlaceOverfield_algebra + (rationalComplexificationInfinitePlaceOverfieldAlgebra (K := K) (L := L) v).toSMul +open scoped Classical in instance rationalComplexification_infinitePlaceOverfield_scalarTower (v : InfinitePlace K) : @@ -265,6 +288,7 @@ instance (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 @@ -276,6 +300,7 @@ noncomputable def infinitePlaceEmbeddedExtensionField (infinitePlaceComplexificationOverfield (K := K) (L := L) v)).fieldRange +open scoped Classical in noncomputable instance infinitePlaceEmbeddedExtensionField_isAbelianGalois (v : InfinitePlace K) : @@ -287,6 +312,7 @@ noncomputable instance (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 @@ -300,6 +326,7 @@ noncomputable def infinitePlaceBaseFourthRootField (K := K) (L := L) v | ∃ n ∈ ({4} : Set ℕ), n ≠ 0 ∧ z ^ n = 1} +open scoped Classical in noncomputable instance infinitePlaceBaseFourthRootField_isCyclotomic (v : InfinitePlace K) : @@ -337,6 +364,7 @@ noncomputable instance exact complexI_isPrimitiveRoot_four · exact C.val.injective +open scoped Classical in noncomputable instance infinitePlaceBaseFourthRootField_isAbelianGalois (v : InfinitePlace K) : @@ -349,6 +377,7 @@ noncomputable instance (K := K) (L := L) v) omit [FiniteDimensional K L] in +open scoped Classical in private noncomputable def infinitePlaceRatEmbeddedExtensionField (v : InfinitePlace K) : IntermediateField ℚ @@ -365,6 +394,7 @@ private noncomputable def infinitePlaceRatEmbeddedExtensionField le_sup_left) omit [FiniteDimensional K L] in +open scoped Classical in private noncomputable def infinitePlaceRatFourthRootField (v : InfinitePlace K) : IntermediateField ℚ @@ -378,6 +408,7 @@ private noncomputable def infinitePlaceRatFourthRootField le_sup_right) omit [FiniteDimensional K L] in +open scoped Classical in private noncomputable def infinitePlaceRatComplexificationFactors (v : InfinitePlace K) : IntermediateField ℚ @@ -389,6 +420,7 @@ private noncomputable def infinitePlaceRatComplexificationFactors (K := K) (L := L) v).restrictScalars ℚ omit [FiniteDimensional K L] in +open scoped Classical in private theorem infinitePlaceRatEmbeddedExtensionField_le_factors (v : InfinitePlace K) : infinitePlaceRatEmbeddedExtensionField @@ -433,6 +465,7 @@ private theorem infinitePlaceRatEmbeddedExtensionField_le_factors _ = (x : C).1 := hy omit [FiniteDimensional K L] in +open scoped Classical in private theorem infinitePlaceRatFourthRootField_le_factors (v : InfinitePlace K) : infinitePlaceRatFourthRootField @@ -495,6 +528,7 @@ private theorem infinitePlaceRatFourthRootField_le_factors exact hiy omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in private theorem infinitePlaceRatComplexificationFactors_sup (v : InfinitePlace K) : infinitePlaceRatEmbeddedExtensionField @@ -514,6 +548,7 @@ private theorem infinitePlaceRatComplexificationFactors_sup 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 @@ -539,6 +574,7 @@ theorem infinitePlaceComplexificationFactors_sup (infinitePlaceRatFourthRootField_le_factors (K := K) (L := L) v) +open scoped Classical in noncomputable instance infinitePlaceComplexificationOverfield_isAbelianGalois_over_base (v : InfinitePlace K) : @@ -572,6 +608,7 @@ noncomputable instance (IntermediateField.topEquiv.symm.toAlgHom : C →ₐ[K] (⊤ : IntermediateField K C)) +open scoped Classical in noncomputable instance infinitePlaceComplexificationOverfield_isTotallyComplex (v : InfinitePlace K) : @@ -583,6 +620,7 @@ noncomputable instance (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 @@ -595,6 +633,7 @@ noncomputable def infinitePlaceComplexificationOverfieldComplexPlace (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 @@ -625,6 +664,7 @@ theorem infinitePlaceComplexificationOverfield_map_complexConjugation (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) @@ -643,6 +683,7 @@ noncomputable def ramifiedInfinitePlaceOverfieldConjugation (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] @@ -659,6 +700,7 @@ theorem ramifiedInfinitePlaceOverfieldConjugation_apply rfl omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in /-- The restricted overfield complex conjugation is an involution. -/ @[simp] theorem ramifiedInfinitePlaceOverfieldConjugation_sq diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index ce46756463..07e42fc9ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -14,7 +14,7 @@ This module forms the actual compositum with the rational fourth-root field and proves that restriction to the rational cyclotomic factor is faithful. -/ -open scoped Classical IsMulCommutative +open scoped IsMulCommutative open AlgebraicNumberTheory NumberField noncomputable section @@ -25,12 +25,14 @@ namespace Reciprocity attribute [local instance] rationalComplexificationCyclotomicField_isAbelianGalois +open scoped Classical in private 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 @@ -41,6 +43,7 @@ private noncomputable def rationalComplexificationAmbientEquiv : 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 : @@ -48,12 +51,18 @@ def numberFieldComplexification : 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 : @@ -65,10 +74,12 @@ noncomputable instance numberFieldComplexification_finiteDimensional : (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 := @@ -81,6 +92,7 @@ noncomputable def numberFieldComplexificationEmbedding : 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 : @@ -89,46 +101,54 @@ noncomputable def rationalComplexificationCompositumEmbedding : (IntermediateField.inclusion le_sup_right).comp rationalComplexificationAmbientEquiv.toAlgHom -noncomputable instance numberFieldComplexification_algebra : +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 numberFieldComplexification_smul : +noncomputable instance numberFieldComplexificationSmul : SMul F (numberFieldComplexification F) := - (numberFieldComplexification_algebra F).toSMul + (numberFieldComplexificationAlgebra F).toSMul -noncomputable instance rationalComplexificationCompositum_algebra : +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 rationalComplexificationCompositum_smul : +noncomputable instance rationalComplexificationCompositumSmul : SMul rationalComplexificationCyclotomicField (numberFieldComplexification F) := - (rationalComplexificationCompositum_algebra F).toSMul + (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 : @@ -138,6 +158,7 @@ noncomputable def numberFieldComplexificationRestriction : ℚ rationalComplexificationCyclotomicField F (numberFieldComplexification F) +open scoped Classical in private def numberFieldComplexificationBaseLayer : IntermediateField ℚ (numberFieldComplexification F) := (numberFieldInRationalSeparableClosure F).restrict @@ -145,6 +166,7 @@ private def numberFieldComplexificationBaseLayer : numberFieldComplexification F from le_sup_left) +open scoped Classical in private def numberFieldComplexificationCyclotomicLayer : IntermediateField ℚ (numberFieldComplexification F) := rationalComplexificationAmbientField.restrict @@ -153,29 +175,40 @@ private def numberFieldComplexificationCyclotomicLayer : 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 ℚ @@ -183,18 +216,27 @@ private noncomputable local instance 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 = @@ -209,6 +251,7 @@ private theorem numberFieldComplexificationLayers_sup : IntermediateField.lift_top] exact sup_comm _ _ +open scoped Classical in private theorem numberFieldComplexificationBaseEquiv_algebraMap (x : F) : algebraMap F (numberFieldComplexification F) x = @@ -218,6 +261,7 @@ private theorem numberFieldComplexificationBaseEquiv_algebraMap apply Subtype.ext rfl +open scoped Classical in private noncomputable def numberFieldComplexificationChangeBase : Gal(numberFieldComplexification F / F) →* Gal(numberFieldComplexification F / @@ -247,6 +291,7 @@ private noncomputable def numberFieldComplexificationChangeBase : map_one' := rfl map_mul' _ _ := rfl +open scoped Classical in private theorem numberFieldComplexificationChangeBase_injective : Function.Injective (numberFieldComplexificationChangeBase F) := by intro σ τ hστ @@ -258,6 +303,7 @@ private theorem numberFieldComplexificationChangeBase_injective : numberFieldComplexificationBaseLayer F) => f x) hστ +open scoped Classical in private noncomputable def numberFieldComplexificationLayerRestriction : Gal(numberFieldComplexification F / numberFieldComplexificationBaseLayer F) →* @@ -272,6 +318,7 @@ private noncomputable def numberFieldComplexificationLayerRestriction : (numberFieldComplexificationBaseLayer F) (numberFieldComplexification F) +open scoped Classical in private theorem numberFieldComplexificationLayerRestriction_injective : Function.Injective (numberFieldComplexificationLayerRestriction F) := by @@ -285,12 +332,14 @@ private theorem numberFieldComplexificationLayerRestriction_injective : (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 @@ -372,6 +421,7 @@ private theorem numberFieldComplexificationRestriction_commutes (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 : @@ -382,6 +432,7 @@ theorem numberFieldComplexificationRestriction_injective : 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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean index 4de12823a4..45ddad064e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -13,7 +13,7 @@ This module proves principal-idele triviality, descends the chosen Artin product to the norm quotient, and identifies it with global reciprocity. -/ -open scoped Classical IsMulCommutative +open scoped IsMulCommutative open NumberField open IdeleGroup @@ -35,12 +35,16 @@ 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) @@ -51,6 +55,7 @@ private noncomputable def quotientLiftData intro x exact QuotientGroup.lift_mk _ _ _ +open scoped Classical in private theorem globalNormResidueEquiv_mk_one (F E : Type) [Field F] [NumberField F] @@ -71,6 +76,7 @@ private theorem globalNormResidueEquiv_mk_one 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] @@ -90,6 +96,7 @@ private theorem globalNormResidueEquiv_mk 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] @@ -112,9 +119,9 @@ private theorem globalNormResidueEquiv_ne_one_of_ne_mk_one (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. -/ -@[simp] theorem ramifiedInfinitePlaceOverextensionGlobalArtin_principalIdele (v : InfinitePlace K) @@ -180,6 +187,7 @@ theorem 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 @@ -213,10 +221,10 @@ noncomputable def (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. -/ -@[simp] theorem ramifiedInfinitePlaceOverextensionIdeleClassArtinMonoidHom_mk (v : InfinitePlace K) @@ -245,6 +253,7 @@ theorem 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] @@ -294,6 +303,7 @@ theorem (K := K) (L := L) v) a +open scoped Classical in private noncomputable def ramifiedInfinitePlaceOverextensionNormQuotientArtinData (v : InfinitePlace K) @@ -323,6 +333,7 @@ private noncomputable def 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 @@ -334,6 +345,7 @@ noncomputable def (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] @@ -355,6 +367,7 @@ theorem (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 @@ -391,6 +404,7 @@ theorem 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 @@ -421,6 +435,7 @@ theorem (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 @@ -447,6 +462,7 @@ theorem 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) @@ -484,6 +500,7 @@ private theorem q hq omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in private theorem ramifiedInfinitePlaceOverextensionGlobalNormResidue_mk (v : InfinitePlace K) @@ -514,6 +531,7 @@ private theorem 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. -/ @@ -619,6 +637,7 @@ theorem (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) @@ -645,6 +664,7 @@ private theorem (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. -/ @@ -672,10 +692,10 @@ theorem (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. -/ -@[simp] theorem globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_ideleClass_mk (v : InfinitePlace K) @@ -715,10 +735,10 @@ theorem (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. -/ -@[simp] theorem globalNormResidueMonoidHom_ramifiedInfinitePlaceOverextension_infinitePlaceIdeleClass (v : InfinitePlace K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean index 8f54d99d74..daaf9bc40d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -12,7 +12,7 @@ This module constructs the real fixed field of complex conjugation, the quadratic overextension above it, and the faithful cyclotomic restriction. -/ -open scoped Classical IsMulCommutative +open scoped IsMulCommutative open NumberField noncomputable section @@ -31,6 +31,7 @@ variable [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 @@ -46,6 +47,7 @@ def ramifiedInfinitePlaceRealFixedField (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 @@ -92,6 +94,7 @@ theorem ramifiedInfinitePlaceOverfieldConjugation_fixes_base 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) @@ -129,6 +132,7 @@ noncomputable def ramifiedInfinitePlaceRealFixedFieldEmbedding ((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] @@ -170,9 +174,10 @@ theorem ramifiedInfinitePlaceRealFixedFieldEmbedding_coe (infinitePlaceComplexificationOverfield (K := K) (L := L) v) x +open scoped Classical in @[reducible] noncomputable instance - ramifiedInfinitePlaceRealFixedField_algebra + ramifiedInfinitePlaceRealFixedFieldAlgebra (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : @@ -182,6 +187,7 @@ noncomputable instance (ramifiedInfinitePlaceRealFixedFieldEmbedding (K := K) (L := L) v hRamified).toRingHom.toAlgebra +open scoped Classical in instance ramifiedInfinitePlaceRealFixedField_ratScalarTower (v : InfinitePlace K) (hRamified : @@ -193,6 +199,7 @@ instance ramifiedInfinitePlaceRealFixedField_ratScalarTower (ramifiedInfinitePlaceRealFixedFieldEmbedding (K := K) (L := L) v hRamified) +open scoped Classical in instance ramifiedInfinitePlaceRealFixedField_scalarTower (v : InfinitePlace K) (hRamified : @@ -210,6 +217,7 @@ instance ramifiedInfinitePlaceRealFixedField_scalarTower (K := K) (L := L) v hRamified x } omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in theorem ramifiedInfinitePlaceRealFixedField_finiteDimensional (v : InfinitePlace K) @@ -224,6 +232,7 @@ theorem (infinitePlaceComplexificationOverfield (K := K) (L := L) v) +open scoped Classical in noncomputable instance ramifiedInfinitePlaceRealFixedField_numberField (v : InfinitePlace K) (hRamified : @@ -243,6 +252,7 @@ noncomputable instance ramifiedInfinitePlaceRealFixedField_numberField (K := K) (L := L) v hRamified) omit [FiniteDimensional K L] in +open scoped Classical in theorem ramifiedInfinitePlaceRealFixedField_finiteDimensional_over_base (v : InfinitePlace K) @@ -255,6 +265,7 @@ theorem (ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified) +open scoped Classical in noncomputable instance ramifiedInfinitePlaceRealFixedField_isAbelianGalois_over_base (v : InfinitePlace K) @@ -270,6 +281,7 @@ noncomputable instance (K := K) (L := L) v) omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in theorem ramifiedInfinitePlaceOverfield_finiteDimensional_over_fixed (v : InfinitePlace K) @@ -287,6 +299,7 @@ theorem (K := K) (L := L) v) omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in theorem ramifiedInfinitePlaceOverextension_isGalois (v : InfinitePlace K) (hRamified : @@ -305,6 +318,7 @@ theorem ramifiedInfinitePlaceOverextension_isGalois (ramifiedInfinitePlaceOverfieldConjugation (K := K) (L := L) v hRamified)) +open scoped Classical in noncomputable instance ramifiedInfinitePlaceOverextension_isAbelianGalois (v : InfinitePlace K) @@ -341,6 +355,7 @@ noncomputable instance (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 @@ -363,6 +378,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionConjugation (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] @@ -380,6 +396,7 @@ theorem ramifiedInfinitePlaceOverextensionConjugation_apply 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 @@ -447,6 +464,7 @@ theorem ramifiedInfinitePlaceOverextension_eq_one_or_conjugation attribute [local instance] rationalComplexificationCyclotomicField_isAbelianGalois +open scoped Classical in /-- Restriction of the quadratic overextension Galois group to the rational fourth-root factor. -/ noncomputable def @@ -465,6 +483,7 @@ noncomputable def (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 @@ -521,6 +540,7 @@ theorem ramifiedInfinitePlaceOverfieldConjugation_map_zeta_ne 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 @@ -614,6 +634,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean index 239cab0465..019fb28a48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean @@ -15,7 +15,7 @@ This module realizes the quadratic complexification as the fourth-root cyclotomic field and proves the rational principal-idele Artin formula. -/ -open scoped BigOperators Classical IsMulCommutative NumberField +open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain open IdeleGroup @@ -24,24 +24,33 @@ 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 : @@ -49,6 +58,7 @@ abbrev rationalComplexificationCyclotomicField : KummerTheory.rationalCyclotomicLevel rationalComplexificationCyclotomicOrder +open scoped Classical in noncomputable instance rationalComplexificationCyclotomicField_isCyclotomicFour : IsCyclotomicExtension {4} ℚ @@ -61,6 +71,7 @@ noncomputable instance KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension rationalComplexificationCyclotomicOrder +open scoped Classical in noncomputable instance rationalComplexificationCyclotomicField_isCMField : NumberField.IsCMField rationalComplexificationCyclotomicField := by @@ -70,24 +81,34 @@ noncomputable instance 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 @@ -101,6 +122,7 @@ theorem complexI_isPrimitiveRoot_four : 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 @@ -112,6 +134,7 @@ def complexFourthRootField : {z : ℂ | ∃ n ∈ ({4} : Set ℕ), n ≠ 0 ∧ z ^ n = 1} +open scoped Classical in noncomputable instance complexFourthRootField_isCyclotomic : IsCyclotomicExtension {4} ℚ complexFourthRootField := by apply @@ -122,16 +145,19 @@ noncomputable instance complexFourthRootField_isCyclotomic : 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 `ℂ`. -/ @@ -143,6 +169,7 @@ noncomputable def rationalComplexificationComplexEquiv : rationalComplexificationCyclotomicField complexFourthRootField +open scoped Classical in /-- The concrete fourth-root field is stable under complex conjugation. -/ theorem complexFourthRootField_map_complexConjugation : @@ -164,6 +191,7 @@ theorem complexFourthRootField_map_complexConjugation : 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 : @@ -177,6 +205,7 @@ theorem rationalComplexification_chosenInfinitePlace_isRamified : 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 : @@ -204,6 +233,7 @@ theorem 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 @@ -222,6 +252,7 @@ theorem 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 @@ -243,6 +274,7 @@ theorem 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 @@ -288,6 +320,7 @@ theorem 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 ≃ₐ[ℚ] @@ -300,6 +333,7 @@ private noncomputable def rationalComplexificationCharacter : KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension rationalComplexificationCyclotomicOrder) +open scoped Classical in private theorem rationalComplexificationCharacter_apply (σ : rationalComplexificationCyclotomicField ≃ₐ[ℚ] rationalComplexificationCyclotomicField) : @@ -312,6 +346,7 @@ private theorem rationalComplexificationCharacter_apply 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 @@ -358,6 +393,7 @@ private theorem rationalComplexificationFiniteArtin_character intro v rw [rationalComplexificationCharacter_apply] +open scoped Classical in /-- A group of order two has a unique nonidentity automorphism. -/ private theorem rationalComplexification_existsUnique_nontrivial : ∃! σ : @@ -369,6 +405,7 @@ private theorem rationalComplexification_existsUnique_nontrivial : 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 @@ -381,6 +418,7 @@ private theorem rationalComplexification_signCharacter_ne_one_of_num_neg 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 @@ -391,9 +429,9 @@ private theorem rationalComplexification_signCharacter_eq_one_of_num_pos 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. -/ -@[simp] theorem rationalComplexificationGlobalArtin_principalIdele (x : ℚˣ) : globalArtinMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index 4e1cf1dd7f..4a5ba19dbb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -36,12 +36,14 @@ open KummerTheory cyclotomic fixed-field API. Generic intermediate-field instances are propositionally equal here but not definitionally interchangeable. -/ noncomputable local instance - cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra : + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra : Algebra ℚ (SeparableClosure ℚ) := DivisionRing.toRatAlgebra +/-- The rational cyclotomic field uses the canonical rational algebra structure of a division +ring. -/ noncomputable local instance - cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldAlgebra : + cyclotomicAbstractFixedFieldArtinCyclotomicZHatFieldAlgebra : Algebra ℚ rationalCyclotomicZHatField := DivisionRing.toRatAlgebra @@ -309,7 +311,7 @@ noncomputable def exact IntermediateField.inclusion hTJ noncomputable instance - abstractFixedFieldCyclotomicCompositum_algebra + abstractFixedFieldCyclotomicCompositumAlgebra (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : let hI := @@ -658,7 +660,7 @@ noncomputable def (IntermediateField.liftAlgEquiv E.toIntermediateField).toAlgHom noncomputable instance - abstractFixedFieldCyclotomicFiniteCompositum_baseAlgebra + abstractFixedFieldCyclotomicFiniteCompositumBaseAlgebra (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -673,7 +675,7 @@ noncomputable instance (abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding H E)) noncomputable instance - abstractFixedFieldCyclotomicFiniteCompositum_layerAlgebra + abstractFixedFieldCyclotomicFiniteCompositumLayerAlgebra (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -688,7 +690,7 @@ noncomputable instance /-- The finite-layer action induced by its explicit embedding into the finite compositum. -/ noncomputable instance - abstractFixedFieldCyclotomicFiniteCompositum_layerSMul + abstractFixedFieldCyclotomicFiniteCompositumLayerSMul (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -698,7 +700,7 @@ noncomputable instance (abstractFixedFieldCyclotomicFiniteCompositum H E) := Algebra.toSMul (self := - abstractFixedFieldCyclotomicFiniteCompositum_layerAlgebra H E) + abstractFixedFieldCyclotomicFiniteCompositumLayerAlgebra H E) instance abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower @@ -802,7 +804,7 @@ noncomputable def abstractFixedFieldCyclotomicFiniteLayer /-- The base algebra on the finite field range, obtained from the explicit base embedding followed by the field-range equivalence. -/ noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra + abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -824,7 +826,7 @@ noncomputable instance /-- The scalar action belonging to the canonical base algebra on the finite field range. -/ noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_baseSMul + abstractFixedFieldCyclotomicFiniteLayerBaseSMul (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -835,12 +837,12 @@ noncomputable instance ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E) := Algebra.toSMul - (self := abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra H E) + (self := abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E) /-- The module structure belonging to the canonical base algebra on the finite field range. -/ noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_baseModule + abstractFixedFieldCyclotomicFiniteLayerBaseModule (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -855,7 +857,7 @@ noncomputable instance ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E) _ _ - (abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra H E) + (abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E) /-- The field-range equivalence rebuilt over the explicit base algebras. Its underlying ring equivalence is the canonical one. -/ @@ -988,7 +990,7 @@ noncomputable def (abstractFixedFieldCyclotomicFiniteCompositumLayerEmbedding H E) noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra + abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1003,7 +1005,7 @@ noncomputable instance /-- The finite-layer action on its actual image in the relative fixed field. -/ noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_layerSMul + abstractFixedFieldCyclotomicFiniteLayerLayerSMul (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1012,7 +1014,7 @@ noncomputable instance SMul E (abstractFixedFieldCyclotomicFiniteLayer H E) := Algebra.toSMul - (self := abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra H E) + (self := abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E) instance abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower @@ -1058,7 +1060,7 @@ theorem abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra_eq_algebra' (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra H E = + abstractFixedFieldCyclotomicFiniteLayerBaseAlgebra H E = (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).algebra' := by apply Algebra.algebra_ext intro x @@ -1462,11 +1464,11 @@ theorem let P : IntermediateField F U := abstractFixedFieldCyclotomicFiniteLayer H E let : Algebra T U := - abstractFixedFieldCyclotomicCompositum_algebra H + abstractFixedFieldCyclotomicCompositumAlgebra H let : IsScalarTower ℚ T U := abstractFixedFieldCyclotomicCompositum_scalarTower H let : Algebra E P := - abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra H E + abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E let : IsScalarTower ℚ E P := abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower H E let : IsAbelianGalois F P := by @@ -1515,6 +1517,8 @@ private abbrev cyclotomicAbstractFixedFieldArtinCoordinateLayer (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := abstractFixedFieldCyclotomicFiniteLayer H E +/-- The base field for an abstract fixed-field Artin coordinate carries its rational algebra +structure. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateBaseAlgebra (H : FiniteAbstractField @@ -1541,6 +1545,7 @@ noncomputable local instance NumberField.of_module_finite ℚ (cyclotomicAbstractFixedFieldArtinCoordinateBase H) +/-- The rational separable closure is an algebra over the base field of an Artin coordinate. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateBaseSeparableAlgebra (H : FiniteAbstractField @@ -1551,6 +1556,7 @@ noncomputable local instance 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 @@ -1578,6 +1584,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := abstractFixedFieldCyclotomic_isAbelianGalois H +/-- A finite Galois cyclotomic coordinate carries its intermediate-field rational algebra +structure. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateAlgebra (E : @@ -1610,6 +1618,7 @@ local instance Normal ℚ E := E.isGalois.to_normal +/-- A finite cyclotomic coordinate layer is an algebra over the abstract fixed base field. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseAlgebra (H : FiniteAbstractField @@ -1622,6 +1631,7 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := (abstractFixedFieldCyclotomicFiniteGaloisLayer H E).algebra' +/-- A finite cyclotomic coordinate layer carries its rational algebra structure. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateLayerRatAlgebra (H : FiniteAbstractField @@ -1678,6 +1688,7 @@ noncomputable local instance (abstractFixedFieldCyclotomicFiniteGaloisLayer H E) := abstractFixedFieldCyclotomicFiniteLayer_numberField H E +/-- A finite cyclotomic coordinate layer is an algebra over the chosen cyclotomic field. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateLayerAlgebra (H : FiniteAbstractField @@ -1687,8 +1698,9 @@ noncomputable local instance ℚ rationalCyclotomicZHatField) : Algebra E (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := - abstractFixedFieldCyclotomicFiniteLayer_layerAlgebra 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 @@ -1698,7 +1710,7 @@ noncomputable local instance ℚ rationalCyclotomicZHatField) : SMul E (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := - abstractFixedFieldCyclotomicFiniteLayer_layerSMul H E + abstractFixedFieldCyclotomicFiniteLayerLayerSMul H E local instance cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower @@ -1711,6 +1723,7 @@ local instance (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower H E +/-- The relative cyclotomic field is an algebra over each finite coordinate layer. -/ noncomputable local instance cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeAlgebra (H : FiniteAbstractField @@ -2276,7 +2289,7 @@ theorem (QuotientGroup.mk' (IdeleGroup.principalSubgroup F) a)) := by have hSeparableClosureAlgebra : - cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra = + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra = rationalSeparableClosureAlgebra := Subsingleton.elim _ _ cases hSeparableClosureAlgebra @@ -2309,7 +2322,6 @@ theorem /-- The genuine infinite global Artin symbol of the cyclotomic maximal-unramified extension kills every principal idele of the abstract fixed field. -/ -@[simp] theorem infiniteGlobalArtinMonoidHom_abstractFixedFieldCyclotomic_principalIdele (H : FiniteAbstractField @@ -2404,7 +2416,6 @@ noncomputable def abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom /-- Evaluation of the descended maximal-unramified Artin map on an idele representative. -/ -@[simp] theorem abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom_mk (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -2465,7 +2476,7 @@ theorem let : NumberField F := NumberField.of_module_finite ℚ F have hSeparableClosureAlgebra : - cyclotomicAbstractFixedFieldArtin_separableClosureAlgebra = + cyclotomicAbstractFixedFieldArtinSeparableClosureAlgebra = rationalSeparableClosureAlgebra := Subsingleton.elim _ _ cases hSeparableClosureAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean index 0545f790dd..e8e72d9b53 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -72,7 +72,6 @@ private noncomputable def ideleClassContinuousQuotientLift (QuotientGroup.isQuotientMap_mk (G := A) (N := N)).continuous_iff.2 hcomp } -@[simp] private theorem ideleClassContinuousQuotientLift_mk {A B : Type*} [Group A] [TopologicalSpace A] [Group B] [TopologicalSpace B] @@ -103,7 +102,6 @@ noncomputable def rationalCyclotomicZHatIdeleClassValueContinuousMul : /-- Evaluation of the descended rational value on an idele class represented by an idele. -/ -@[simp] theorem rationalCyclotomicZHatIdeleClassValueContinuousMul_mk (a : IdeleGroup ℚ) : rationalCyclotomicZHatIdeleClassValueContinuousMul @@ -126,7 +124,6 @@ noncomputable def rationalCyclotomicZHatIdeleClassValueContinuous : continuous_toMul) /-- Evaluation of the additive rational class value on a representative. -/ -@[simp] theorem rationalCyclotomicZHatIdeleClassValueContinuous_mk (a : IdeleGroup ℚ) : rationalCyclotomicZHatIdeleClassValueContinuous @@ -168,7 +165,6 @@ noncomputable def normalizedCyclotomicZHatIdeleClassValueContinuousMul : (normalizedCyclotomicZHatIdeleValue_principalSubgroup_le_ker K) /-- Evaluation of the normalized class value on an idele representative. -/ -@[simp] theorem normalizedCyclotomicZHatIdeleClassValueContinuousMul_mk (a : IdeleGroup K) : normalizedCyclotomicZHatIdeleClassValueContinuousMul K @@ -194,7 +190,6 @@ noncomputable def normalizedCyclotomicZHatIdeleClassValueContinuous : continuous_toMul) /-- Evaluation of the normalized additive class value on a representative. -/ -@[simp] theorem normalizedCyclotomicZHatIdeleClassValueContinuous_mk (a : IdeleGroup K) : normalizedCyclotomicZHatIdeleClassValueContinuous K @@ -220,7 +215,6 @@ to the rational cyclotomic factor, norm--restriction turns the assertion into the rational principal-idele product formula, and that restriction is injective. -/ -@[simp] theorem infiniteGlobalArtinMonoidHom_numberFieldCyclotomicZHatCompositum_principalIdele (x : Kˣ) : @@ -257,7 +251,6 @@ noncomputable def /-- Evaluation of the descended compositum Artin map on an idele representative. -/ -@[simp] theorem numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom_mk (a : IdeleGroup K) : @@ -343,7 +336,7 @@ theorem API throughout this block. Fixing it before the first finite-layer binder keeps the parameter and every restriction target definitionally aligned. -/ noncomputable local instance - cyclotomicIdeleClassValuation_rationalCyclotomicZHatFieldAlgebra : + cyclotomicIdeleClassValuationRationalCyclotomicZHatFieldAlgebra : Algebra ℚ rationalCyclotomicZHatField := DivisionRing.toRatAlgebra @@ -518,7 +511,6 @@ noncomputable def /-- Evaluation of the descended finite-layer Artin map on an idele representative. -/ -@[simp] theorem numberFieldCyclotomicZHatFiniteLayerIdeleClassArtinMonoidHom_mk (E : @@ -687,7 +679,6 @@ theorem normalizedCyclotomicZHatIdeleClassValue_surjective : exact ⟨Additive.ofMul (c : IdeleClassGroup K), hc⟩ /-- The normalized cyclotomic class value has full value group. -/ -@[simp] theorem normalizedCyclotomicZHatIdeleClassValue_range : (normalizedCyclotomicZHatIdeleClassValueContinuous K).toAddMonoidHom.range = (⊤ : AddSubgroup ZHat) := @@ -696,7 +687,6 @@ theorem normalizedCyclotomicZHatIdeleClassValue_range : (normalizedCyclotomicZHatIdeleClassValue_surjective K) /-- The rational cyclotomic class value has full value group. -/ -@[simp] theorem rationalCyclotomicZHatIdeleClassValue_range : rationalCyclotomicZHatIdeleClassValueContinuous.toAddMonoidHom.range = (⊤ : AddSubgroup ZHat) := @@ -1117,7 +1107,6 @@ theorem rationalCyclotomicZHatValuation_normToBase_fixed_apply /-- 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. -/ -@[simp] theorem rationalCyclotomicIdeleClassValuationData_valuationAt_fixed_apply (H : FiniteAbstractField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean index 9a062f5abf..137dc46216 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -120,9 +120,9 @@ theorem let : NumberField P := numberFieldCyclotomicZHatFiniteLayerInCompositum_numberField K E let : Algebra E P := - rationalCyclotomicZHatFiniteLayerInCompositum_algebra K E + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E let : SMul E P := - rationalCyclotomicZHatFiniteLayerInCompositum_smul K E + rationalCyclotomicZHatFiniteLayerInCompositumSmul K E let : Module E P := Algebra.toModule let : IsScalarTower ℚ E P := rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower K E diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean index 96a1eefbbe..a45cf4522c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean @@ -213,7 +213,6 @@ noncomputable def cyclotomicZHatNormCompositeInMulNatRangeContinuous : /-- Coercing the continuous range-restricted norm composite recovers the underlying cyclotomic norm composite. -/ -@[simp] theorem cyclotomicZHatNormCompositeInMulNatRangeContinuous_apply (a : Additive (IdeleGroup K)) : (cyclotomicZHatNormCompositeInMulNatRangeContinuous K a : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean index 613680c988..3c442f1771 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -23,7 +23,7 @@ compatibility theorem between the chosen finite-place Artin map and the explicit cyclotomic action; no such compatibility is assumed here. -/ -open scoped BigOperators Classical NumberField IsMulCommutative +open scoped BigOperators NumberField IsMulCommutative open NumberField IsDedekindDomain ClassFormation noncomputable section @@ -33,6 +33,7 @@ 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 @@ -41,6 +42,9 @@ local instance rationalCyclotomicPrimePowerNumberField 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 ℚ @@ -49,6 +53,9 @@ local instance rationalCyclotomicPrimePowerIsGalois 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 ℚ @@ -58,9 +65,15 @@ local instance rationalCyclotomicPrimePowerIsAbelianGalois (KummerTheory.rationalCyclotomicLevel ⟨p.1 ^ k, pow_pos p.2.pos k⟩).val -local instance (p : Nat.Primes) : Fact p.1.Prime := +attribute [local instance] rationalCyclotomicPrimePowerIsAbelianGalois + +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +open scoped Classical in noncomputable local instance cyclotomicPrincipalLevelIsAbelianGalois (m : ℕ+) : @@ -78,6 +91,9 @@ noncomputable local instance 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 @@ -158,6 +174,7 @@ theorem finiteSubfieldOfRationalCyclotomicField_le_level 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 @@ -197,6 +214,7 @@ theorem finiteSubfieldOfRationalCyclotomicZHatField_mapsIntoLevel 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 @@ -246,6 +264,7 @@ private theorem rationalCyclotomicFullRestrictionToZHat_commutes _ = σ ((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. -/ @@ -255,7 +274,7 @@ private theorem restrictNormalHom_eq_of_commuting_square [Algebra K E] [Algebra K Z] [Algebra K Ω] [Algebra E Z] [Algebra E Ω] [Algebra Z Ω] [IsScalarTower K E Z] [IsScalarTower K E Ω] - [IsScalarTower K Z Ω] [IsScalarTower E Z Ω] + [IsScalarTower E Z Ω] [Normal K E] (τ : Z ≃ₐ[K] Z) (σ : Ω ≃ₐ[K] Ω) (hcommutes : ∀ z : Z, @@ -280,6 +299,7 @@ private theorem restrictNormalHom_eq_of_commuting_square _ = 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 @@ -380,6 +400,7 @@ theorem rationalCyclotomicZHatGlobalArtin_eq_fullRestriction (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 @@ -393,6 +414,7 @@ theorem rationalCyclotomicZHatIdeleValue_eq_fullCharacterFreePart 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 @@ -400,6 +422,7 @@ def rationalIdeleArchimedeanPart IdeleGroup ℚ := (a.1, 1) +open scoped Classical in /-- The finite part of a rational idele, with its archimedean component replaced by one. -/ def rationalIdeleFinitePart @@ -407,8 +430,8 @@ def rationalIdeleFinitePart IdeleGroup ℚ := (1, a.2) +open scoped Classical in /-- The archimedean part preserves every infinite component. -/ -@[simp] theorem rationalIdeleArchimedeanPart_infiniteComponent (a : IdeleGroup ℚ) (v : InfinitePlace ℚ) : @@ -417,8 +440,8 @@ theorem rationalIdeleArchimedeanPart_infiniteComponent IdeleGroup.infiniteComponent v a := rfl +open scoped Classical in /-- Every finite component of the archimedean part is one. -/ -@[simp] theorem rationalIdeleArchimedeanPart_finiteComponent (a : IdeleGroup ℚ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -427,8 +450,8 @@ theorem rationalIdeleArchimedeanPart_finiteComponent 1 := rfl +open scoped Classical in /-- Every infinite component of the finite part is one. -/ -@[simp] theorem rationalIdeleFinitePart_infiniteComponent (a : IdeleGroup ℚ) (v : InfinitePlace ℚ) : @@ -437,8 +460,8 @@ theorem rationalIdeleFinitePart_infiniteComponent 1 := rfl +open scoped Classical in /-- The finite part preserves every finite component. -/ -@[simp] theorem rationalIdeleFinitePart_finiteComponent (a : IdeleGroup ℚ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -447,6 +470,7 @@ theorem rationalIdeleFinitePart_finiteComponent IdeleGroup.finiteComponent v a := rfl +open scoped Classical in private theorem globalArtinMonoidHom_rationalIdeleFinitePart {L : Type} [Field L] [NumberField L] [Algebra ℚ L] @@ -481,6 +505,7 @@ private theorem globalArtinMonoidHom_rationalIdeleFinitePart 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 @@ -491,6 +516,7 @@ theorem rationalIdeleArchimedeanPart_mul_finitePart 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 @@ -542,6 +568,7 @@ theorem globalArtinMonoidHom_rationalIdeleArchimedeanPart_sq 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 @@ -597,9 +624,9 @@ theorem (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. -/ -@[simp] theorem rationalCyclotomicZHatIdeleValue_rationalIdeleArchimedeanPart (a : IdeleGroup ℚ) : @@ -610,6 +637,7 @@ theorem 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 @@ -635,6 +663,7 @@ theorem rationalCyclotomicZHatIdeleValue_eq_finitePart 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 @@ -655,6 +684,7 @@ private theorem rationalCyclotomicGlobalArtin_restrict_primePowerLevel (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 @@ -695,6 +725,7 @@ private theorem rationalCyclotomicGlobalArtin_projection_toZModPow ⟨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 @@ -725,6 +756,7 @@ theorem rationalCyclotomicGlobalArtin_character_toZModPow ℚ 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. -/ @@ -754,6 +786,7 @@ theorem rationalCyclotomicGlobalArtin_character_toZModPow_finitePart 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 @@ -798,6 +831,7 @@ theorem ⟨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 @@ -811,6 +845,7 @@ theorem 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. -/ @@ -843,6 +878,7 @@ theorem (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. -/ @@ -861,6 +897,7 @@ theorem cyclotomicZHatNormComposite_principalIdele_eq_finitePart 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean index db7d8655db..3590078b9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -31,6 +31,8 @@ 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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean index 9d8a892c3a..fba9a9b8aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean @@ -42,6 +42,7 @@ attribute [local instance] naturalityAbstractRelativeFixedFieldNumberField naturalityAbstractRelativeFixedFieldIsAbelianGalois +/-- The finite ideles of an abstract fixed field carry the restricted-product group structure. -/ @[reducible] noncomputable local instance abstractFixedFieldFiniteIdeleGroupGroup @@ -59,6 +60,7 @@ noncomputable local instance (LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field))ˣ) +/-- The ideles of an abstract fixed field carry the product group structure. -/ @[reducible] noncomputable local instance abstractFixedFieldIdeleGroupGroup @@ -70,6 +72,7 @@ noncomputable local instance ℚ (SeparableClosure ℚ) H.field)) := Prod.instGroup +/-- The idele classes of an abstract fixed field carry the quotient group structure. -/ @[reducible] noncomputable local instance abstractFixedFieldIdeleClassGroupGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 85432c3c0d..06d034ab88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -916,7 +916,7 @@ noncomputable def (IntermediateField.liftAlgEquiv E.toIntermediateField).toAlgHom noncomputable instance - numberFieldCyclotomicZHatFiniteCompositum_algebra + numberFieldCyclotomicZHatFiniteCompositumAlgebra (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : @@ -925,7 +925,7 @@ noncomputable instance (numberFieldCyclotomicZHatFiniteCompositumEmbedding K E).toRingHom.toAlgebra noncomputable instance - rationalCyclotomicZHatFiniteLayerCompositum_algebra + rationalCyclotomicZHatFiniteLayerCompositumAlgebra (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : @@ -937,13 +937,13 @@ noncomputable instance finite-layer embedding. Declaring it directly avoids asking instance search to rediscover the action through an unrelated intermediate-field algebra. -/ noncomputable instance - rationalCyclotomicZHatFiniteLayerCompositum_smul + rationalCyclotomicZHatFiniteLayerCompositumSmul (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : SMul E (numberFieldCyclotomicZHatFiniteCompositum K E) := - (rationalCyclotomicZHatFiniteLayerCompositum_algebra K E).toSMul + (rationalCyclotomicZHatFiniteLayerCompositumAlgebra K E).toSMul /-- The actual intersection `K ∩ E` inside the finite compositum, transported back to the finite cyclotomic layer `E`. -/ @@ -1211,11 +1211,11 @@ theorem numberFieldCyclotomicZHatFiniteCompositum K E let : Algebra ℚ C := C.algebra' let : Algebra K C := - numberFieldCyclotomicZHatFiniteCompositum_algebra K E + numberFieldCyclotomicZHatFiniteCompositumAlgebra K E let : IsScalarTower ℚ K C := numberFieldCyclotomicZHatFiniteCompositum_scalarTower K E let : Algebra E C := - rationalCyclotomicZHatFiniteLayerCompositum_algebra K E + rationalCyclotomicZHatFiniteLayerCompositumAlgebra K E let : IsScalarTower ℚ E C := rationalCyclotomicZHatFiniteLayerCompositum_scalarTower K E let eK : K →ₐ[ℚ] C := @@ -1313,11 +1313,11 @@ noncomputable def rationalCyclotomicZHatCompositumEmbedding : numberFieldCyclotomicZHatCompositum K := IntermediateField.inclusion le_sup_right -noncomputable instance numberFieldCyclotomicZHatCompositum_algebra : +noncomputable instance numberFieldCyclotomicZHatCompositumAlgebra : Algebra K (numberFieldCyclotomicZHatCompositum K) := ((numberFieldCyclotomicZHatCompositumEmbedding K).toRingHom).toAlgebra -noncomputable instance rationalCyclotomicZHatCompositum_algebra : +noncomputable instance rationalCyclotomicZHatCompositumAlgebra : Algebra rationalCyclotomicZHatField (numberFieldCyclotomicZHatCompositum K) := ((rationalCyclotomicZHatCompositumEmbedding K).toRingHom).toAlgebra @@ -1622,7 +1622,7 @@ noncomputable def (rationalCyclotomicZHatFiniteLayerCompositumEmbedding K E) noncomputable instance - rationalCyclotomicZHatFiniteLayerInCompositum_algebra + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : @@ -1635,14 +1635,14 @@ noncomputable instance /-- The finite-layer scalar action on its actual image in the full compositum. -/ noncomputable instance - rationalCyclotomicZHatFiniteLayerInCompositum_smul + rationalCyclotomicZHatFiniteLayerInCompositumSmul (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : SMul E (numberFieldCyclotomicZHatFiniteLayerInCompositum K E) := Algebra.toSMul - (self := rationalCyclotomicZHatFiniteLayerInCompositum_algebra K E) + (self := rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E) instance rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower @@ -1684,11 +1684,11 @@ theorem numberFieldCyclotomicZHatCompositumRestriction_injective : (numberFieldCyclotomicZHatCompositumRestriction K) := by let C := numberFieldCyclotomicZHatCompositum K let : Algebra ℚ C := C.algebra' - let : Algebra K C := numberFieldCyclotomicZHatCompositum_algebra K + let : Algebra K C := numberFieldCyclotomicZHatCompositumAlgebra K let : IsScalarTower ℚ K C := numberFieldCyclotomicZHatCompositum_scalarTower K let : Algebra rationalCyclotomicZHatField C := - rationalCyclotomicZHatCompositum_algebra K + rationalCyclotomicZHatCompositumAlgebra K let : IsScalarTower ℚ rationalCyclotomicZHatField C := rationalCyclotomicZHatCompositum_scalarTower K let A : IntermediateField ℚ C := @@ -1812,7 +1812,7 @@ theorem letI : Algebra ℚ (numberFieldCyclotomicZHatCompositum K) := (numberFieldCyclotomicZHatCompositum K).algebra' letI : Algebra K (numberFieldCyclotomicZHatCompositum K) := - numberFieldCyclotomicZHatCompositum_algebra K + numberFieldCyclotomicZHatCompositumAlgebra K letI : IsScalarTower ℚ K (numberFieldCyclotomicZHatCompositum K) := numberFieldCyclotomicZHatCompositum_scalarTower K letI : Normal ℚ E := E.isGalois.to_normal @@ -1839,7 +1839,7 @@ theorem let : Algebra ℚ (numberFieldCyclotomicZHatCompositum K) := (numberFieldCyclotomicZHatCompositum K).algebra' let : Algebra K (numberFieldCyclotomicZHatCompositum K) := - numberFieldCyclotomicZHatCompositum_algebra K + numberFieldCyclotomicZHatCompositumAlgebra K let : IsScalarTower ℚ K (numberFieldCyclotomicZHatCompositum K) := numberFieldCyclotomicZHatCompositum_scalarTower K let : Normal K @@ -1857,11 +1857,11 @@ theorem let T := rationalCyclotomicZHatField let P : IntermediateField K C := numberFieldCyclotomicZHatFiniteLayerInCompositum K E - let : Algebra T C := rationalCyclotomicZHatCompositum_algebra K + let : Algebra T C := rationalCyclotomicZHatCompositumAlgebra K let : IsScalarTower ℚ T C := rationalCyclotomicZHatCompositum_scalarTower K let : Algebra E P := - rationalCyclotomicZHatFiniteLayerInCompositum_algebra K E + rationalCyclotomicZHatFiniteLayerInCompositumAlgebra K E let : IsScalarTower ℚ E P := rationalCyclotomicZHatFiniteLayerInCompositum_scalarTower K E let : IsAbelianGalois K P := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean index 17ded06d0b..4105bb8386 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean @@ -407,7 +407,6 @@ theorem /-- 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. -/ -@[simp] theorem numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient_ideleClass (c : IdeleClassGroup K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean index 3903fb026d..a799827302 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean @@ -84,7 +84,6 @@ noncomputable def numberFieldTowerAbstractTopFieldEquiv : 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. -/ -@[simp] theorem numberFieldTowerAbstractFieldEquiv_algebraMap (x : K) : numberFieldTowerAbstractTopFieldEquiv K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean index 43fe29c295..fb5c1906f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean @@ -26,7 +26,7 @@ places. This file forms their `finprod` directly in the actual global Galois group. -/ -open scoped Classical IsMulCommutative NumberField NNReal ValuativeRel +open scoped IsMulCommutative NumberField NNReal ValuativeRel open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -43,6 +43,7 @@ variable {K L : Type} [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 @@ -81,6 +82,7 @@ theorem finprod_fibers_eq_sigma _ = ∏ᶠ 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 @@ -122,6 +124,7 @@ theorem normUnits_mem_finitePlaceIntegerUnits 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. -/ @@ -186,6 +189,7 @@ theorem finitePlaceArtinFactors_hasFiniteMulSupport (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 @@ -217,6 +221,7 @@ theorem chosenFinitePlaceArtinMonoidHom_eq_one_of_integral_of_unramifiedAt (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)ˣ) @@ -227,6 +232,7 @@ private theorem chosenFinitePlaceArtinMonoidHom_eq_one_of_mem_localNorm (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 @@ -250,6 +256,7 @@ noncomputable def finitePlaceGlobalArtinMonoidHom : (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. -/ @@ -354,6 +361,7 @@ theorem finitePlaceGlobalArtinMonoidHom_continuous : (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. -/ @@ -369,7 +377,7 @@ theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod_fibers let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := M) vK hvK exact Fintype.ofEquiv (AbsoluteValueExtension vK M) @@ -404,7 +412,7 @@ theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod_fibers let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := M) vK hvK exact Fintype.ofEquiv (AbsoluteValueExtension vK M) @@ -424,6 +432,7 @@ theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod_fibers 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] @@ -469,6 +478,7 @@ private theorem finitePlaceNormArtinFactor_eq_one_of_component_unit_of_unramifie (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 @@ -544,6 +554,7 @@ theorem finitePlaceNormArtinFactors_hasFiniteMulSupport (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. -/ @@ -592,7 +603,7 @@ theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v letI := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := M) vK hvK exact Fintype.ofEquiv (AbsoluteValueExtension vK M) @@ -666,6 +677,7 @@ theorem finitePlaceGlobalArtinMonoidHom_norm_eq_finprod 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. -/ @@ -720,6 +732,7 @@ theorem finitePlaceGlobalArtinMonoidHom_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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean index 40fc1fe694..803cea0b1e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean @@ -15,7 +15,7 @@ product identity. The quotient map itself factors through idele classes and therefore kills principal ideles. -/ -open scoped NumberField Classical BigOperators +open scoped NumberField BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -26,6 +26,7 @@ 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))) @@ -98,6 +99,7 @@ theorem prod_finitePlaceIdele_eq_ideleOfFiniteLocalFamily (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 @@ -116,16 +118,24 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean index 854ee5735c..1c1f24198e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean @@ -39,8 +39,8 @@ private theorem globalFinitePlaceHilbertSymbol_map_eq_local F n hnF v) (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_primitiveRoots_nonempty F n hmu v) - (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit F v a) - (GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit F v b) := by + (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 @@ -132,15 +132,15 @@ theorem finitePlaceAdicHilbertPairingFamily_finiteFactor let eCD : rootsOfUnity (n : ℕ) C ≃* rootsOfUnity (n : ℕ) D := rootsOfUnityEquivOfRingEquiv e n hmuC let aC : Cˣ := - GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit F v a + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v a let bC : Cˣ := - GlobalClassFieldTheory.Reciprocity.finitePlaceHilbert_completionUnit F v b + 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.finitePlaceHilbert_completionUnit F v x := by + GlobalClassFieldTheory.Reciprocity.finitePlaceHilbertCompletionUnit F v x := by apply Units.ext apply e.injective change e (e.symm (algebraMap F D (x : F))) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean index 804f927c82..554dfc1023 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean @@ -70,10 +70,13 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean index fbf3497f0f..4b2cbfd159 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean @@ -10,10 +10,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # 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. +This module identifies localized completions associated with conjugate extensions and proves + conjugation invariance of the resulting finite-place Artin map. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -31,6 +32,7 @@ variable {K L : Type} [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 @@ -81,6 +83,7 @@ noncomputable def finitePlaceConjugateLocalizedCompletionAlgEquiv 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 @@ -131,6 +134,7 @@ theorem finitePlaceConjugateLocalizedCompletionAlgEquiv_toAlgebraicLocalization 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 @@ -175,6 +179,7 @@ theorem 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 @@ -324,6 +329,7 @@ theorem finitePlaceDecompositionTransport_conjugate_apply ((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. -/ @@ -366,6 +372,7 @@ theorem finitePlaceDecompositionTransport_conjugate 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 @@ -428,6 +435,7 @@ theorem finitePlaceLocalArtinMonoidHom_conjugate (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 @@ -508,6 +516,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_conjugate 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean index 1ccb5c754a..9439278b23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -20,10 +20,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # 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. +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. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -41,6 +42,7 @@ variable {K L : Type} [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] @@ -51,6 +53,7 @@ theorem finitePlaceArtinCompletionIsUltrametricDist (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 @@ -62,6 +65,7 @@ noncomputable def finitePlaceArtinCompletionValued 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 @@ -74,14 +78,16 @@ noncomputable def finitePlaceArtinCompletionValuativeRel exact ValuativeRel.ofValuation (Valued.v : Valuation vF.Completion ℝ≥0) -/-- The canonical valued structure makes a locally compact finite-place completion a nonarchimedean local field. -/ +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] - [NontriviallyNormedField vF.Completion] + [(NormedField.valuation (K := vF.Completion)).IsNontrivial] [LocallyCompactSpace vF.Completion] : @@ -112,6 +118,7 @@ theorem 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 @@ -135,6 +142,7 @@ theorem finitePlaceCompletionRingEquiv_eq_relative 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 @@ -164,7 +172,7 @@ noncomputable def finitePlaceArtinMonoidHomOfExtension LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w letI : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK letI : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -209,6 +217,7 @@ noncomputable def finitePlaceArtinMonoidHomOfExtension ((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 @@ -238,7 +247,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_apply LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w letI : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK letI : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -287,6 +296,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_apply 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)) : @@ -294,6 +304,7 @@ noncomputable def finitePlaceLocalArtinInputMonoidHom (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 @@ -302,6 +313,7 @@ noncomputable def finitePlaceLocalArtinInput (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] @@ -313,6 +325,7 @@ noncomputable def finitePlaceLocalArtinCompletionValuativeRel (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 @@ -329,7 +342,7 @@ theorem let hvK : vK.IsNontrivial := RayClass.adicAbv_isNontrivial v let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -346,6 +359,7 @@ theorem 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 @@ -486,6 +500,7 @@ theorem finitePlaceLocalArtinInput_chosenLocalOrderSection_valuationMap (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] @@ -506,6 +521,7 @@ noncomputable def finitePlaceLocalArtinLocalizedAlgebra 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 @@ -534,6 +550,7 @@ theorem finitePlaceLocalArtinFiniteDimensional 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 @@ -567,7 +584,9 @@ theorem finitePlaceLocalArtinIsAbelianGalois LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w -/-- The local Artin homomorphism on the algebraic localization attached to a chosen extension of a finite place. -/ +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 @@ -594,7 +613,9 @@ noncomputable def finitePlaceLocalArtinMonoidHom vK.Completion E).comp (finitePlaceLocalArtinInputMonoidHom v) -/-- Evaluation of the localized finite-place Artin homomorphism through the canonical completion equivalence. -/ +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 @@ -616,7 +637,7 @@ theorem finitePlaceLocalArtinMonoidHom_apply LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w letI : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK letI : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -641,6 +662,7 @@ theorem finitePlaceLocalArtinMonoidHom_apply 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 @@ -671,6 +693,7 @@ theorem finitePlaceLocalArtinMonoidHom_apply_normalized (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 @@ -706,7 +729,9 @@ theorem finitePlaceLocalArtinMonoidHom_apply_normalized_at (finitePlaceLocalArtinMonoidHom_apply_normalized (K := K) (L := L) v w x) -/-- The decomposition-group inclusion transporting localized automorphisms to the global Galois group. -/ +open scoped Classical in +/-- The decomposition-group inclusion transporting localized automorphisms to the global Galois +group. -/ noncomputable def finitePlaceLocalToGlobalMonoidHom (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension @@ -731,7 +756,9 @@ noncomputable def finitePlaceLocalToGlobalMonoidHom (absoluteValueDecompositionGroup K w.1).subtype.comp eD.symm.toMonoidHom -/-- The finite-place Artin map factors through the localized Artin map and the decomposition-group inclusion. -/ +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 @@ -744,6 +771,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_factor (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. -/ @@ -782,6 +810,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_apply_normalized 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`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean index ff736d63b2..1843c8a885 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean @@ -13,10 +13,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro /-! # 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. +This module identifies the image with the chosen decomposition group and the kernel with the + chosen local norm subgroup. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -34,6 +35,7 @@ variable {K L : Type} [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 @@ -66,7 +68,7 @@ theorem chosenFinitePlaceArtinMonoidHom_range LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace @@ -131,6 +133,7 @@ theorem chosenFinitePlaceArtinMonoidHom_range ← 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 @@ -164,7 +167,7 @@ theorem chosenFinitePlaceArtinMonoidHom_ker LocalClassFieldTheory.localizedCompletion_isAbelianGalois vK hvK w let : NontriviallyNormedField vK.Completion := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace vK.Completion := AbsoluteValue.Completion.locallyCompactSpace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean index b0cbbb7c23..94e5ebf190 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -9,10 +9,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completi /-! # 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. +This module compares localized completions in a square of number fields with different base + fields and transports restriction through the corresponding decomposition groups. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -30,6 +31,7 @@ variable {K L : Type} [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] @@ -111,7 +113,9 @@ private theorem finitePlaceArtinLocalizedCompletion_algebraMap (relativeFinitePlaceCompletionAlgEquiv v).symm_apply_apply, AbsoluteValue.completionAlgebra_algebraMap] -/-- The continuous ring homomorphism between base completions attached to a finite place lying above another. -/ +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'] @@ -128,6 +132,7 @@ noncomputable def finitePlaceArtinRelativeCompletionRingHom ((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'] @@ -149,11 +154,12 @@ theorem finitePlaceArtinRelativeCompletionRingHom_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] [NumberField M] [Algebra F M] + [Field M] [Algebra F M] (v : HeightOneSpectrum (𝓞 F)) (w : AbsoluteValueExtension (NumberField.HeightOneSpectrum.adicAbv F v) M) : Type := @@ -163,6 +169,7 @@ noncomputable abbrev finitePlaceArtinLocalizedCompletion 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 @@ -183,6 +190,7 @@ noncomputable def finitePlaceArtinLocalizedCompletionBaseRingHom 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} @@ -190,8 +198,8 @@ noncomputable def finitePlaceArtinLocalizedCompletionRingHom [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'] + + [Algebra L L'] (v : HeightOneSpectrum (𝓞 K)) (W : HeightOneSpectrum (𝓞 K')) (w : AbsoluteValueExtension @@ -255,6 +263,7 @@ noncomputable def finitePlaceArtinLocalizedCompletionRingHom 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} @@ -418,6 +427,7 @@ theorem finitePlaceArtinLocalizedCompletion_towerPoint 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'] @@ -584,6 +594,7 @@ private theorem finitePlaceArtinLocalizedCompletion_globalEmbedding 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 @@ -598,6 +609,7 @@ noncomputable abbrev finitePlaceArtinLocalizedAutomorphism 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 @@ -608,7 +620,7 @@ noncomputable def finitePlaceCrossLocalRestrictionMonoidHom [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) @@ -677,6 +689,7 @@ noncomputable def finitePlaceCrossLocalRestrictionMonoidHom (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] @@ -734,6 +747,7 @@ private theorem finitePlaceDecompositionEquiv_symm_action _ = 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'] @@ -803,6 +817,7 @@ private theorem finitePlaceCrossDecompositionTransport_core (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean index 0ce4a06c76..7fc9d6597f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -9,10 +9,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # 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. +This module proves norm--restriction naturality for finite-place Artin maps in an actual square +of number fields and their chosen completed local extensions. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -30,6 +31,7 @@ variable {K L : Type} [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'] @@ -50,11 +52,13 @@ private theorem finitePlaceArtinNormUnits_map_ringEquiv 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] @@ -64,6 +68,7 @@ private abbrev finitePlaceNormLocalizedCompletion 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'] @@ -81,6 +86,7 @@ private noncomputable def finitePlaceRelativeNormUnits (finitePlaceNormCompletion K v) (finitePlaceNormCompletion K' W) +open scoped Classical in private noncomputable def finitePlaceConcreteNormUnits {K' : Type} [Field K'] [NumberField K'] [Algebra K K'] @@ -94,6 +100,7 @@ private noncomputable def finitePlaceConcreteNormUnits 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'] @@ -188,6 +195,7 @@ private theorem finitePlaceArtinConcreteNormUnits ((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] @@ -240,6 +248,7 @@ private theorem finitePlaceArtinHasExtension_of_norm 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'] @@ -332,6 +341,7 @@ private theorem finitePlaceArtinCompletionHasExtension (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] @@ -358,6 +368,7 @@ private theorem finitePlaceLocalArtin_norm_restriction_apply (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] @@ -404,150 +415,257 @@ local notation "Eₙ" => 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ₙ := - absoluteValueExtension_completionNontriviallyNormedField + 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ₙ := - absoluteValueExtension_completionNontriviallyNormedField + 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 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) @@ -567,6 +685,7 @@ private noncomputable def finitePlaceNormRestrictedArtin (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ₙˣ) : @@ -578,12 +697,14 @@ private noncomputable def finitePlaceNormLowerArtin (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ₙˣ) : @@ -593,6 +714,7 @@ private noncomputable def finitePlaceNormLowerRawArtin (finitePlaceRelativeNormUnits (K := K) (K' := K') v W hW y) +open scoped Classical in private theorem finitePlaceNormUpperArtin_eq_raw (y : Dₙˣ) : finitePlaceLocalArtinMonoidHom @@ -613,6 +735,7 @@ private theorem finitePlaceNormUpperArtin_eq_raw rw [hy] rfl +open scoped Classical in private theorem finitePlaceNormLowerArtin_eq_raw (hW : finitePlaceBelow (K := K) W = v) (y : Dₙˣ) : @@ -641,6 +764,7 @@ private theorem finitePlaceNormLowerArtin_eq_raw rw [hy] rfl +open scoped Classical in private theorem finitePlaceNormRawArtin_naturality [NumberField L] (hW : finitePlaceBelow (K := K) W = v) @@ -714,6 +838,7 @@ private theorem finitePlaceNormRawArtin_naturality (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) @@ -759,6 +884,7 @@ private theorem finitePlaceNormLocalizedArtin_naturality (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} @@ -810,6 +936,7 @@ private theorem _ = _ := 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 @@ -908,6 +1035,7 @@ theorem finitePlaceLocalArtinMonoidHom_norm_restriction 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 @@ -1029,6 +1157,7 @@ theorem (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 @@ -1151,6 +1280,7 @@ theorem chosenFinitePlaceArtinMonoidHom_norm_restriction (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean index aceefa2735..7dba07e6ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -8,10 +8,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro /-! # 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. +This module restricts finite-place extensions through an intermediate field and proves + restriction naturality for the corresponding global Artin homomorphisms. -/ -open scoped Classical IsMulCommutative NNReal NumberField +open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain noncomputable section @@ -29,6 +30,7 @@ variable {K L : Type} [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 @@ -52,6 +54,7 @@ def restrictFinitePlaceExtension 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 @@ -104,13 +107,14 @@ theorem absoluteValueCompletionMap_comp_of_isScalarTower 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] [IsGalois K E] + [FiniteDimensional K E] (v : HeightOneSpectrum (𝓞 K)) (wL : AbsoluteValueExtension (NumberField.HeightOneSpectrum.adicAbv K v) L) : @@ -186,6 +190,7 @@ noncomputable def finitePlaceRestrictedLocalizedCompletionAlgHom 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 @@ -251,6 +256,7 @@ theorem finitePlaceRestrictedLocalizedCompletionAlgHom_toAlgebraicLocalization AbsoluteValue.completionMap_coe] omit [NumberField K] [FiniteDimensional K L] in +open scoped Classical in /-- A compatible embedding of algebraic localizations carries restriction of decomposition-group elements to restriction of the corresponding local automorphisms. -/ @@ -443,6 +449,7 @@ theorem decompositionGroupEquivAlgebraicLocalizationAut_restrict_of_commutes ((rhoE.1 : E ≃ₐ[K] E) z)) := by rw [hlocalization] +open scoped Classical in private noncomputable def finitePlaceLocalRestrictionMonoidHom {E : Type} [Field E] [Algebra K E] [Algebra E L] @@ -496,6 +503,7 @@ private noncomputable def finitePlaceLocalRestrictionMonoidHom 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. -/ @@ -564,6 +572,7 @@ theorem finitePlaceDecompositionTransport_restrict_tower_apply 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. -/ @@ -625,6 +634,7 @@ theorem finitePlaceDecompositionTransport_restrict_tower 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 @@ -701,6 +711,7 @@ theorem finitePlaceLocalArtinMonoidHom_restrict_tower (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 @@ -778,6 +789,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_restrict_tower (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean index 5d2bbff148..1ee987f2b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean @@ -15,7 +15,7 @@ geometric finite-place construction. Its local Artin image is therefore inverse arithmetic Frobenius in the actual chosen completion. -/ -open scoped Classical NumberField ValuativeRel +open scoped NumberField ValuativeRel open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations LocalFieldTheory @@ -29,6 +29,7 @@ variable {K L : Type} [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)) @@ -51,6 +52,7 @@ noncomputable def chosenFinitePlaceLocalArithmeticFrobenius 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean index 7dc67c3f33..e60b192efa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -291,11 +291,11 @@ theorem numberFieldCyclotomicZHatFiniteCompositum F E let : Algebra ℚ C := C.algebra' let : Algebra F C := - numberFieldCyclotomicZHatFiniteCompositum_algebra F E + numberFieldCyclotomicZHatFiniteCompositumAlgebra F E let : IsScalarTower ℚ F C := numberFieldCyclotomicZHatFiniteCompositum_scalarTower F E let : Algebra E C := - rationalCyclotomicZHatFiniteLayerCompositum_algebra F E + rationalCyclotomicZHatFiniteLayerCompositumAlgebra F E let : IsScalarTower ℚ E C := rationalCyclotomicZHatFiniteLayerCompositum_scalarTower F E let A : IntermediateField ℚ C := @@ -480,11 +480,11 @@ theorem numberFieldCyclotomicZHatCompositumRestriction_range let C := numberFieldCyclotomicZHatCompositum F let : Algebra ℚ C := C.algebra' let : Algebra F C := - numberFieldCyclotomicZHatCompositum_algebra F + numberFieldCyclotomicZHatCompositumAlgebra F let : IsScalarTower ℚ F C := numberFieldCyclotomicZHatCompositum_scalarTower F let : Algebra rationalCyclotomicZHatField C := - rationalCyclotomicZHatCompositum_algebra F + rationalCyclotomicZHatCompositumAlgebra F let : IsScalarTower ℚ rationalCyclotomicZHatField C := rationalCyclotomicZHatCompositum_scalarTower F let : Normal ℚ rationalCyclotomicZHatField := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean index 43f31a40d5..510e874546 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean @@ -16,7 +16,7 @@ on ideles is the product of its archimedean and finite-place local Artin factors. -/ -open scoped BigOperators Classical IsMulCommutative NumberField +open scoped BigOperators IsMulCommutative NumberField NumberField.LiesOver open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -31,6 +31,7 @@ variable {K L : Type} [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. -/ @@ -41,6 +42,7 @@ noncomputable def globalArtinMonoidHom : finitePlaceGlobalArtinMonoidHom (K := K) (L := L) +open scoped Classical in /-- The preliminary global Artin homomorphism is continuous. -/ theorem globalArtinMonoidHom_continuous : Continuous @@ -51,6 +53,7 @@ theorem globalArtinMonoidHom_continuous : (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 @@ -73,6 +76,7 @@ theorem globalArtinMonoidHom_apply 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. -/ @@ -121,6 +125,7 @@ theorem globalArtinMonoidHom_relativeIdeleNorm_eq_one (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 @@ -145,6 +150,7 @@ theorem globalArtinMonoidHom_ideleNorm_eq_one ((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 @@ -214,6 +220,7 @@ theorem globalArtinMonoidHom_norm_eq_place_products 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 @@ -251,6 +258,7 @@ theorem restrict_globalArtinMonoidHom_apply (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. -/ @@ -313,6 +321,7 @@ theorem globalArtinMonoidHom_norm_restriction 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 @@ -370,6 +379,7 @@ theorem globalArtinMonoidHom_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] @@ -419,6 +429,7 @@ theorem globalArtinMonoidHom_infinitePlaceIdele 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] @@ -440,6 +451,7 @@ theorem globalArtinMonoidHom_finitePlaceIdele 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 @@ -457,6 +469,7 @@ theorem finitePlaceDecompositionGroup_le_globalArtinMonoidHom_range 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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean index 23600c9ca5..4074c84641 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean @@ -31,7 +31,7 @@ it is the canonical surjective reciprocity homomorphism and has the genuine idele-class norm range as its kernel. -/ -open scoped NumberField Classical BigOperators IsMulCommutative +open scoped NumberField BigOperators IsMulCommutative open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -46,6 +46,7 @@ variable [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. -/ @@ -141,6 +142,7 @@ theorem (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. -/ @@ -171,6 +173,7 @@ theorem globalArtinMonoidHom_principalIdele ⟨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. -/ @@ -192,6 +195,7 @@ theorem chosenLocalArtin_product_principalIdele 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 : @@ -208,9 +212,9 @@ noncomputable def globalIdeleClassArtinMonoidHom : 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. -/ -@[simp] theorem globalIdeleClassArtinMonoidHom_mk (a : IdeleGroup K) : globalIdeleClassArtinMonoidHom @@ -221,6 +225,7 @@ theorem globalIdeleClassArtinMonoidHom_mk 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 : @@ -238,6 +243,7 @@ theorem globalIdeleClassArtinMonoidHom_continuous : 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 : @@ -249,6 +255,7 @@ noncomputable def globalIdeleClassArtinContinuousMonoidHom : globalIdeleClassArtinMonoidHom_continuous (K := K) (L := L) +open scoped Classical in /-- The descended local-product Artin homomorphism is the canonical global norm-residue homomorphism. -/ theorem @@ -274,6 +281,7 @@ theorem (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 @@ -292,6 +300,7 @@ theorem (globalIdeleClassArtinMonoidHom_eq_globalNormResidueMonoidHom (K := K) (L := L)) c +open scoped Classical in /-- The descended global Artin homomorphism is surjective. -/ theorem globalIdeleClassArtinMonoidHom_surjective : Function.Surjective @@ -301,6 +310,7 @@ theorem globalIdeleClassArtinMonoidHom_surjective : 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] @@ -312,6 +322,7 @@ theorem globalIdeleClassArtinMonoidHom_ker : 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean index f45b3309d0..efa12526ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean @@ -24,7 +24,7 @@ idele-class norm quotient may be evaluated on this finite-support approximation. -/ -open scoped NumberField TensorProduct Classical BigOperators +open scoped NumberField TensorProduct BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -33,6 +33,7 @@ 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] : @@ -47,6 +48,7 @@ variable [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 @@ -55,6 +57,7 @@ noncomputable def globalArtinFiniteSupport (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] @@ -70,6 +73,7 @@ theorem mem_globalArtinFiniteSupport_iff (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 @@ -85,9 +89,9 @@ noncomputable def artinFiniteSupportApproximation finitePlaceIdele v.1 (IdeleGroup.finiteComponent v.1 a) +open scoped Classical in /-- The finite-support Artin approximation retains every infinite component. -/ -@[simp] theorem artinFiniteSupportApproximation_infiniteComponent (a : IdeleGroup K) (w : InfinitePlace K) : @@ -118,6 +122,7 @@ theorem artinFiniteSupportApproximation_infiniteComponent · 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 @@ -176,9 +181,9 @@ theorem artinFiniteSupportApproximation_finiteComponent 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. -/ -@[simp] theorem artinFiniteSupportApproximation_finiteComponent_of_mem (a : IdeleGroup K) (v : HeightOneSpectrum (𝓞 K)) @@ -192,9 +197,9 @@ theorem artinFiniteSupportApproximation_finiteComponent_of_mem rw [artinFiniteSupportApproximation_finiteComponent, ite_eq_left hv] +open scoped Classical in /-- Away from the Artin support, the finite-support approximation has trivial finite component. -/ -@[simp] theorem artinFiniteSupportApproximation_finiteComponent_of_notMem (a : IdeleGroup K) (v : HeightOneSpectrum (𝓞 K)) @@ -208,6 +213,7 @@ theorem artinFiniteSupportApproximation_finiteComponent_of_notMem rw [artinFiniteSupportApproximation_finiteComponent, ite_eq_right hv] +open scoped Classical in /-- The quotient of an idele by its finite-support Artin approximation is an actual relative-idele norm. -/ theorem @@ -272,6 +278,7 @@ theorem 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] @@ -296,6 +303,7 @@ theorem globalNormClassFromIdele_relativeIdeleNorm_eq_one 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 @@ -325,6 +333,7 @@ theorem globalArtinMonoidHom_eq_artinFiniteSupportApproximation 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean index 3e483a4592..2b6735db9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean @@ -20,7 +20,7 @@ local definition with the root character of the finite-place global Artin automorphism without building that comparison into the definition. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -34,6 +34,7 @@ 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 @@ -63,6 +64,7 @@ theorem rootQuotient_eq_of_same_pow_of_primitiveRoots (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 @@ -75,6 +77,7 @@ theorem rootQuotient_map_algEquiv 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. -/ @@ -104,6 +107,7 @@ theorem isSplittingField_X_pow_sub_C_of_root_adjoin_eq_top_of_primitiveRoots 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)) : @@ -116,6 +120,7 @@ theorem finitePlaceHilbert_natCast_ne_zero (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)) : @@ -129,15 +134,17 @@ theorem finitePlaceHilbert_primitiveRoots_nonempty (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 finitePlaceHilbert_completionUnit +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 @@ -155,9 +162,10 @@ noncomputable def finitePlaceLocalHilbertSymbol LocalClassFieldTheory.Kummer.localHilbertSymbol C n (finitePlaceHilbert_natCast_ne_zero K n hnK v) (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) - (finitePlaceHilbert_completionUnit K v a) - (finitePlaceHilbert_completionUnit K v b) + (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 @@ -169,6 +177,7 @@ noncomputable def finitePlaceHilbertSymbol (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 @@ -190,6 +199,7 @@ theorem finitePlaceHilbertSymbol_map_eq_localHilbertSymbol (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)`. @@ -215,6 +225,7 @@ noncomputable def finitePlaceKummerRootCharacterOfExtension (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 @@ -244,6 +255,7 @@ theorem finitePlaceKummerRootCharacterOfExtension_eq_of_extensions 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 @@ -260,6 +272,7 @@ noncomputable def finitePlaceKummerRootCharacter 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean index 84ba58c7bf..b19d2c56e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean @@ -16,7 +16,7 @@ localized completion and its instance tower occur only in the provider body which proves compatibility with the two Artin actions. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -31,6 +31,7 @@ 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] @@ -44,6 +45,7 @@ private theorem nthRootsSubgroupMap_comp_eq_unitsMap 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] @@ -59,6 +61,7 @@ private theorem rootQuotient_map_ringHom_of_action 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. -/ @@ -117,6 +120,7 @@ private theorem finitePlaceArtin_apply_localized 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) @@ -135,6 +139,7 @@ private noncomputable def finitePlaceKummerGlobalArtinAutomorphism 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) @@ -145,8 +150,8 @@ private noncomputable def finitePlaceKummerLocalArtinAutomorphism 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 := finitePlaceHilbert_completionUnit K v a - let bC := finitePlaceHilbert_completionUnit K v b + let aC := finitePlaceHilbertCompletionUnit K v a + let bC := finitePlaceHilbertCompletionUnit K v b letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v letI : IsNonarchimedeanLocalField C := @@ -155,6 +160,7 @@ private noncomputable def finitePlaceKummerLocalArtinAutomorphism 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 @@ -178,6 +184,7 @@ private noncomputable def finitePlaceKummerGlobalToLocalRingHom 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 @@ -216,6 +223,7 @@ private theorem finitePlaceKummerGlobalToLocalRingHom_commutes _ = 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) @@ -230,7 +238,7 @@ private noncomputable def let C := finitePlaceKummerBaseCompletion K v let S := finitePlaceKummerLocalExtension K n hnK v b let E := finitePlaceKummerLocalizedCompletion K n hnK v b w - let aC := finitePlaceHilbert_completionUnit K v a + let aC := finitePlaceHilbertCompletionUnit K v a letI : FiniteDimensional K (chosenSimpleKummerExtension K n hnK b) := chosenSimpleKummerExtension_finiteDimensional K n hnK b @@ -253,6 +261,7 @@ private noncomputable def 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) @@ -270,8 +279,8 @@ private theorem finitePlaceKummerLocalArtin_eq_transported 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 := finitePlaceHilbert_completionUnit K v a - let bC := finitePlaceHilbert_completionUnit K v b + 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 := @@ -311,6 +320,7 @@ private theorem finitePlaceKummerLocalArtin_eq_transported 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] @@ -334,6 +344,7 @@ private noncomputable def localizedDirectActionValue 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) @@ -347,7 +358,7 @@ private noncomputable def finitePlaceKummerCommonRootAction 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 := finitePlaceHilbert_completionUnit K v a + let aC := finitePlaceHilbertCompletionUnit K v a letI : FiniteDimensional K L := chosenSimpleKummerExtension_finiteDimensional K n hnK b letI : IsAbelianGalois K L := @@ -370,6 +381,7 @@ private noncomputable def finitePlaceKummerCommonRootAction 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) @@ -389,7 +401,7 @@ private theorem finitePlaceKummerTransportedArtinRoot_eq_common 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 := finitePlaceHilbert_completionUnit K v a + let aC := finitePlaceHilbertCompletionUnit K v a let : FiniteDimensional K L := chosenSimpleKummerExtension_finiteDimensional K n hnK b let : IsAbelianGalois K L := @@ -442,6 +454,7 @@ private theorem finitePlaceKummerTransportedArtinRoot_eq_common _ = 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] @@ -455,6 +468,7 @@ private noncomputable def localizedInputActionValue (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] @@ -469,6 +483,7 @@ private noncomputable def localizedGlobalActionValue (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] @@ -480,6 +495,7 @@ private theorem localizedActionValue_eq 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) @@ -496,6 +512,7 @@ private noncomputable def finitePlaceKummerLocalizedInputValue (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) @@ -512,6 +529,7 @@ private noncomputable def finitePlaceKummerLocalizedGlobalValue (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) @@ -530,6 +548,7 @@ private theorem finitePlaceKummerLocalizedValue_eq (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) @@ -560,7 +579,7 @@ private theorem finitePlaceKummerCommonImage_eq_localizedInputValue let vK := NumberField.HeightOneSpectrum.adicAbv K v let x : (v.adicCompletion K)ˣ := Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a - let aC : Cˣ := finitePlaceHilbert_completionUnit K v 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 @@ -579,6 +598,7 @@ private theorem finitePlaceKummerCommonImage_eq_localizedInputValue unfold finitePlaceKummerLocalizedInputValue localizedInputActionValue rfl +open scoped Classical in private theorem finitePlaceKummerGlobalArtin_localized_action (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) @@ -607,6 +627,7 @@ private theorem finitePlaceKummerGlobalArtin_localized_action 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) @@ -626,7 +647,7 @@ private theorem finitePlaceKummerCommonRootAction_eq_global 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 := finitePlaceHilbert_completionUnit K v a + 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 := @@ -664,6 +685,7 @@ private theorem finitePlaceKummerCommonRootAction_eq_global 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) @@ -683,6 +705,7 @@ private theorem finitePlaceKummerTransportedArtin_root_action (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 @@ -723,6 +746,7 @@ private theorem finitePlaceKummerGlobalToLocalRingHom_artin_action 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 @@ -737,7 +761,7 @@ private theorem finitePlaceKummerGlobalToLocalRingHom_root_pow let f := finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w let uL := chosenSimpleKummerRootUnit K n hnK b - let bC := finitePlaceHilbert_completionUnit K v 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 @@ -746,7 +770,7 @@ private theorem finitePlaceKummerGlobalToLocalRingHom_root_pow let f := finitePlaceKummerGlobalToLocalRingHom K n hnK hmu v b w let uL : Lˣ := chosenSimpleKummerRootUnit K n hnK b - let bC := finitePlaceHilbert_completionUnit K v b + let bC := finitePlaceHilbertCompletionUnit K v b have huLpow : uL ^ (n : ℕ) = Units.map (algebraMap K L).toMonoidHom b := chosenSimpleKummerRootUnit_pow K n hnK b @@ -764,6 +788,7 @@ private theorem finitePlaceKummerGlobalToLocalRingHom_root_pow (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) @@ -810,6 +835,7 @@ private theorem finitePlaceKummerMappedGlobalCharacter_units 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) @@ -825,7 +851,7 @@ private theorem finitePlaceKummerRootQuotient_eq_local let uL := chosenSimpleKummerRootUnit K n hnK b let uS := chosenSimpleKummerRootUnit C n (finitePlaceHilbert_natCast_ne_zero K n hnK v) - (finitePlaceHilbert_completionUnit K v b) + (finitePlaceHilbertCompletionUnit K v b) let sigmaG := finitePlaceKummerGlobalArtinAutomorphism K n hnK hmu v a b w let sigmaS := finitePlaceKummerLocalArtinAutomorphism @@ -838,7 +864,7 @@ private theorem finitePlaceKummerRootQuotient_eq_local 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 := finitePlaceHilbert_completionUnit K v b + 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 @@ -877,6 +903,7 @@ private theorem finitePlaceKummerRootQuotient_eq_local 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) @@ -885,7 +912,7 @@ private theorem finitePlaceKummerLocalHilbert_units let S := finitePlaceKummerLocalExtension K n hnK v b let uS := chosenSimpleKummerRootUnit C n (finitePlaceHilbert_natCast_ne_zero K n hnK v) - (finitePlaceHilbert_completionUnit K v b) + (finitePlaceHilbertCompletionUnit K v b) let sigmaS := finitePlaceKummerLocalArtinAutomorphism K n hnK hmu v a b Units.map (algebraMap C S).toMonoidHom @@ -895,8 +922,8 @@ private theorem finitePlaceKummerLocalHilbert_units 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 := finitePlaceHilbert_completionUnit K v a - let bC := finitePlaceHilbert_completionUnit K v b + let aC := finitePlaceHilbertCompletionUnit K v a + let bC := finitePlaceHilbertCompletionUnit K v b let : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v let : IsNonarchimedeanLocalField C := @@ -930,6 +957,7 @@ private theorem finitePlaceKummerLocalHilbert_units 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 @@ -957,7 +985,7 @@ theorem finitePlaceKummerRootCharacterOfExtension_localGlobal finitePlaceLocalHilbertSymbol K n hnK hmu v a b let uS : Sˣ := chosenSimpleKummerRootUnit C n (finitePlaceHilbert_natCast_ne_zero K n hnK v) - (finitePlaceHilbert_completionUnit K v b) + (finitePlaceHilbertCompletionUnit K v b) let sigmaS : Gal(S/C) := finitePlaceKummerLocalArtinAutomorphism K n hnK hmu v a b @@ -990,6 +1018,7 @@ theorem finitePlaceKummerRootCharacterOfExtension_localGlobal 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean index e918505c64..ef264984bf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean @@ -14,7 +14,7 @@ and splitting-field data are named separately so downstream proofs do not rebuild the localized-completion instance tower. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -28,11 +28,13 @@ 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) @@ -43,6 +45,7 @@ abbrev finitePlaceKummerLocalizedCompletion LocalizedCompletion (NumberField.HeightOneSpectrum.adicAbv K v) w +open scoped Classical in /-- The canonical completion algebra for the localized global Kummer extension. -/ @[reducible] @@ -57,6 +60,7 @@ noncomputable def finitePlaceKummerLocalizedAlgebra 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 @@ -75,6 +79,7 @@ theorem finitePlaceKummerLocalizedFiniteDimensional 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 @@ -89,6 +94,7 @@ noncomputable def finitePlaceKummerLocalizedRootUnit (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 @@ -104,7 +110,7 @@ theorem finitePlaceKummerLocalizedRootUnit_pow Units.map (algebraMap (finitePlaceKummerBaseCompletion K v) (finitePlaceKummerLocalizedCompletion K n hnK v b w)).toMonoidHom - (finitePlaceHilbert_completionUnit K v b) := by + (finitePlaceHilbertCompletionUnit K v b) := by let vK := NumberField.HeightOneSpectrum.adicAbv K v have hroot_val : (((chosenSimpleKummerRootUnit K n hnK b : @@ -123,7 +129,7 @@ theorem finitePlaceKummerLocalizedRootUnit_pow finitePlaceKummerLocalizedAlgebra K n hnK v b w apply Units.ext simp only [finitePlaceKummerLocalizedRootUnit, - finitePlaceHilbert_completionUnit, Units.val_pow_eq_pow_val, Units.coe_map] + 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 : ℕ) = @@ -139,6 +145,7 @@ theorem finitePlaceKummerLocalizedRootUnit_pow 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 @@ -172,6 +179,7 @@ theorem finitePlaceKummerLocalizedRoot_adjoin_eq_top (((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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean index 7050f278d5..83b968ef6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean @@ -16,7 +16,7 @@ theorem for those Artin factors; no second ramification-support construction is needed here. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -29,6 +29,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean index 29b90c698e..e3262811c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean @@ -16,7 +16,7 @@ as separate declarations so the eventual root-character comparison does not rebuild their instance towers. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -29,6 +29,7 @@ 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 @@ -37,6 +38,7 @@ abbrev finitePlaceKummerPolynomial 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 @@ -45,8 +47,9 @@ noncomputable abbrev finitePlaceKummerLocalExtension chosenSimpleKummerExtension (finitePlaceKummerBaseCompletion K v) n (finitePlaceHilbert_natCast_ne_zero K n hnK v) - (finitePlaceHilbert_completionUnit K v b) + (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. -/ @@ -55,7 +58,7 @@ theorem finitePlaceLocalArtinInput_globalUnit finitePlaceLocalArtinInput v (Units.map (algebraMap K (v.adicCompletion K)).toMonoidHom a) = - finitePlaceHilbert_completionUnit K v a := by + finitePlaceHilbertCompletionUnit K v a := by apply Units.ext apply (finitePlaceCompletionRingEquiv v).injective let x : (v.adicCompletion K)ˣ := @@ -76,7 +79,7 @@ theorem finitePlaceLocalArtinInput_globalUnit (x : v.adicCompletion K) := hleft _ = algebraMap K (v.adicCompletion K) (a : K) := rfl _ = finitePlaceCompletionRingEquiv v - (finitePlaceHilbert_completionUnit K v a : + (finitePlaceHilbertCompletionUnit K v a : finitePlaceKummerBaseCompletion K v) := by change algebraMap K (v.adicCompletion K) (a : K) = @@ -85,6 +88,7 @@ theorem finitePlaceLocalArtinInput_globalUnit 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 @@ -95,8 +99,9 @@ theorem finitePlaceKummerLocalFiniteDimensional chosenSimpleKummerExtension_finiteDimensional (finitePlaceKummerBaseCompletion K v) n (finitePlaceHilbert_natCast_ne_zero K n hnK v) - (finitePlaceHilbert_completionUnit K v b) + (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 @@ -109,7 +114,7 @@ theorem finitePlaceKummerLocal_isSplittingField (finitePlaceKummerPolynomial K n v b) := by let C := finitePlaceKummerBaseCompletion K v let hnC := finitePlaceHilbert_natCast_ne_zero K n hnK v - let bC := finitePlaceHilbert_completionUnit K v b + let bC := finitePlaceHilbertCompletionUnit K v b let S := chosenSimpleKummerExtension C n hnC bC let : FiniteDimensional C S := finitePlaceKummerLocalFiniteDimensional K n hnK v b @@ -124,6 +129,7 @@ theorem finitePlaceKummerLocal_isSplittingField 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; diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean index 05506d8a18..39acbed180 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean @@ -15,7 +15,7 @@ the quadratic one: its value is `-1` exactly when both arguments are negative. The definition below records that evaluation directly in `μₙ(K)`. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -27,6 +27,7 @@ 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. -/ @@ -47,6 +48,7 @@ noncomputable def infinitePlaceHilbertSymbol · 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 @@ -58,6 +60,7 @@ theorem infinitePlaceHilbertSymbol_eq_one_of_isComplex simp [infinitePlaceHilbertSymbol, hvNotReal] omit [NumberField K] in +open scoped Classical in /-- Away from the quadratic exponent, every infinite-place factor is trivial. -/ @[simp] @@ -68,6 +71,7 @@ theorem infinitePlaceHilbertSymbol_eq_one_of_ne_two 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ˣ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean index 7ff5c1273f..ce72214029 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean @@ -16,7 +16,7 @@ is completed here. The real quadratic action is kept as the next arithmetic leaf rather than being introduced as an assumption. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -28,6 +28,7 @@ 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 @@ -49,8 +50,9 @@ noncomputable def infinitePlaceKummerRootCharacter (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] [NumberField L] [Algebra K L] [IsGalois K L] + {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 @@ -69,6 +71,7 @@ private theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_isComplex rw [dite_eq_left hwUnramified'] rfl +open scoped Classical in /-- At a complex place the infinite-place Kummer root character is trivial. -/ @[simp] @@ -96,6 +99,7 @@ theorem infinitePlaceKummerRootCharacter_eq_one_of_isComplex (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean index f750890f29..6814a9d9f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean @@ -9,7 +9,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro # The negative-negative real infinite-place Hilbert factor -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -21,6 +21,7 @@ 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 @@ -90,6 +91,7 @@ theorem infinitePlaceKummerRootCharacter_eq_neg_one_of_real_of_neg_neg 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean index a8ea59cae8..65bcd396b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean @@ -10,7 +10,7 @@ import Mathlib.Analysis.Complex.Order # Complex conjugation on a negative quadratic Kummer root -/ -open scoped Classical ComplexConjugate ComplexOrder NumberField +open scoped ComplexConjugate ComplexOrder NumberField open NumberField noncomputable section @@ -22,6 +22,7 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean index bac55e873c..8572703ccc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean @@ -9,7 +9,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro # Negative units and the real infinite-place Artin map -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -19,6 +19,7 @@ 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 @@ -31,6 +32,7 @@ private theorem ringEquiv_unit_div_neg_one _ = -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) : @@ -41,10 +43,11 @@ private theorem monoidHom_eq_of_div_apply_eq_one _ = 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] [NumberField L] [Algebra K L] [IsGalois K L] + {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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean index 07c7c196bd..2cc743b415 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean @@ -16,7 +16,7 @@ norm subgroup all of the completion units, so the actual infinite-place Artin automorphism and its Kummer root character are trivial. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -28,6 +28,7 @@ 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 @@ -75,6 +76,7 @@ theorem infinitePlaceKummerRootCharacter_eq_one_of_real_of_radical_pos (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean index 40966ed707..d0f4d31d13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean @@ -9,7 +9,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro # Ramification of a negative quadratic Kummer radical at a real place -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -22,6 +22,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean index dabf65d1b8..da7890e4ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean @@ -9,7 +9,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Recipro # Complete infinite-place Kummer root-character comparison -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -22,6 +22,7 @@ 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 @@ -55,6 +56,7 @@ theorem infinitePlaceKummerRootCharacter_eq_one_of_real_of_left_pos 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 @@ -74,6 +76,7 @@ theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_left_pos 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) @@ -110,6 +113,7 @@ theorem infinitePlaceKummerRootCharacter_localGlobal_of_real_of_two 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean index e886662a44..e6d8f7505a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean @@ -13,7 +13,7 @@ This is the arithmetic input for the positive-radicand branch of the real infinite-place Hilbert-symbol comparison. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField noncomputable section @@ -24,6 +24,7 @@ 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 @@ -42,6 +43,7 @@ theorem realInfinitePlace_globalUnit_realCoordinate 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index c6ab5248e3..e13603e6c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -422,7 +422,6 @@ theorem globalNormResidueMonoidHom_eq_maximalUnramifiedRestriction /-- An idele class has trivial global norm-residue symbol exactly when it is an actual idele-class norm from `L`. -/ -@[simp] theorem globalNormResidueMonoidHom_eq_one_iff (c : IdeleClassGroup K) : globalNormResidueMonoidHom K L c = 1 ↔ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean index f4b32de905..b5326bba70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -381,7 +381,6 @@ theorem globalNormResidueAbelianizationMonoidHom_finiteNormClass /-- An idele class has trivial finite-Galois norm-residue symbol exactly when it is an actual idele-class norm from `L`. -/ -@[simp] theorem globalNormResidueAbelianizationMonoidHom_eq_one_iff (c : IdeleClassGroup K) : globalNormResidueAbelianizationMonoidHom K L c = 1 ↔ @@ -466,7 +465,6 @@ theorem globalNormResidueAbelianizationIdeleMonoidHom_apply /-- The finite-Galois norm-residue symbol on ideles is trivial on every principal idele. -/ -@[simp] theorem globalNormResidueAbelianizationIdeleMonoidHom_principalIdele (x : Kˣ) : globalNormResidueAbelianizationIdeleMonoidHom K L @@ -505,7 +503,6 @@ theorem globalNormResidueAbelianizationIdeleMonoidHom_surjective : /-- An idele has trivial finite-Galois norm-residue symbol exactly when its idele class is an actual norm from `L`. -/ -@[simp] theorem globalNormResidueAbelianizationIdeleMonoidHom_eq_one_iff (a : IdeleGroup K) : globalNormResidueAbelianizationIdeleMonoidHom K L a = 1 ↔ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean index 42dc9ee176..f2867525a0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -107,7 +107,7 @@ private theorem omit [NumberField K] [NumberField M] [NumberField N] in private theorem commonTopIntermediateTopIsGalois - [FiniteDimensional K N] [IsGalois K N] : IsGalois M N := + [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index aa5c5fab0c..3ea4c8dd06 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -2290,7 +2290,7 @@ noncomputable local instance local instance numberFieldEmbeddedBaseChangeRelativeFixedFieldScalarTower - [FiniteDimensional K K'] [IsGalois K K'] + (j : L' →ₐ[ℚ] SeparableClosure ℚ) : IsScalarTower ℚ (abstractFixedField ℚ (SeparableClosure ℚ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean index ca934723e9..1706ff0018 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean @@ -17,7 +17,7 @@ of the product of the corresponding local Artin factors. Global reciprocity on a principal idele therefore makes this product equal to one. -/ -open scoped BigOperators Classical IsMulCommutative NumberField +open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain noncomputable section @@ -29,6 +29,7 @@ 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) @@ -37,6 +38,7 @@ private theorem map_product_mul_finprod 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 @@ -49,6 +51,7 @@ noncomputable def globalHilbertProduct ∏ᶠ 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. -/ @@ -172,6 +175,7 @@ theorem globalHilbertProduct_principal 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index e64da75e77..ce05c8f7e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -123,7 +123,6 @@ private noncomputable instance : (RelativeIdeleGroup.ClassGroup ℚ E) := fun E => (rationalAbsoluteGaloisIdeleClassAction E).toSMul -@[simp] theorem rationalAbsoluteGaloisIdeleClass_smul_mk (E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ)) (σ : SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean index 4821b459ee..0358906bbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -31,11 +31,11 @@ open CyclicCohomology private noncomputable instance rationalAbstractTowerClassGroupCommGroup (F E : Type) - [Field F] [NumberField F] - [Field E] [NumberField E] + [Field F] + [Field E] [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] - [IsScalarTower ℚ F E] - [FiniteDimensional ℚ F] [FiniteDimensional F E] : + + : CommGroup (TowerRelativeIdeleGroup.ClassGroup ℚ F E) := by letI : CommGroup (TowerRelativeIdeleGroup ℚ F E) := inferInstance @@ -69,8 +69,8 @@ private noncomputable instance rationalAbstractRelativeClassGroupCommGroup (F E : Type) [Field F] [NumberField F] - [Field E] [NumberField E] - [Algebra F E] [FiniteDimensional F E] : + [Field E] + [Algebra F E] : CommGroup (RelativeIdeleGroup.ClassGroup F E) := by letI : CommGroup (RelativeIdeleGroup F E) := inferInstance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean index c6fd180388..feea1bb9ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean @@ -65,8 +65,8 @@ private theorem eq_of_common_ofMul_image private noncomputable def relativeIdeleClassNormAdditiveValue (F E : Type) [Field F] [NumberField F] - [Field E] [NumberField E] - [Algebra F E] [FiniteDimensional F E] [IsGalois F E] + [Field E] + [Algebra F E] [FiniteDimensional F E] (c : Additive (RelativeIdeleGroup.ClassGroup F E)) : Additive (IdeleClassGroup F) := Additive.ofMul @@ -76,8 +76,8 @@ private noncomputable def relativeIdeleClassNormAdditiveValue private noncomputable def includedRelativeIdeleClassNormAdditiveValue (F E : Type) [Field F] [NumberField F] - [Field E] [NumberField E] - [Algebra F E] [FiniteDimensional F E] [IsGalois F E] + [Field E] + [Algebra F E] [FiniteDimensional F E] (c : Additive (RelativeIdeleGroup.ClassGroup F E)) : Additive (RelativeIdeleGroup.ClassGroup F E) := Additive.ofMul diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean index 72c8501bc4..6c98b274f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean @@ -106,7 +106,8 @@ theorem rationalRelativeIdeleEmbedding_unflatten (relativeAdeleRingIntermediateAlgebra ℚ K) (@smulCommClass_self K (RelativeAdeleRing ℚ K) inferInstance (@Algebra.toModule K (RelativeAdeleRing ℚ K) inferInstance inferInstance - (relativeAdeleRingIntermediateAlgebra ℚ K)).toDistribMulAction.toMulAction)).toMonoidHom a : + (relativeAdeleRingIntermediateAlgebra ℚ + K)).toDistribMulAction.toMulAction)).toMonoidHom a : TowerRelativeIdeleGroup ℚ K N) := by let : Algebra K N := (IntermediateField.inclusion hKN).toRingHom.toAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean index 480d13d673..48c59d7135 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean @@ -98,7 +98,8 @@ noncomputable def rationalIntermediateIdeleClassToNormalClosure [FiniteDimensional ℚ K] : IdeleClassGroup K →* RelativeIdeleGroup.ClassGroup ℚ (rationalNormalClosure K) := - (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K))).comp + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion + (IntermediateField.le_normalClosure K))).comp (_root_.relativeIdeleClassBaseChangeMulEquiv (K := ℚ) (L := K)).symm.toMonoidHom @@ -132,7 +133,8 @@ theorem (K := ℚ) (L := K) c) = rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure K) - (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion (IntermediateField.le_normalClosure K)) c) := by + (RelativeIdeleGroup.classEmbedding (IntermediateField.inclusion + (IntermediateField.le_normalClosure K)) c) := by exact monoidHom_comp_equiv_symm_apply (rationalRelativeIdeleClassToDirectLimit (rationalNormalClosure K)) (RelativeIdeleGroup.classEmbedding diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean index 83fe9abcdf..0d289ac0b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean @@ -70,11 +70,11 @@ def algHomOfCompatibleRingHom private theorem relativeAdeleEmbedding_toAlgHom_unflatten {K M L : Type u} [Field K] [NumberField K] - [Field M] [NumberField M] - [Field L] [NumberField L] + [Field M] + [Field L] [Algebra K M] [Algebra M L] [Algebra K L] [IsScalarTower K M L] - [FiniteDimensional K M] [FiniteDimensional M L] + (a : RelativeAdeleRing K M) : towerRelativeAdeleUnflatten K M L (RelativeIdeleGroup.adeleEmbedding @@ -215,7 +215,7 @@ theorem classEmbedding_smul_eq_classEmbedding_comp [Field K] [NumberField K] [Field E] [Field U] [Algebra K E] [Algebra K U] - [FiniteDimensional K E] [FiniteDimensional K U] + (j : E →ₐ[K] U) (σ : U ≃ₐ[K] U) (c : RelativeIdeleGroup.ClassGroup K E) : σ • RelativeIdeleGroup.classEmbedding j c = @@ -388,8 +388,8 @@ private theorem classEmbedding_comp [Field K] [NumberField K] [Field E] [Field N] [Field U] [Algebra K E] [Algebra K N] [Algebra K U] - [FiniteDimensional K E] [FiniteDimensional K N] - [FiniteDimensional K U] + + (f : E →ₐ[K] N) (g : N →ₐ[K] U) (c : RelativeIdeleGroup.ClassGroup K E) : RelativeIdeleGroup.classEmbedding g diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean index c008d4e87f..500d8eb90f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean @@ -146,16 +146,22 @@ private theorem rationalFiniteTower_upper_le_rationalNormalClosure : (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 @@ -216,6 +222,7 @@ local instance rationalFiniteTowerClosureOverLowerGalois : 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₀ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean index 71e0ce4190..813755b19b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean @@ -140,7 +140,7 @@ private theorem rationalTowerRelativeClass_norm [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] [IsScalarTower ℚ F E] [FiniteDimensional ℚ F] [FiniteDimensional F E] - [IsGalois F E] + (c : Additive (IdeleClassGroup E)) : let dF := towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index 81349e78a7..c5e82f1d66 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -20,7 +20,7 @@ multiplying an idele by the section of its absolute norm produces a norm-one idele without changing its Artin symbol. -/ -open scoped Classical IsMulCommutative NNReal NumberField Topology +open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain noncomputable section @@ -31,6 +31,7 @@ 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 ℚ) : @@ -38,6 +39,7 @@ theorem rationalInfinitePlace_isReal rw [Subsingleton.elim v Rat.infinitePlace] exact Rat.isReal_infinitePlace +open scoped Classical in private noncomputable def rationalPositiveArchimedeanLocalComponent (v : InfinitePlace ℚ) : ℝ≥0ˣ →* v.Completionˣ := @@ -46,11 +48,13 @@ private noncomputable def rationalPositiveArchimedeanLocalComponent (rationalInfinitePlace_isReal v)).symm.toMulEquiv).toMonoidHom.comp (Units.map NNReal.toRealHom.toMonoidHom) +open scoped Classical in private 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 @@ -65,6 +69,7 @@ private theorem rationalPositiveArchimedeanInfinitePart_component (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. -/ @@ -76,9 +81,9 @@ noncomputable def rationalPositiveArchimedeanIdele : 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 `ℚ`. -/ -@[simp] theorem rationalPositiveArchimedeanIdele_finiteComponent (r : ℝ≥0ˣ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -87,6 +92,7 @@ theorem rationalPositiveArchimedeanIdele_finiteComponent 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. -/ @@ -120,6 +126,7 @@ theorem rationalPositiveArchimedeanIdele_infiniteComponent (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`. -/ @@ -191,6 +198,7 @@ theorem rationalPositiveArchimedeanIdele_absoluteNorm 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 @@ -264,6 +272,7 @@ 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 @@ -298,6 +307,7 @@ noncomputable def infiniteGlobalArtinLimitPoint (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 @@ -369,6 +379,7 @@ noncomputable def infiniteGlobalArtinToLimit 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. -/ @@ -381,6 +392,7 @@ noncomputable def infiniteGlobalArtinMonoidHom 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. -/ @@ -406,6 +418,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField (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. -/ @@ -428,6 +441,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures 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. -/ @@ -453,6 +467,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_intermediateField 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 @@ -468,6 +483,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_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 @@ -489,6 +505,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField_apply (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. -/ @@ -509,6 +526,7 @@ theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField (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. -/ @@ -532,6 +550,7 @@ theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_structures (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. -/ @@ -555,6 +574,7 @@ theorem (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. -/ @@ -566,6 +586,7 @@ noncomputable def globalArtinMonoidHomOfNumberField 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 @@ -587,6 +608,7 @@ theorem globalArtinMonoidHomOfNumberField_norm_restriction 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. -/ @@ -607,6 +629,7 @@ theorem comp_restrictNormalHom_infiniteGlobalArtinMonoidHom_of_numberField (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 @@ -631,6 +654,7 @@ noncomputable def 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 @@ -658,6 +682,7 @@ noncomputable def (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 @@ -675,6 +700,7 @@ theorem map_restrictNormalHom_infiniteGlobalArtinMonoidHom (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. -/ @@ -694,6 +720,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom 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 @@ -749,6 +776,7 @@ theorem restrictNormalHom_infiniteGlobalArtinMonoidHom_of_scalarTower (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 @@ -793,6 +821,7 @@ theorem infiniteGlobalArtinMonoidHom_denseRange ⟨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 : @@ -801,6 +830,7 @@ noncomputable def rationalCyclotomicZHatGlobalArtin : rationalCyclotomicZHatField) := infiniteGlobalArtinMonoidHom ℚ rationalCyclotomicZHatField +open scoped Classical in private theorem continuousMulEquivToLimit_rationalCyclotomicZHatGlobalArtin_apply (a : IdeleGroup ℚ) : @@ -813,6 +843,7 @@ private theorem (InfiniteGalois.continuousMulEquivToLimit ℚ rationalCyclotomicZHatField).apply_symm_apply _ +open scoped Classical in /-- Projection of the rational `ZHat` Artin homomorphism is the finite global Artin homomorphism. -/ @[simp] @@ -832,6 +863,7 @@ theorem restrictNormalHom_rationalCyclotomicZHatGlobalArtin restrictNormalHom_infiniteGlobalArtinMonoidHom ℚ rationalCyclotomicZHatField a E +open scoped Classical in /-- Rational cyclotomic projection with caller-supplied finite-layer structures. -/ theorem restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures @@ -853,6 +885,7 @@ theorem restrictNormalHom_rationalCyclotomicZHatGlobalArtin_of_structures 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 @@ -910,12 +943,14 @@ noncomputable def (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] @@ -949,6 +984,7 @@ theorem 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 @@ -976,6 +1012,7 @@ theorem rationalCyclotomicZHatGlobalArtin_rationalPositiveArchimedeanIdele, mul_one] +open scoped Classical in /-- The norm-one rational ideles already have dense Artin image. -/ theorem rationalCyclotomicZHatGlobalArtin_normOne_denseRange : DenseRange diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean index b9a7f91e7f..5f827c0ddf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean @@ -15,7 +15,7 @@ This file descends that homomorphism to the idele class group and retains its ordinary quotient topology. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -27,6 +27,7 @@ variable [Field K] [NumberField K] [Field Ω] [Algebra K Ω] [IsAbelianGalois K Ω] +open scoped Classical in private theorem continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply (a : IdeleGroup K) : @@ -36,6 +37,7 @@ private theorem exact (InfiniteGalois.continuousMulEquivToLimit K Ω).apply_symm_apply _ +open scoped Classical in /-- The infinite global Artin homomorphism is trivial on every principal idele. -/ @[simp] @@ -58,6 +60,7 @@ theorem infiniteGlobalArtinMonoidHom_principalIdele 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 : @@ -73,9 +76,9 @@ noncomputable def infiniteGlobalIdeleClassArtinMonoidHom : 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. -/ -@[simp] theorem infiniteGlobalIdeleClassArtinMonoidHom_mk (a : IdeleGroup K) : infiniteGlobalIdeleClassArtinMonoidHom @@ -86,6 +89,7 @@ theorem infiniteGlobalIdeleClassArtinMonoidHom_mk rw [infiniteGlobalIdeleClassArtinMonoidHom] exact QuotientGroup.lift_mk _ _ _ +open scoped Classical in private theorem infiniteGlobalIdeleClassArtinMonoidHom_continuous : Continuous (infiniteGlobalIdeleClassArtinMonoidHom @@ -101,6 +105,7 @@ private theorem infiniteGlobalIdeleClassArtinMonoidHom_continuous : 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 : @@ -112,6 +117,7 @@ noncomputable def infiniteGlobalIdeleClassArtinContinuousMonoidHom : infiniteGlobalIdeleClassArtinMonoidHom_continuous (K := K) (Ω := Ω) +open scoped Classical in /-- The descended infinite global Artin homomorphism has dense image in the Krull topology. -/ theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_denseRange : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean index 5ad34fad10..155622e3a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean @@ -17,7 +17,7 @@ it. Multiplication by this section therefore replaces any idele by a norm-one idele without changing its Artin symbol. -/ -open scoped Classical IsMulCommutative NNReal NumberField Topology +open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem @@ -28,15 +28,16 @@ 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. -/ -@[simp] theorem numberFieldPositiveArchimedeanIdele_finiteComponent (r : ℝ≥0ˣ) (v : HeightOneSpectrum (𝓞 K)) : @@ -45,6 +46,7 @@ theorem numberFieldPositiveArchimedeanIdele_finiteComponent 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) : @@ -53,8 +55,8 @@ theorem numberFieldPositiveArchimedeanIdele_infiniteComponent_mem_positive RayClass.infinitePositiveSubgroup v := IdeleGroup.positiveArchimedeanSection_infiniteComponent_mem_positive r v +open scoped Classical in /-- Compatibility form of the absolute-norm evaluation. -/ -@[simp] theorem numberFieldPositiveArchimedeanIdele_absoluteNorm (r : ℝ≥0ˣ) : IdeleGroup.absoluteNorm @@ -62,6 +64,7 @@ theorem numberFieldPositiveArchimedeanIdele_absoluteNorm r⁻¹ := IdeleGroup.positiveArchimedeanSection_absoluteNorm r +open scoped Classical in private theorem globalArtinMonoidHom_positiveArchimedeanSection {L : Type} [Field L] [NumberField L] [Algebra K L] @@ -102,6 +105,7 @@ private theorem globalArtinMonoidHom_positiveArchimedeanSection map_one] rw [hinfinite, hfinite, mul_one] +open scoped Classical in private theorem continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply' {K Ω : Type} [Field K] [NumberField K] @@ -113,6 +117,7 @@ private theorem continuousMulEquivToLimit_infiniteGlobalArtinMonoidHom_apply' 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] @@ -143,6 +148,7 @@ theorem infiniteGlobalArtinMonoidHom_positiveArchimedeanSection globalArtinMonoidHom_positiveArchimedeanSection (K := K) (L := E.unop) r +open scoped Classical in /-- Compatibility form of the Artin evaluation on the positive archimedean section. -/ @[simp] @@ -156,6 +162,7 @@ theorem infiniteGlobalArtinMonoidHom_numberFieldPositiveArchimedeanIdele 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 @@ -173,6 +180,7 @@ theorem exists_normOneIdele_same_infiniteGlobalArtin infiniteGlobalArtinMonoidHom_positiveArchimedeanSection, mul_one] +open scoped Classical in private theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_denseRange (K Ω : Type) @@ -212,6 +220,7 @@ private theorem infiniteGlobalIdeleClassArtinMonoidHom_mk] exact hb +open scoped Classical in private theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_normOne_surjective (K Ω : Type) @@ -242,6 +251,7 @@ private theorem 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) @@ -256,6 +266,7 @@ theorem infiniteGlobalIdeleClassArtinContinuousMonoidHom_surjective K Ω σ exact ⟨(c : IdeleClassGroup K), hc⟩ +open scoped Classical in /-- The infinite global Artin homomorphism is surjective. -/ theorem infiniteGlobalArtinMonoidHom_surjective (K Ω : Type) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean index b43cb17152..c07e0c8938 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean @@ -437,7 +437,6 @@ theorem globalNormResidueMonoidHom_comp_infinitePlaceIdeleClass /-- 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. -/ -@[simp] theorem infinitePlaceIdeleClass_mem_ideleClassNorm_range_iff (v : InfinitePlace K) (x : v.Completionˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean index 9b9092004b..ba6c321ea7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -21,7 +21,7 @@ At an unramified infinite place the decomposition group, and hence the local homomorphism, is trivial. -/ -open scoped BigOperators Classical IsMulCommutative NumberField +open scoped BigOperators IsMulCommutative NumberField NumberField.LiesOver open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -42,6 +42,7 @@ section Galois variable [IsGalois K L] +open scoped Classical in private noncomputable def ramifiedInfinitePlaceConjugation (w : InfinitePlace L) (hRamified : w.IsRamified K) : L ≃ₐ[K] L := @@ -51,6 +52,7 @@ private noncomputable def ramifiedInfinitePlaceConjugation ((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 @@ -63,6 +65,7 @@ private theorem ramifiedInfinitePlaceConjugation_isConj ((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 @@ -76,6 +79,7 @@ private theorem ramifiedInfinitePlaceConjugation_sq (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 @@ -115,6 +119,7 @@ noncomputable def infinitePlaceArtinMonoidHomOfPlace (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 @@ -128,6 +133,7 @@ noncomputable def chosenInfinitePlaceArtinMonoidHom (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 @@ -207,6 +213,7 @@ 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 @@ -289,11 +296,12 @@ theorem infinitePlaceArtinMonoidHomOfPlace_eq 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] [NumberField E] + [Field E] [Algebra K E] [Algebra E L] [IsScalarTower K E L] [IsGalois K E] @@ -413,6 +421,7 @@ theorem infinitePlaceArtinMonoidHomOfPlace_restrict_tower · 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 @@ -469,6 +478,7 @@ theorem infinitePlace_normUnits_real_complex_pos 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 @@ -529,12 +539,13 @@ theorem infinitePlace_normUnits_real_real eBase eExtension hCompatible x 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'] [NumberField L'] + [Field L'] [Algebra K K'] [Algebra K' L'] [Algebra K L'] [IsScalarTower K K' L'] [Algebra L L'] [IsScalarTower K L L'] @@ -762,6 +773,7 @@ theorem infinitePlaceArtinMonoidHomOfPlace_norm_restriction · 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 @@ -809,6 +821,7 @@ theorem chosenInfinitePlaceArtinMonoidHom_restrict_tower (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. -/ @@ -882,6 +895,7 @@ 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) : @@ -941,6 +955,7 @@ theorem chosenInfinitePlaceArtinMonoidHom_continuous (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 @@ -1001,6 +1016,7 @@ theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos rw [hsign'] simp +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. -/ @@ -1204,6 +1220,7 @@ 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 : @@ -1214,6 +1231,7 @@ noncomputable def infinitePlaceGlobalArtinMonoidHom : (IdeleGroup.infiniteComponent v) omit [NumberField L] in +open scoped Classical in /-- The archimedean global Artin product is continuous. -/ theorem infinitePlaceGlobalArtinMonoidHom_continuous : Continuous @@ -1242,6 +1260,7 @@ theorem infinitePlaceGlobalArtinMonoidHom_continuous : (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. -/ @@ -1307,7 +1326,7 @@ theorem infinitePlaceGlobalArtinMonoidHom_norm_eq_prod infinitePlaceAboveEquivExtension (K := K) (L := M) v let := - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + AlgebraicNumberTheory.Valuations.completionTensorDecompositionExtensionFintype (K := K) (L := M) vK hvK let : Fintype {W : InfinitePlace M // infinitePlaceBelow (K := K) W = v} := @@ -1339,6 +1358,7 @@ theorem infinitePlaceGlobalArtinMonoidHom_norm_eq_prod 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. -/ @@ -1385,6 +1405,7 @@ theorem infinitePlaceGlobalArtinMonoidHom_norm_restriction (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index f453e402d0..c99e1e5e98 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -278,7 +278,7 @@ theorem numberFieldTowerFinitePadicAuxiliaryEmbedding_algebraMap rfl noncomputable instance - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : Algebra K @@ -305,7 +305,7 @@ instance (K := K) (L := L) p τ).comp_algebraMap.symm noncomputable instance - numberFieldTowerFinitePadicAuxiliary_topAlgebra + numberFieldTowerFinitePadicAuxiliaryTopAlgebra (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : Algebra L @@ -332,7 +332,7 @@ instance (K := K) (L := L) p τ).comp_algebraMap.symm noncomputable instance - numberFieldTowerFinitePadicAuxiliary_originalBaseTopAlgebra + numberFieldTowerFinitePadicAuxiliaryOriginalBaseTopAlgebra (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : Algebra K @@ -418,7 +418,7 @@ theorem numberFieldTowerFinitePadicAuxiliaryBase_isGalois @IsGalois.of_equiv_equiv B FB _ _ auxiliaryBaseAlgebra K F _ _ - (numberFieldTowerFinitePadicAuxiliary_baseAlgebra + (numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ) auxiliaryBaseGalois eK.symm.toRingEquiv (RingEquiv.refl F) ?_ @@ -670,7 +670,7 @@ theorem letI _ : NumberField E := NumberField.of_module_finite ℚ E letI _ : Algebra K F := - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ finitePlaceBelow (K := F) (finitePlaceExtensionCentre @@ -723,7 +723,7 @@ theorem let auxiliaryTopNumberField : NumberField E := NumberField.of_module_finite ℚ E let auxiliaryOriginalBaseAlgebra : Algebra K F := - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ let wF := numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension @@ -876,7 +876,7 @@ private theorem numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_cho letI : IsAbelianGalois F E := GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P letI : Algebra K F := - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ let wF := numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension (K := K) (L := L) v p τ @@ -926,7 +926,7 @@ private theorem numberFieldTowerFinitePadicAuxiliaryTopDecompositionGroup_eq_cho let : IsAbelianGalois F E := GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P let : Algebra K F := - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ let wF := numberFieldTowerFinitePadicAuxiliaryBasePlaceExtension @@ -1089,13 +1089,13 @@ private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_no letI auxiliaryAbelianGalois : IsAbelianGalois F E := GlobalClassFields.finiteAbelianSubextensionAbstractRelativeFixedFieldIsAbelianGalois P letI auxiliaryOriginalBaseAlgebra : Algebra K F := - numberFieldTowerFinitePadicAuxiliary_baseAlgebra + numberFieldTowerFinitePadicAuxiliaryBaseAlgebra (K := K) (L := L) p τ letI auxiliaryOriginalTopAlgebra : Algebra L E := - numberFieldTowerFinitePadicAuxiliary_topAlgebra + numberFieldTowerFinitePadicAuxiliaryTopAlgebra (K := K) (L := L) p τ letI auxiliaryOriginalBaseTopAlgebra : Algebra K E := - numberFieldTowerFinitePadicAuxiliary_originalBaseTopAlgebra + numberFieldTowerFinitePadicAuxiliaryOriginalBaseTopAlgebra (K := K) (L := L) p τ letI auxiliaryOriginalTopScalarTower : IsScalarTower K L E := numberFieldTowerFinitePadicAuxiliary_originalTopScalarTower @@ -1261,6 +1261,8 @@ private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_no 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean index 443ac29ba7..db6d993571 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -1039,7 +1039,7 @@ theorem let T := rationalCyclotomicZHatField let : Algebra T C := - rationalCyclotomicZHatCompositum_algebra L + rationalCyclotomicZHatCompositumAlgebra L let : IsScalarTower ℚ T C := rationalCyclotomicZHatCompositum_scalarTower L let : Normal ℚ T := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean index 7c3b020f2e..1a478db4ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean @@ -18,9 +18,10 @@ noncomputable section namespace ClassFieldTheory -open scoped BigOperators Classical NumberField +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 @@ -33,6 +34,7 @@ noncomputable def globalFinitePlaceHilbertSymbol (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean index 4644024746..0715fe9008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean @@ -15,7 +15,7 @@ maximal abelian subextension of the separable closure. It also exposes the idele-representative evaluation and its finite Galois projections. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -24,6 +24,7 @@ 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 : @@ -31,9 +32,9 @@ noncomputable def maximalAbelianGlobalArtin : 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. -/ -@[simp] theorem maximalAbelianGlobalArtin_mk (a : IdeleGroup K) : maximalAbelianGlobalArtin K (QuotientGroup.mk' (IdeleGroup.principalSubgroup K) a) = @@ -41,10 +42,10 @@ theorem maximalAbelianGlobalArtin_mk (a : IdeleGroup K) : 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. -/ -@[simp] theorem maximalAbelianGlobalArtin_finiteProjection (a : IdeleGroup K) (E : FiniteGaloisIntermediateField K (maximalAbelianExtension K)) : @@ -59,6 +60,7 @@ theorem maximalAbelianGlobalArtin_finiteProjection 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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean index c0441e276b..66518f9671 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean @@ -21,7 +21,7 @@ closed finite-index idele-class subgroup, whose selected finite class field supplies the detecting finite Galois coordinate. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -32,6 +32,7 @@ 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 @@ -88,6 +89,7 @@ theorem exists_closedFiniteIndexSubgroup_not_mem_of_not_mem_identityComponent 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 @@ -122,9 +124,9 @@ theorem finiteAbelianExtensionInMaximalAbelianExtension_ideleClassNorm_range · 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. -/ -@[simp] theorem maximalAbelianGlobalArtin_ker : (maximalAbelianGlobalArtin K).ker = ideleClassIdentityComponent K := by @@ -184,6 +186,7 @@ theorem maximalAbelianGlobalArtin_ker : 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 : @@ -213,9 +216,9 @@ noncomputable def ideleClassComponentQuotientEquivMaximalAbelianGalois : 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. -/ -@[simp] theorem ideleClassComponentQuotientEquivMaximalAbelianGalois_mk (c : IdeleClassGroup K) : ideleClassComponentQuotientEquivMaximalAbelianGalois K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index aed418c2a6..ba9ddeeefd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -31,7 +31,7 @@ the exponent-place and infinite-place correction in the common field-valued group of roots of unity. -/ -open scoped BigOperators Classical NumberField NumberTheorySymbols ValuativeRel WithZero +open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero open NumberField IsDedekindDomain noncomputable section @@ -47,6 +47,7 @@ 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 @@ -65,6 +66,7 @@ private theorem canonicalValuation_eq_of_valuation_eq · 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. -/ @@ -76,6 +78,7 @@ private theorem finitePlaceAdicAbv_nonarchimedeanAbsoluteValue (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. -/ @@ -99,6 +102,7 @@ theorem finiteFieldPowerResidueSymbol_unitsMap_ringEquiv 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. -/ @@ -163,6 +167,7 @@ noncomputable def finitePlacePrimeResidueEquivLocalResidue (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 @@ -191,9 +196,9 @@ noncomputable def finitePlaceIntegralCompletionElement 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. -/ -@[simp] theorem finitePlaceIntegralCompletionElement_coe (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) : let C := (HeightOneSpectrum.adicAbv K v).Completion @@ -205,6 +210,7 @@ theorem finitePlaceIntegralCompletionElement_coe 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] @@ -245,6 +251,7 @@ theorem finitePlacePrimeResidueEquivLocalResidue_mk (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 @@ -254,11 +261,13 @@ def nonzeroIntegralFieldUnit (x : 𝓞 K) (hx : x ≠ 0) : Kˣ := 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 @@ -271,6 +280,7 @@ noncomputable def primeAvoidingIntegralFieldUnit exact Ideal.zero_mem _) omit [NumberField K] in +open scoped Classical in @[simp] theorem primeAvoidingIntegralFieldUnit_coe (v : HeightOneSpectrum (𝓞 K)) @@ -278,6 +288,7 @@ theorem primeAvoidingIntegralFieldUnit_coe ((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 @@ -326,9 +337,9 @@ noncomputable def finitePlaceIntegralCompletionUnit 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. -/ -@[simp] theorem finitePlaceIntegralCompletionUnit_coe (v : HeightOneSpectrum (𝓞 K)) (x : 𝓞 K) (hx : x ∉ v.asIdeal) : @@ -341,6 +352,7 @@ theorem finitePlaceIntegralCompletionUnit_coe 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 @@ -351,7 +363,7 @@ theorem finitePlaceHilbert_completionUnit_primeAvoidingIntegralFieldUnit finitePlaceLocalArtinCompletionValuativeRel v letI : IsNonarchimedeanLocalField C := finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v - finitePlaceHilbert_completionUnit K v + finitePlaceHilbertCompletionUnit K v (primeAvoidingIntegralFieldUnit K v x hx) = integerUnitsToFieldUnits C (finitePlaceIntegralCompletionUnit K v x hx) := by @@ -368,6 +380,7 @@ theorem finitePlaceHilbert_completionUnit_primeAvoidingIntegralFieldUnit 𝒪[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] @@ -385,6 +398,7 @@ theorem finitePlaceIntegralCompletionUnit_val 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 @@ -412,6 +426,7 @@ theorem finitePlace_integerUnitsToResidueUnits_integralUnit 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 @@ -435,6 +450,7 @@ def integralRootsOfUnityToNthRoots (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 @@ -444,6 +460,7 @@ theorem integralRootsOfUnityToNthRoots_apply rfl omit [NumberField K] in +open scoped Classical in /-- The integral-to-field inclusion is injective on roots of unity. -/ theorem integralRootsOfUnityToNthRoots_injective (n : ℕ) : @@ -456,6 +473,7 @@ theorem integralRootsOfUnityToNthRoots_injective 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. -/ @@ -489,10 +507,12 @@ theorem finitePlace_localNthRootsReduction_integralRoots 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 @@ -501,10 +521,12 @@ theorem powerResidueExponentIdeal_ne_zero (n : ℕ+) : (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. -/ @@ -513,6 +535,7 @@ noncomputable def powerResidueExponentFinitePlaces (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] @@ -524,6 +547,7 @@ theorem mem_powerResidueExponentFinitePlaces_iff (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 @@ -571,6 +595,7 @@ theorem finitePlace_natCast_valuation_eq_one_of_not_mem_exponent (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) @@ -587,6 +612,7 @@ private noncomputable def finitePlaceLocalTamePowerResidueSymbolValue (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) @@ -603,6 +629,7 @@ private noncomputable def finitePlaceLocalTamePowerResidueSymbolFieldValue (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) @@ -612,6 +639,7 @@ private noncomputable def finitePlacePrimeIdealPowerResidueIntegralRoot 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) @@ -620,6 +648,7 @@ private noncomputable def finitePlacePrimeIdealPowerResidueGlobalRoot 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) @@ -629,6 +658,7 @@ private noncomputable def finitePlacePrimeIdealPowerResidueFactorValue 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) @@ -640,6 +670,7 @@ private noncomputable def finitePlacePrimeIdealPowerResidueFactorFieldValue (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) @@ -668,6 +699,7 @@ private noncomputable def finitePlaceLocalTamePowerResidueSymbolResidueValue (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) @@ -690,6 +722,7 @@ private noncomputable def finitePlacePrimeIdealPowerResidueFactorResidueValue (AlgebraicNumberTheory.PowerResidueSymbols.primeIdealPowerResidueSymbol K v n hmu hcoprime a ha)))).1 : 𝓀[C]ˣ) : 𝓀[C]) +open scoped Classical 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. -/ @@ -736,6 +769,7 @@ private theorem finitePlaceLocalTamePowerResidueSymbol_residueValue_eq (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) @@ -777,6 +811,7 @@ private theorem finitePlaceLocalTamePowerResidueSymbolFieldValue_eq_primeIdealVa 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 @@ -787,8 +822,9 @@ noncomputable def finitePlaceNormalizedValuation letI : IsNonarchimedeanLocalField C := finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v exact valuationMap C - (Additive.ofMul (finitePlaceHilbert_completionUnit K v x)) + (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. -/ @@ -813,13 +849,13 @@ theorem finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor_zpow 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 := finitePlaceHilbert_completionUnit K v b + 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 - (finitePlaceHilbert_completionUnit K v + (finitePlaceHilbertCompletionUnit K v (primeAvoidingIntegralFieldUnit K v a ha)) bC = nthRootsSubgroupMap K C (n : ℕ) (integralRootsOfUnityToNthRoots K (n : ℕ) @@ -849,6 +885,7 @@ theorem finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor_zpow 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) @@ -866,16 +903,19 @@ theorem finitePlaceHilbertSymbol_eq_primeIdealPowerResidueFactor 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 + (-(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. -/ @@ -884,7 +924,8 @@ theorem finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit (x : 𝓞 K) (hx : x ≠ 0) : finitePlaceNormalizedValuation K v (nonzeroIntegralFieldUnit K x hx) = - -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : ℤ) := by + -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : + ℤ) := by let C := (HeightOneSpectrum.adicAbv K v).Completion let : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v @@ -909,7 +950,7 @@ theorem finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit Units.mk0 (πData.completionInteger : C) πData.completionInteger_isUniformizer.ne_zero let xC : Cˣ := - finitePlaceHilbert_completionUnit K v + finitePlaceHilbertCompletionUnit K v (nonzeroIntegralFieldUnit K x hx) have hIntX : v.intValuation x = WithZero.exp (-(m : ℤ)) := by @@ -998,8 +1039,10 @@ theorem finitePlaceNormalizedValuation_nonzeroIntegralFieldUnit _ = (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 + _ = -(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 @@ -1007,7 +1050,8 @@ theorem finitePlaceNormalizedValuation_primeAvoidingIntegralFieldUnit (x : 𝓞 K) (hx : x ∉ v.asIdeal) : finitePlaceNormalizedValuation K v (primeAvoidingIntegralFieldUnit K v x hx) = - -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : ℤ) := by + -(AlgebraicNumberTheory.PowerResidueSymbols.idealPrimeMultiplicity K v (Ideal.span {x}) : + ℤ) := by let hx0 : x ≠ 0 := by intro hxzero apply hx @@ -1017,6 +1061,7 @@ theorem finitePlaceNormalizedValuation_primeAvoidingIntegralFieldUnit (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 @@ -1046,6 +1091,7 @@ theorem finitePlaceHilbertSymbol_integral_eq_primeIdealPowerResidueFactor 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 @@ -1067,9 +1113,10 @@ theorem finitePlaceHilbertSymbol_skew localHilbertSymbol_skew C n (finitePlaceHilbert_natCast_ne_zero K n hnK v) (finitePlaceHilbert_primitiveRoots_nonempty K n hmu v) - (finitePlaceHilbert_completionUnit K v a) - (finitePlaceHilbert_completionUnit K v b) + (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 @@ -1090,7 +1137,7 @@ theorem finitePlaceHilbertSymbol_integral_units_eq_one apply nthRootsSubgroupMap_injective K C (n : ℕ) rw [map_one, finitePlaceHilbertSymbol_map_eq_localHilbertSymbol] have haUnits : - finitePlaceHilbert_completionUnit K v + finitePlaceHilbertCompletionUnit K v (nonzeroIntegralFieldUnit K a ha0) = integerUnitsToFieldUnits C (finitePlaceIntegralCompletionUnit K v a ha) := by @@ -1101,7 +1148,7 @@ theorem finitePlaceHilbertSymbol_integral_units_eq_one 𝒪[C]) : C) exact (finitePlaceIntegralCompletionUnit_coe K v a ha).symm have hbUnits : - finitePlaceHilbert_completionUnit K v + finitePlaceHilbertCompletionUnit K v (nonzeroIntegralFieldUnit K b hb0) = integerUnitsToFieldUnits C (finitePlaceIntegralCompletionUnit K v b hb) := by @@ -1120,6 +1167,7 @@ theorem finitePlaceHilbertSymbol_integral_units_eq_one (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 @@ -1206,6 +1254,7 @@ theorem powerResidueAwayFromExponentFiniteFactor_integral_eq_idealFactors 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)`. -/ @@ -1216,6 +1265,7 @@ noncomputable def powerResidueBadFinitePlaces 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 @@ -1228,6 +1278,7 @@ noncomputable def powerResidueBadPlaceCorrection (∏ 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) : @@ -1236,6 +1287,7 @@ private theorem valuation_eq_one_of_not_mem_chosenUnitFiniteSupport (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 @@ -1301,6 +1353,7 @@ theorem finitePlaceHilbertSymbol_eq_one_of_valuation_eq_one 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 @@ -1341,6 +1394,7 @@ theorem finitePlaceHilbertSymbol_eq_one_of_not_mem_powerResidueBadFinitePlaces 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 @@ -1360,6 +1414,7 @@ theorem finitePlaceHilbertSymbol_mulSupport_subset_powerResidueBadFinitePlaces (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 @@ -1374,6 +1429,7 @@ theorem finitePlaceHilbertSymbol_finprod_eq_prod_powerResidueBadFinitePlaces (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 @@ -1392,6 +1448,7 @@ theorem powerResidueBadFinitePlaces_product_eq_infinitePlaceProduct_inv 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. -/ @@ -1406,6 +1463,7 @@ noncomputable def powerResidueAwayFromExponentFiniteProduct 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 @@ -1532,6 +1590,7 @@ theorem powerResidueAwayFromExponentFiniteProduct_integral_eq_idealSymbol_div 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 @@ -1613,6 +1672,7 @@ theorem finitePlaceHilbertSymbol_finprod_eq_exponent_product_mul_away 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. -/ @@ -1630,6 +1690,7 @@ theorem powerResidueAwayFromExponentFiniteProduct_eq_badPlaceCorrection_inv 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 @@ -1701,9 +1762,13 @@ theorem idealPowerResidueSymbol_reciprocity_with_bad_place_correction 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. -/ @@ -1712,6 +1777,7 @@ theorem rationalQuadraticPrimitiveRoots_nonempty : 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. -/ @@ -1737,6 +1803,7 @@ noncomputable def rationalPrimeResidueEquivZMod 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] @@ -1776,6 +1843,7 @@ theorem rationalPrimeResidueEquivZMod_mk _ = _ := 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. -/ @@ -1788,6 +1856,7 @@ theorem absNorm_rationalPrime (p : Nat.Primes) : 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 @@ -1796,18 +1865,21 @@ theorem absNorm_rationalPrime_coprime_two 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 @@ -1817,6 +1889,7 @@ def rationalQuadraticRootValueMonoidHom : intro z w simp [rationalQuadraticRootValue] +open scoped Classical in /-- The multiplicative sign evaluation has the expected underlying function. -/ @[simp] theorem rationalQuadraticRootValueMonoidHom_apply @@ -1825,6 +1898,7 @@ theorem rationalQuadraticRootValueMonoidHom_apply rationalQuadraticRootValue z := rfl +open scoped Classical in /-- The integer sign evaluation detects the identity root. -/ theorem rationalQuadraticRootValue_eq_one_iff (z : rootsOfUnity 2 (𝓞 ℚ)) : @@ -1841,6 +1915,7 @@ theorem rationalQuadraticRootValue_eq_one_iff · 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 (𝓞 ℚ)) : @@ -1854,6 +1929,7 @@ theorem rationalQuadraticRootValue_eq_one_or_neg_one 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 @@ -1866,6 +1942,7 @@ theorem rationalPrimeResidue_intCast_ne_zero 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. -/ @@ -1899,6 +1976,7 @@ theorem rationalPrimeResidueUnit_sq_iff_isSquare 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 @@ -1946,11 +2024,13 @@ theorem rationalPrimeIdealPowerResidueSymbol_two_eq_legendre /-! ## 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) : @@ -1961,6 +2041,7 @@ theorem rationalPrincipalIdeal_ne_zero 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 @@ -1997,6 +2078,7 @@ theorem rationalPrime_asIdeal_eq_span 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 @@ -2008,6 +2090,7 @@ theorem rationalPrime_dvd_rationalPrincipalIdeal_iff 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 @@ -2036,6 +2119,7 @@ theorem rationalPrincipalIdeal_absNorm_coprime_two_of_odd 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 @@ -2079,6 +2163,7 @@ theorem rationalPrincipalIdeal_numerator_not_mem_of_coprime 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 @@ -2116,6 +2201,7 @@ theorem idealPrimeMultiplicity_rationalPrincipalIdeal 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 @@ -2160,6 +2246,7 @@ noncomputable def rationalPrincipalIdealPrimeDivisorsEquiv 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] @@ -2170,9 +2257,9 @@ theorem rationalPrincipalIdealPrimeDivisorsEquiv_symm_apply_val ⟨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`. -/ -@[simp] theorem idealPrimeMultiplicity_rationalPrincipalIdeal_reindexed (b : ℕ) (hb : b ≠ 0) (p : b.primeFactors) : idealPrimeMultiplicity ℚ @@ -2183,6 +2270,7 @@ theorem idealPrimeMultiplicity_rationalPrincipalIdeal_reindexed 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 @@ -2208,6 +2296,7 @@ theorem prod_rationalPrincipalIdealPrimeDivisors_eq_prod_primeFactors (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. -/ @@ -2235,6 +2324,7 @@ theorem prod_rationalPrincipalIdealPrimeDivisors_eq_prod_primeFactors_subtype (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 @@ -2281,16 +2371,19 @@ theorem jacobiSym_eq_prod_primeFactors_factorization (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) @@ -2310,11 +2403,13 @@ private noncomputable def rationalIdealQuadraticSourceFactor ((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) @@ -2338,6 +2433,7 @@ private theorem rationalIdealQuadraticSourceFactor_reindexed 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean index a577b2d8ad..6d12c9fac2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean @@ -18,7 +18,7 @@ finite-support and principal-idèle product identities for every character of that target. -/ -open scoped NumberField Classical BigOperators +open scoped NumberField BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup @@ -27,6 +27,7 @@ noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity +open scoped Classical in private theorem productFormulaIdeleClassGroupIsMulCommutative {F : Type} [Field F] [NumberField F] : IsMulCommutative (IdeleClassGroup F) := @@ -40,6 +41,7 @@ variable [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 @@ -77,6 +79,7 @@ noncomputable def finitePlaceNormQuotientToGlobalClass IdeleGroup.norm_relativeIdeleBaseChangeMulEquiv, hz]) +open scoped Classical in /-- Exact local--global compatibility on representatives. -/ @[simp] theorem finitePlaceNormQuotientToGlobalClass_localClass @@ -91,6 +94,7 @@ theorem finitePlaceNormQuotientToGlobalClass_localClass 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 @@ -104,6 +108,7 @@ noncomputable def finitePlaceGlobalSymbol ((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] @@ -125,6 +130,7 @@ theorem finitePlaceGlobalSymbol_eq_localNormClass 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 @@ -146,6 +152,7 @@ theorem finitePlaceGlobalSymbol_finiteLocalFamily 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] @@ -159,6 +166,7 @@ theorem globalNormQuotientCharacter_principal 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean index e1a7aa2655..10df400c70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean @@ -17,7 +17,7 @@ Artin maps and proves the finite principal-idèle product formula in that normalization. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -25,14 +25,21 @@ noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (q : Nat.Primes) : Fact q.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := ⟨q.2⟩ -local instance (m : ℕ+) : NeZero (m : ℕ) := +attribute [local instance] localPrimesInstance1 + +open scoped Classical in +local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ +attribute [local instance] localNeZeroInstance1 + section ArbitraryCyclotomicLevel +open scoped Classical in noncomputable local instance rationalCyclotomicArithmeticLevelFiniteDimensional (m : ℕ+) : @@ -41,6 +48,9 @@ noncomputable local instance IsCyclotomicExtension.finiteDimensional {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) +attribute [local instance] rationalCyclotomicArithmeticLevelFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicArithmeticLevelIsAbelianGalois (m : ℕ+) : @@ -48,6 +58,9 @@ noncomputable local instance (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 @@ -74,6 +87,7 @@ private theorem 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 @@ -104,6 +118,7 @@ theorem 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. -/ @@ -131,6 +146,7 @@ theorem end ArbitraryCyclotomicLevel +open scoped Classical in /-- The arithmetic chosen finite-place character of a rational principal idèle at the prime `q`. -/ noncomputable def @@ -139,6 +155,7 @@ noncomputable def (ZMod (p.1 ^ k))ˣ := (rationalCyclotomicPrincipalFinitePlaceCharacter p k x q)⁻¹ +open scoped Classical in /-- Arithmetic and geometric finite-place characters differ exactly by inversion. -/ @[simp] @@ -151,9 +168,9 @@ theorem p k x q)⁻¹ := by rfl +open scoped Classical in /-- Outside the ordinary rational prime-factorization support, the arithmetic local factor is trivial. -/ -@[simp] theorem rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_one_of_not_mem_support (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (q : Nat.Primes) @@ -168,6 +185,7 @@ theorem p k x q hq, inv_one] +open scoped Classical in /-- The arithmetic rational principal finite-place characters have finite multiplicative support. -/ theorem @@ -185,6 +203,7 @@ theorem (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 @@ -203,6 +222,7 @@ theorem 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 @@ -219,27 +239,37 @@ theorem rationalCyclotomicArithmeticPrincipalFinitePlaceCharacter_eq_inv, rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime] -local instance (p : Nat.Primes) (k : ℕ) : +open scoped Classical in +local instance localPrimesInstance2 (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 (p : Nat.Primes) (k : ℕ) : +attribute [local instance] localPrimesInstance2 + +open scoped Classical in +local instance localPrimesInstance3 (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 (p : Nat.Primes) (k : ℕ) : +attribute [local instance] localPrimesInstance3 + +open scoped Classical in +local instance localPrimesInstance4 (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] localPrimesInstance4 + +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. -/ @@ -335,6 +365,7 @@ private theorem (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 : ℚˣ) : @@ -375,6 +406,7 @@ private theorem rationalSignPadicUnit_toZModPow_inv_eq_self (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean index 4fab385413..65ef0d5257 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean @@ -14,16 +14,20 @@ prime-power reductions. In particular, if every reduction of every automorphism of the full rational cyclotomic field has square one. -/ -open scoped Classical + noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 87e2809c04..ec6a0b23bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -37,7 +37,7 @@ root in the localized cyclotomic level identifies the image of arithmetic Frobenius under the global cyclotomic character with the residue prime. -/ -open scoped Classical NNReal NumberField ValuativeRel +open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -48,6 +48,9 @@ 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 (𝓞 ℚ)) : @@ -64,6 +67,8 @@ namespace Reciprocity (WithAbs (HeightOneSpectrum.adicAbv ℚ v)) _ _ _ _ ℚ _ hWith hUniform +attribute [local instance] rationalFinitePlaceCompletionRatAlgebra + open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory @@ -72,6 +77,7 @@ 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] @@ -91,12 +97,19 @@ private theorem mappedAbelianLocalArtin_eq_frobenius_zpow rw [LocalClassFieldTheory.abelianLocalArtinMonoidHom_eq_frobenius_zpow, map_zpow] -local instance (q : Nat.Primes) : Fact q.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := ⟨q.2⟩ -local instance (m : ℕ+) : NeZero (m : ℕ) := +attribute [local instance] localPrimesInstance1 + +open scoped Classical in +local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ +attribute [local instance] localNeZeroInstance1 + +open scoped Classical in noncomputable local instance rationalCyclotomicLevelFiniteDimensional (m : ℕ+) : @@ -105,6 +118,9 @@ noncomputable local instance IsCyclotomicExtension.finiteDimensional {(m : ℕ)} ℚ (KummerTheory.rationalCyclotomicLevel m) +attribute [local instance] rationalCyclotomicLevelFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicLevelIsAbelianGalois (m : ℕ+) : @@ -122,18 +138,25 @@ noncomputable local instance 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 := - absoluteValueExtension_completionNontriviallyNormedField + absoluteValueExtensionCompletionNontriviallyNormedField (HeightOneSpectrum.adicAbv ℚ (RayClass.rationalPrime q)) (RayClass.adicAbv_isNontrivial (RayClass.rationalPrime q)) +attribute [local instance] rationalFinitePlaceBaseNontriviallyNormedField + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseLocallyCompactSpace (q : Nat.Primes) : LocallyCompactSpace @@ -143,6 +166,9 @@ noncomputable local instance rationalFinitePlaceBaseLocallyCompactSpace (finitePlaceCompletionBaseMap_isometry (RayClass.rationalPrime q)) +attribute [local instance] rationalFinitePlaceBaseLocallyCompactSpace + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseIsUltrametricDist (q : Nat.Primes) : IsUltrametricDist @@ -154,6 +180,11 @@ noncomputable local instance rationalFinitePlaceBaseIsUltrametricDist (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) : @@ -166,6 +197,10 @@ noncomputable local instance rationalFinitePlaceBaseValued (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) : @@ -175,6 +210,9 @@ noncomputable local instance rationalFinitePlaceBaseValuativeRel finitePlaceLocalArtinCompletionValuativeRel (K := ℚ) (RayClass.rationalPrime q) +attribute [local instance] rationalFinitePlaceBaseValuativeRel + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseValuationIsNontrivial (q : Nat.Primes) : @@ -189,6 +227,9 @@ noncomputable local instance (HeightOneSpectrum.adicAbv ℚ (RayClass.rationalPrime q)).Completion)).IsNontrivial) +attribute [local instance] rationalFinitePlaceBaseValuationIsNontrivial + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseValuationCompatible (q : Nat.Primes) : (Valued.v : @@ -198,6 +239,9 @@ noncomputable local instance rationalFinitePlaceBaseValuationCompatible ℝ≥0).Compatible := Valuation.Compatible.ofValuation _ +attribute [local instance] rationalFinitePlaceBaseValuationCompatible + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseValuativeRelIsNontrivial (q : Nat.Primes) : @@ -211,6 +255,9 @@ noncomputable local instance (RayClass.rationalPrime q)).Completion ℝ≥0)).2 inferInstance +attribute [local instance] rationalFinitePlaceBaseValuativeRelIsNontrivial + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseIsValuativeTopology (q : Nat.Primes) : IsValuativeTopology @@ -220,6 +267,9 @@ noncomputable local instance rationalFinitePlaceBaseIsValuativeTopology (HeightOneSpectrum.adicAbv ℚ (RayClass.rationalPrime q)).Completion ℝ≥0 +attribute [local instance] rationalFinitePlaceBaseIsValuativeTopology + +open scoped Classical in noncomputable local instance rationalFinitePlaceBaseIsNonarchimedeanLocalField (q : Nat.Primes) : @@ -233,18 +283,23 @@ noncomputable local instance 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] @@ -255,6 +310,7 @@ noncomputable def rationalPrimeFactorCompletionNontriviallyNormedField (RayClass.rationalPrime p)).Completion := rationalFinitePlaceBaseNontriviallyNormedField p +open scoped Classical in /-- The completion of `ℚ` at `p` is locally compact. -/ theorem rationalPrimeFactorCompletionLocallyCompactSpace (p : Nat.Primes) : @@ -263,6 +319,7 @@ theorem rationalPrimeFactorCompletionLocallyCompactSpace (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) : @@ -271,6 +328,7 @@ theorem rationalPrimeFactorCompletionIsUltrametricDist (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 @@ -280,6 +338,7 @@ noncomputable def rationalPrimeFactorCompletionValued (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] @@ -290,6 +349,7 @@ noncomputable def rationalPrimeFactorCompletionValuativeRel (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) : @@ -298,6 +358,7 @@ theorem rationalPrimeFactorCompletionValuationIsNontrivial (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 @@ -307,6 +368,7 @@ theorem rationalPrimeFactorCompletionValuationCompatible (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) : @@ -315,6 +377,7 @@ theorem rationalPrimeFactorCompletionValuativeRelIsNontrivial (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) : @@ -323,6 +386,7 @@ theorem rationalPrimeFactorCompletionIsValuativeTopology (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) : @@ -331,18 +395,21 @@ theorem rationalPrimeFactorCompletionIsNonarchimedeanLocalField (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 : ℕ) := @@ -350,12 +417,14 @@ abbrev RationalCyclotomicPrincipalPrimeLocalizedLevel (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 @@ -375,6 +444,7 @@ noncomputable def rationalFinitePlaceCompletionIntegerRingEquivPadicInt (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 @@ -385,6 +455,7 @@ noncomputable def rationalFinitePlaceCompletionRingEquivPadic IsFractionRing.ringEquivOfRingEquiv (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) +open scoped Classical in /-- The completion-to-`ℚ_q` equivalence respects the rational embedding. -/ theorem rationalFinitePlaceCompletionRingEquivPadic_algebraMap (q : Nat.Primes) (a : ℚ) : @@ -396,6 +467,7 @@ theorem rationalFinitePlaceCompletionRingEquivPadic_algebraMap 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 @@ -415,6 +487,7 @@ theorem rationalFinitePlaceCompletionIntegerRingEquivPadicInt_coe (IsFractionRing.ringEquivOfRingEquiv_algebraMap (rationalFinitePlaceCompletionIntegerRingEquivPadicInt q) a) +open scoped Classical in /-- The canonical rational-completion equivalence preserves the canonical valuations. -/ theorem @@ -485,6 +558,7 @@ theorem ((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 @@ -494,6 +568,7 @@ noncomputable def rationalPrimeFinitePlaceInteger (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 @@ -506,6 +581,7 @@ theorem rationalPrimeFinitePlaceInteger_irreducible ((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 @@ -563,6 +639,7 @@ theorem rationalPrimeFinitePlaceInteger_coe 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) : @@ -578,6 +655,7 @@ noncomputable def rationalPrimeFinitePlaceFieldUnit (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 @@ -596,6 +674,7 @@ theorem rationalPrimeFinitePlaceFieldUnit_valuationMap (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 @@ -610,6 +689,7 @@ noncomputable def rationalPrimeUnitFinitePlaceIntegerUnit (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 @@ -681,6 +761,7 @@ theorem rationalPrimeUnitFinitePlaceIntegerUnit_coe 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 @@ -701,16 +782,19 @@ theorem rationalPrimeUnitFinitePlaceField_valuationMap (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 @@ -723,6 +807,7 @@ theorem rationalPrimeGeneratorUnit_zpow_mul_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 @@ -735,6 +820,7 @@ noncomputable def rationalPrincipalFinitePlaceInput (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. -/ @@ -800,6 +886,7 @@ theorem rationalPrincipalFinitePlaceInput_eq_algebraMap 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 @@ -861,6 +948,7 @@ theorem rationalPrincipalFiniteComponent_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 @@ -880,6 +968,7 @@ theorem rationalPrimePrincipalFiniteComponent_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 @@ -918,17 +1007,21 @@ private theorem rationalCyclotomicLevel_galEquivZMod_eq_unitOfCoprime apply Units.ext simpa using hPowers +open scoped Classical in private abbrev rationalCyclotomicArtinPlace (q : Nat.Primes) : HeightOneSpectrum (𝓞 ℚ) := RayClass.rationalPrime q +open scoped Classical in private abbrev rationalCyclotomicArtinBaseAbv (q : Nat.Primes) : AbsoluteValue ℚ ℝ := HeightOneSpectrum.adicAbv ℚ (rationalCyclotomicArtinPlace q) +open scoped Classical in private abbrev rationalCyclotomicArtinLevel (m : ℕ+) := KummerTheory.rationalCyclotomicLevel m +open scoped Classical in private abbrev rationalCyclotomicArtinExtension (m : ℕ+) (q : Nat.Primes) : AbsoluteValueExtension @@ -938,12 +1031,16 @@ private abbrev rationalCyclotomicArtinExtension (L := rationalCyclotomicArtinLevel m) (rationalCyclotomicArtinPlace q) +open scoped Classical in private 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) : @@ -952,6 +1049,11 @@ noncomputable local instance rationalCyclotomicArtinExtensionAlgebra 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) : @@ -959,6 +1061,11 @@ noncomputable local instance rationalCyclotomicArtinExtensionSMul (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 @@ -970,6 +1077,10 @@ noncomputable local instance (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) : @@ -980,6 +1091,11 @@ noncomputable local instance rationalCyclotomicArtinLocalizedAlgebra (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) : @@ -988,12 +1104,20 @@ noncomputable local instance (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 noncomputable local instance rationalCyclotomicArtinLocalizedScalarTower (m : ℕ+) (q : Nat.Primes) : @@ -1005,6 +1129,9 @@ noncomputable local instance simp only [Algebra.smul_def, map_mul, eq_ratCast, map_ratCast, mul_assoc] +attribute [local instance] rationalCyclotomicArtinLocalizedScalarTower + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedFiniteDimensional (m : ℕ+) (q : Nat.Primes) : @@ -1016,6 +1143,9 @@ noncomputable local instance (rationalCyclotomicArtinPlace q) (rationalCyclotomicArtinExtension m q) +attribute [local instance] rationalCyclotomicArtinLocalizedFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsAbelianGalois (m : ℕ+) (q : Nat.Primes) : @@ -1029,6 +1159,9 @@ noncomputable local instance (inferInstance : FiniteDimensional ℚ (rationalCyclotomicArtinLevel m)) +attribute [local instance] rationalCyclotomicArtinLocalizedIsAbelianGalois + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsSeparable (m : ℕ+) (q : Nat.Primes) : @@ -1037,6 +1170,9 @@ noncomputable local instance (rationalCyclotomicArtinLocalizedField m q) := (rationalCyclotomicArtinLocalizedIsAbelianGalois m q).toIsGalois.to_isSeparable +attribute [local instance] rationalCyclotomicArtinLocalizedIsSeparable + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsCyclotomic (m : ℕ+) (q : Nat.Primes) : @@ -1046,6 +1182,9 @@ noncomputable local instance rationalCyclotomicLevel_localizedCompletion_isCyclotomicExtension m (rationalCyclotomicArtinPlace q) +attribute [local instance] rationalCyclotomicArtinLocalizedIsCyclotomic + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinExtensionFiniteDimensional (m : ℕ+) (q : Nat.Primes) : @@ -1058,6 +1197,9 @@ noncomputable local instance (rationalCyclotomicArtinPlace q)) (rationalCyclotomicArtinExtension m q) +attribute [local instance] rationalCyclotomicArtinExtensionFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinExtensionContinuousSMul (m : ℕ+) (q : Nat.Primes) : @@ -1070,6 +1212,9 @@ noncomputable local instance (rationalCyclotomicArtinExtension m q).1 (rationalCyclotomicArtinExtension m q).2).continuous +attribute [local instance] rationalCyclotomicArtinExtensionContinuousSMul + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinExtensionLocallyCompact (m : ℕ+) (q : Nat.Primes) : @@ -1079,6 +1224,9 @@ noncomputable local instance (rationalCyclotomicArtinBaseAbv q).Completion (rationalCyclotomicArtinExtension m q).1.Completion +attribute [local instance] rationalCyclotomicArtinExtensionLocallyCompact + +open scoped Classical in private noncomputable def rationalCyclotomicArtinLocalizedEquivCompletion (m : ℕ+) (q : Nat.Primes) : @@ -1093,6 +1241,7 @@ private noncomputable def isometry_toFun := Isometry.of_dist_eq fun _ _ => rfl } +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedLocallyCompact (m : ℕ+) (q : Nat.Primes) : @@ -1101,6 +1250,9 @@ noncomputable local instance ((rationalCyclotomicArtinLocalizedEquivCompletion m q).toHomeomorph.locallyCompactSpace_iff).2 inferInstance +attribute [local instance] rationalCyclotomicArtinLocalizedLocallyCompact + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsUltrametricDist (m : ℕ+) (q : Nat.Primes) : @@ -1112,6 +1264,11 @@ noncomputable local instance (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 := @@ -1121,6 +1278,11 @@ noncomputable local instance rationalCyclotomicArtinLocalizedValued (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 @@ -1132,6 +1294,9 @@ noncomputable local instance (HeightOneSpectrum.isNonarchimedean_adicAbv ℚ (rationalCyclotomicArtinPlace q)) +attribute [local instance] rationalCyclotomicArtinLocalizedValuativeRel + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedValuationCompatible (m : ℕ+) (q : Nat.Primes) : @@ -1139,6 +1304,9 @@ noncomputable local instance (rationalCyclotomicArtinLocalizedField m q) ℝ≥0).Compatible := Valuation.Compatible.ofValuation _ +attribute [local instance] rationalCyclotomicArtinLocalizedValuationCompatible + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedValuationHasExtension (m : ℕ+) (q : Nat.Primes) : @@ -1153,6 +1321,9 @@ noncomputable local instance (HeightOneSpectrum.isNonarchimedean_adicAbv ℚ (rationalCyclotomicArtinPlace q)) +attribute [local instance] rationalCyclotomicArtinLocalizedValuationHasExtension + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedValuationIsNontrivial (m : ℕ+) (q : Nat.Primes) : @@ -1164,6 +1335,9 @@ noncomputable local instance (ValuativeRel.valuation (rationalCyclotomicArtinLocalizedField m q)) +attribute [local instance] rationalCyclotomicArtinLocalizedValuationIsNontrivial + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial (m : ℕ+) (q : Nat.Primes) : @@ -1173,6 +1347,9 @@ noncomputable local instance (ValuativeRel.valuation (rationalCyclotomicArtinLocalizedField m q))).2 inferInstance +attribute [local instance] rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsValuativeTopology (m : ℕ+) (q : Nat.Primes) : @@ -1181,6 +1358,9 @@ noncomputable local instance isValuativeTopology_of_valued_ofValuation (rationalCyclotomicArtinLocalizedField m q) ℝ≥0 +attribute [local instance] rationalCyclotomicArtinLocalizedIsValuativeTopology + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField (m : ℕ+) (q : Nat.Primes) : @@ -1190,6 +1370,11 @@ noncomputable local instance 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) : @@ -1199,6 +1384,9 @@ noncomputable local instance Algebra.ofSubsemiring 𝒪[(rationalCyclotomicArtinBaseAbv q).Completion] +attribute [local instance] rationalCyclotomicArtinLocalizedIntegerAlgebra + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIsIntegralClosure (m : ℕ+) (q : Nat.Primes) : @@ -1214,6 +1402,9 @@ noncomputable local instance (HeightOneSpectrum.isNonarchimedean_adicAbv ℚ (rationalCyclotomicArtinPlace q)) +attribute [local instance] rationalCyclotomicArtinLocalizedIsIntegralClosure + +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedIntegerModuleFinite (m : ℕ+) (q : Nat.Primes) : @@ -1224,6 +1415,8 @@ noncomputable local instance (rationalCyclotomicArtinBaseAbv q).Completion (rationalCyclotomicArtinLocalizedField m q) +attribute [local instance] rationalCyclotomicArtinLocalizedIntegerModuleFinite + section RationalCyclotomicPrincipalPrime /-! ## Ramified prime-power transport @@ -1231,6 +1424,7 @@ section RationalCyclotomicPrincipalPrime This section reuses the canonical finite-place Artin tower above. In particular, it introduces no parallel completion/localization instance tower. -/ +open scoped Classical in noncomputable local instance rationalCyclotomicPrincipalPrimeLevelIsCyclotomicExtension (p : Nat.Primes) (n : ℕ) : @@ -1246,18 +1440,24 @@ noncomputable local instance 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 private abbrev rationalCyclotomicPrincipalPrimeLevel (m : ℕ+) := rationalCyclotomicArtinLevel m +open scoped Classical in private 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] @@ -1274,6 +1474,9 @@ noncomputable def (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 @@ -1281,6 +1484,9 @@ noncomputable local instance 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] := @@ -1288,6 +1494,7 @@ private noncomputable def rationalFinitePlaceCompletionAlgEquivPadic (f := rationalFinitePlaceCompletionRingEquivPadic p) (rationalFinitePlaceCompletionRingEquivPadic_algebraMap p) +open scoped Classical in noncomputable local instance rationalCyclotomicArtinLocalizedPadicScalarTower (m : ℕ+) (p : Nat.Primes) : @@ -1298,6 +1505,9 @@ noncomputable local instance 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 @@ -1319,6 +1529,7 @@ private theorem rationalCyclotomicArtin_padic_algebraMap (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 @@ -1338,6 +1549,7 @@ private theorem rationalCyclotomicArtin_algebraAdjoin_restrictScalars (rationalCyclotomicArtinPlace p)} : Set (rationalCyclotomicArtinLocalizedField m p)) +open scoped Classical in private theorem rationalCyclotomicArtin_baseAlgebraAdjoin_restrict_eq_top (m : ℕ+) (p : Nat.Primes) : @@ -1367,6 +1579,7 @@ private theorem (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 @@ -1376,6 +1589,7 @@ private theorem rationalCyclotomicArtin_restrictScalars_top_base_eq_padic (Subalgebra.restrictScalars_top ℚ).trans (Subalgebra.restrictScalars_top ℚ).symm +open scoped Classical in private theorem rationalCyclotomicArtin_padicAlgebraAdjoin_restrict_eq_top (m : ℕ+) (p : Nat.Primes) : @@ -1390,6 +1604,7 @@ private theorem ((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 @@ -1403,6 +1618,7 @@ theorem rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional attribute [local instance] rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional +open scoped Classical in noncomputable local instance rationalCyclotomicPrincipalPrimePadicLevelIsAbelianGalois (p : Nat.Primes) (n : ℕ) : @@ -1412,12 +1628,20 @@ noncomputable local instance (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 @@ -1472,6 +1696,7 @@ theorem padicMultiplicativePrimitiveRoot_adjoin_eq_top 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 @@ -1487,6 +1712,7 @@ theorem padicMultiplicativeLevel_isCyclotomicExtension (padicMultiplicativePrimitiveRoot_isPrimitiveRoot p n) (padicMultiplicativePrimitiveRoot_adjoin_eq_top p n) +open scoped Classical in private theorem rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_isPrimitiveRoot (p : Nat.Primes) (n : ℕ) : @@ -1506,6 +1732,7 @@ private theorem (rationalCyclotomicPrincipalPrimeModulus p n) (RayClass.rationalPrime p) +open scoped Classical in private theorem rationalCyclotomicPrincipalPrimeLocalizedPrimitiveRoot_adjoin_eq_top (p : Nat.Primes) (n : ℕ) : @@ -1521,6 +1748,7 @@ private theorem (rationalCyclotomicArtin_padicAlgebraAdjoin_restrict_eq_top (rationalCyclotomicPrincipalPrimeModulus p n) p) +open scoped Classical in private theorem rationalCyclotomicPrincipalPrimeLocalizedLevel_isCyclotomicExtension (p : Nat.Primes) (n : ℕ) : @@ -1537,6 +1765,7 @@ private theorem (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 @@ -1560,6 +1789,7 @@ noncomputable def rationalCyclotomicLocalizedCompletionPadicAlgEquiv /-! ## The ramified principal finite-place factor -/ +open scoped Classical in private theorem rationalCyclotomicPrincipalPrime_galEquivZMod_eq_of_action (p : Nat.Primes) (n : ℕ) @@ -1625,6 +1855,7 @@ private theorem 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 @@ -1651,6 +1882,7 @@ theorem chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq (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} @@ -1673,11 +1905,12 @@ private theorem (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] - [FiniteDimensional K L] [IsAbelianGalois K L] + [IsAbelianGalois K L] (v : HeightOneSpectrum (𝓞 K)) (w : AbsoluteValueExtension (HeightOneSpectrum.adicAbv K v) L) @@ -1731,6 +1964,7 @@ private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action 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 : ℕ) @@ -1751,6 +1985,7 @@ private theorem map_primitiveRoot_eq_pow_of_eq_pow _ = (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] @@ -1829,6 +2064,7 @@ private theorem finitePlaceLocalArtinMonoidHom_apply_semilinear (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 @@ -1895,6 +2131,7 @@ theorem finitePlaceArtinMonoidHomOfExtension_eq_one_of_semilinear 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 @@ -1903,6 +2140,7 @@ private noncomputable def rationalCyclotomicPrincipalPrimeLocalizedRoot (rationalCyclotomicPrincipalPrimeModulus p n) (RayClass.rationalPrime p) +open scoped Classical in private noncomputable def rationalCyclotomicPrincipalPrimeResidueUnit (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : (ZMod (p.1 ^ (n + 1)))ˣ := @@ -1913,6 +2151,7 @@ private noncomputable def rationalCyclotomicPrincipalPrimeResidueUnit (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) : @@ -1949,6 +2188,7 @@ private theorem rationalCyclotomicPrincipalPrime_localizedBase_commutes (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. -/ @@ -1987,6 +2227,7 @@ theorem (rationalFinitePlaceCompletionRingEquivPadic_semilinearValuationCompatible p) x htrivial +open scoped Classical in private theorem padicMultiplicativePrimitiveRoot_rationalPrimeUnitParameterGaloisAction (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : @@ -2032,6 +2273,7 @@ private theorem rw [huRational] exact hAction +open scoped Classical in private noncomputable def rationalCyclotomicPrincipalPrimePadicTargetArtin (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : Gal(RationalCyclotomicPrincipalPrimePadicLevel p n / ℚ_[p.1]) := @@ -2053,6 +2295,7 @@ private noncomputable def rationalCyclotomicPrincipalPrimePadicTargetArtin (rationalFinitePlaceCompletionRingEquivPadic p).toMonoidHom (rationalPrincipalFinitePlaceInput x p)) +open scoped Classical in private noncomputable def rationalCyclotomicPrincipalPrimePadicUnitParameterArtin (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : @@ -2064,6 +2307,7 @@ private noncomputable def (padicLocalField p.1) n (rationalPrimeUnitValuationSubringUnit x p)) +open scoped Classical in private theorem rationalCyclotomicPrincipalPrime_padicTargetArtin_eq_unitParameter (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : @@ -2098,6 +2342,7 @@ private theorem rationalPadicFieldUnit_uniformizerUnitPart, padicMultiplicativeAbelianLocalArtin_eq_unitParameter] +open scoped Classical in private theorem rationalCyclotomicPrincipalPrime_padicArtin_action_eq_unitParameter (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : @@ -2180,6 +2425,7 @@ private theorem (rationalCyclotomicPrincipalPrime_padicTargetArtin_eq_unitParameter p n x) +open scoped Classical in private theorem rationalCyclotomicPrincipalPrime_padicUnitParameterArtin_action (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : @@ -2219,6 +2465,7 @@ private theorem 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 @@ -2270,6 +2517,7 @@ private theorem rationalCyclotomicPrincipalPrime_localArtin_action (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. -/ @@ -2299,6 +2547,7 @@ noncomputable def rationalCyclotomicPrincipalPrimeChosenArtin (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 @@ -2327,6 +2576,7 @@ theorem galEquivZMod_chosenFinitePlaceArtinMonoidHom_principal_at_prime end RationalCyclotomicPrincipalPrime +open scoped Classical in private theorem rationalCyclotomicArtinUnramified (m : ℕ+) (q : Nat.Primes) (hq : ¬ q.1 ∣ (m : ℕ)) : @@ -2337,6 +2587,7 @@ private theorem rationalCyclotomicArtinUnramified (rationalCyclotomicLevel_chosenFinitePlaceIsUnramified m q hq) +open scoped Classical in private noncomputable def rationalCyclotomicArtinLocalFrobeniusOf (m : ℕ+) (q : Nat.Primes) (hUnramified : @@ -2351,6 +2602,7 @@ private noncomputable def rationalCyclotomicArtinLocalFrobeniusOf (rationalCyclotomicArtinBaseAbv q).Completion (rationalCyclotomicArtinLocalizedField m q) +open scoped Classical in private noncomputable def rationalCyclotomicArtinLocalFrobenius (m : ℕ+) (q : Nat.Primes) (hq : ¬ q.1 ∣ (m : ℕ)) : @@ -2360,6 +2612,7 @@ private noncomputable def rationalCyclotomicArtinLocalFrobenius rationalCyclotomicArtinLocalFrobeniusOf m q (rationalCyclotomicArtinUnramified m q hq) +open scoped Classical in private noncomputable def rationalCyclotomicArtinDecompositionEquiv (m : ℕ+) (q : Nat.Primes) : absoluteValueDecompositionGroup ℚ @@ -2373,6 +2626,7 @@ private noncomputable def rationalCyclotomicArtinDecompositionEquiv (rationalCyclotomicArtinPlace q)) (rationalCyclotomicArtinExtension m q) +open scoped Classical in private noncomputable def rationalCyclotomicArtinLocalToGlobalMonoidHom (m : ℕ+) (q : Nat.Primes) : (rationalCyclotomicArtinLocalizedField m q ≃ₐ[ @@ -2385,6 +2639,7 @@ private noncomputable def rationalCyclotomicArtinLocalToGlobalMonoidHom (rationalCyclotomicArtinPlace q) (rationalCyclotomicArtinExtension m q) +open scoped Classical in private noncomputable abbrev rationalCyclotomicArtinLocalArtin (m : ℕ+) (q : Nat.Primes) (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : @@ -2396,6 +2651,7 @@ private noncomputable abbrev rationalCyclotomicArtinLocalArtin (rationalCyclotomicArtinPlace q) (rationalCyclotomicArtinExtension m q) x +open scoped Classical in private noncomputable def rationalCyclotomicArtinGlobalFrobeniusOf (m : ℕ+) (q : Nat.Primes) (hUnramified : @@ -2408,6 +2664,7 @@ private noncomputable def rationalCyclotomicArtinGlobalFrobeniusOf (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. -/ @@ -2420,6 +2677,7 @@ private noncomputable def rationalCyclotomicChosenArithmeticFrobenius rationalCyclotomicArtinGlobalFrobeniusOf m q (rationalCyclotomicArtinUnramified m q hq) +open scoped Classical in private noncomputable abbrev rationalCyclotomicArtinLocalInput (q : Nat.Primes) (x : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ) : @@ -2427,6 +2685,7 @@ private noncomputable abbrev rationalCyclotomicArtinLocalInput 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. -/ @@ -2437,6 +2696,7 @@ noncomputable def rationalCyclotomicArtinLocalExponent (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 @@ -2448,6 +2708,7 @@ noncomputable def rationalCyclotomicChosenFinitePlaceArtinValue (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 ℚ)ˣ) : @@ -2483,6 +2744,7 @@ private theorem rationalCyclotomicArtinLocalArtin_eq (K := ℚ) (rationalCyclotomicArtinPlace q) x) := by rfl +open scoped Classical in private theorem rationalCyclotomicChosenArithmeticFrobenius_eq_lift (m : ℕ+) (q : Nat.Primes) (hq : ¬ q.1 ∣ (m : ℕ)) : @@ -2493,6 +2755,7 @@ private theorem rationalCyclotomicChosenArithmeticFrobenius_eq_lift (rationalCyclotomicArtinLocalFrobenius m q hq)) := by rfl +open scoped Classical in private theorem rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow_of (m : ℕ+) (q : Nat.Primes) @@ -2533,6 +2796,7 @@ private theorem (rationalCyclotomicArtinLocalToGlobalMonoidHom m q) (rationalCyclotomicArtinLocalInput q x) +open scoped Classical in private theorem rationalCyclotomicFinitePlaceMappedLocalArtin_eq_frobenius_zpow (m : ℕ+) (q : Nat.Primes) @@ -2568,6 +2832,7 @@ private theorem 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 @@ -2622,6 +2887,7 @@ private theorem (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 @@ -2630,6 +2896,7 @@ private theorem rationalCyclotomicArtinResidueFieldCard rationalFinitePlaceCompletion_residueField_card (rationalCyclotomicArtinPlace q) +open scoped Classical in private theorem rationalCyclotomicArtinLocalFrobenius_apply_root (m : ℕ+) (q : Nat.Primes) (hq : ¬ q.1 ∣ (m : ℕ)) : @@ -2661,6 +2928,7 @@ private theorem rationalCyclotomicArtinLocalFrobenius_apply_root m (rationalCyclotomicArtinPlace q)) ^ n) (rationalCyclotomicArtinResidueFieldCard q)) +open scoped Classical in private theorem rationalCyclotomicArtinFrobeniusLift_localization (m : ℕ+) (q : Nat.Primes) (hq : ¬ q.1 ∣ (m : ℕ)) : @@ -2723,6 +2991,7 @@ private theorem rationalCyclotomicArtinFrobeniusLift_localization ((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 : ℕ)) : @@ -2771,6 +3040,7 @@ private theorem rationalCyclotomicChosenArithmeticFrobenius_localization (rationalCyclotomicLevelPrimitiveRoot m)) := rationalCyclotomicArtinFrobeniusLift_localization m q hq +open scoped Classical in private theorem rationalCyclotomicArtinPrimitiveRoot_localization (m : ℕ+) (q : Nat.Primes) : AbsoluteValue.toAlgebraicLocalization @@ -2782,6 +3052,7 @@ private theorem rationalCyclotomicArtinPrimitiveRoot_localization m (rationalCyclotomicArtinPlace q) := by rfl +open scoped Classical in private theorem rationalCyclotomicArtinLocalizedRoot_pow (m : ℕ+) (q : Nat.Primes) : (rationalCyclotomicLocalizedPrimitiveRoot @@ -2806,6 +3077,7 @@ private theorem rationalCyclotomicArtinLocalizedRoot_pow 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 : ℕ)) : @@ -2876,6 +3148,7 @@ private theorem rationalCyclotomicChosenArithmeticFrobenius_apply_root (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 @@ -2891,6 +3164,7 @@ private theorem galEquivZMod_chosenArithmeticFrobenius 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. -/ @@ -2920,6 +3194,7 @@ theorem galEquivZMod_chosenFinitePlaceArtinMonoidHom_of_not_dvd 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 @@ -2940,6 +3215,7 @@ theorem 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 @@ -2963,6 +3239,7 @@ theorem 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean index 792c60612e..1cec00cff9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean @@ -154,7 +154,6 @@ noncomputable def rationalCyclotomicLocalizedPrimitiveRoot /-- The selected localized root is the actual global-to-local image of the selected global primitive root. -/ -@[simp] theorem rationalCyclotomicGlobalToLocalizedAlgHom_primitiveRoot (m : ℕ+) (v : HeightOneSpectrum (𝓞 ℚ)) : rationalCyclotomicGlobalToLocalizedAlgHom m v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 06d66ac0a3..5659c82863 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -18,7 +18,7 @@ The final theorem separates the genuine `p`-factor from the explicit away-from-`p` finite product. The construction also applies to `k = 0`. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -28,12 +28,19 @@ namespace Reciprocity open Function -local instance (q : Nat.Primes) : Fact q.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := ⟨q.2⟩ -local instance (m : ℕ+) : NeZero (m : ℕ) := +attribute [local instance] localPrimesInstance1 + +open scoped Classical in +local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ +attribute [local instance] localNeZeroInstance1 + +open scoped Classical in local instance rationalCyclotomicPrincipalPrimePowerNumberField (p : Nat.Primes) (k : ℕ) : NumberField (KummerTheory.rationalCyclotomicLevel @@ -41,6 +48,9 @@ local instance rationalCyclotomicPrincipalPrimePowerNumberField 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 @@ -48,6 +58,9 @@ local instance rationalCyclotomicPrincipalPrimePowerFiniteDimensional 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 @@ -55,6 +68,9 @@ local instance rationalCyclotomicPrincipalPrimePowerIsGalois 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 @@ -63,6 +79,9 @@ local instance rationalCyclotomicPrincipalPrimePowerIsAbelianGalois (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 : ℕ+) : @@ -70,6 +89,9 @@ noncomputable local instance (KummerTheory.rationalCyclotomicLevel m) := rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m +attribute [local instance] rationalCyclotomicPrincipalLevelFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicPrincipalLevelIsAbelianGalois (m : ℕ+) : @@ -77,6 +99,9 @@ noncomputable local instance (KummerTheory.rationalCyclotomicLevel m) := rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois m +attribute [local instance] rationalCyclotomicPrincipalLevelIsAbelianGalois + +open scoped Classical in private noncomputable def rationalCyclotomicPrincipalHeightOneArtinInput (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -93,6 +118,7 @@ private noncomputable def rationalCyclotomicPrincipalHeightOneArtinInput (IdeleGroup.finiteComponent v (IdeleGroup.principalIdele ℚ x)) +open scoped Classical in private theorem rationalCyclotomicPrincipalHeightOneArtinInput_spec (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -107,6 +133,7 @@ private theorem rationalCyclotomicPrincipalHeightOneArtinInput_spec (IdeleGroup.principalIdele ℚ x)) := by rfl +open scoped Classical in private noncomputable def rationalCyclotomicPrincipalHeightOneCharacter (p : Nat.Primes) (k : ℕ) (x : ℚˣ) (v : HeightOneSpectrum (𝓞 ℚ)) : @@ -120,6 +147,7 @@ private noncomputable def rationalCyclotomicPrincipalHeightOneCharacter ⟨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 @@ -144,6 +172,7 @@ theorem rationalCyclotomicPrincipalHeightOneCharacter_spec 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. -/ @@ -154,6 +183,7 @@ noncomputable def rationalCyclotomicPrincipalFinitePlaceCharacter ((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 = @@ -162,6 +192,7 @@ private theorem rationalCyclotomicPrincipalFinitePlaceCharacter_spec (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 @@ -192,6 +223,7 @@ theorem ((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 @@ -301,6 +333,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula (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 @@ -311,6 +344,7 @@ theorem rationalPrime_not_dvd_pow_of_ne 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 @@ -338,6 +372,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_of_ne ⟨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 @@ -401,6 +436,7 @@ theorem 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] @@ -421,6 +457,7 @@ theorem 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. -/ @@ -438,6 +475,7 @@ theorem (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. -/ @@ -500,6 +538,7 @@ theorem 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 @@ -522,12 +561,14 @@ theorem 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 : ℚˣ) : @@ -536,6 +577,7 @@ private theorem rationalCyclotomicPrincipalHeightOneCharacter p k x v := by rfl +open scoped Classical in private theorem rationalCyclotomicPrincipalHeightOneCharacterFinprod_spec (p : Nat.Primes) (k : ℕ) (x : ℚˣ) : rationalCyclotomicPrincipalHeightOneCharacterFinprod p k x = @@ -565,6 +607,7 @@ private theorem rationalCyclotomicPrincipalHeightOneCharacterFinprod_spec 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 : ℚˣ) : @@ -594,6 +637,7 @@ private theorem (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. -/ @@ -624,6 +668,7 @@ theorem 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean index 990cc9b9a3..90e7591226 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean @@ -13,16 +13,20 @@ character specification reduces the claim to the ramified chosen-Artin formula proved in `RationalCyclotomicFinitePlaceArtin`. -/ -open scoped Classical + noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean index 9b96b7789d..cfc66b8def 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean @@ -17,7 +17,7 @@ torsion-free rational `ZHat`-extension removes this final sign ambiguity and proves that every rational principal idele has trivial value. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -25,9 +25,13 @@ noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +open scoped Classical in local instance rationalCyclotomicPrincipalProductPrimePowerNumberField (p : Nat.Primes) (k : ℕ) : NumberField (KummerTheory.rationalCyclotomicLevel @@ -35,6 +39,9 @@ local instance rationalCyclotomicPrincipalProductPrimePowerNumberField 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 @@ -42,6 +49,9 @@ local instance rationalCyclotomicPrincipalProductPrimePowerFiniteDimensional 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 @@ -49,6 +59,9 @@ local instance rationalCyclotomicPrincipalProductPrimePowerIsAbelianGalois rationalCyclotomicLevelIsAbelianGalois ⟨p.1 ^ k, pow_pos p.2.pos k⟩ +attribute [local instance] rationalCyclotomicPrincipalProductPrimePowerIsAbelianGalois + +open scoped Classical in noncomputable local instance rationalCyclotomicPrincipalProductLevelFiniteDimensional (m : ℕ+) : @@ -56,6 +69,9 @@ noncomputable local instance (KummerTheory.rationalCyclotomicLevel m) := rationalCyclotomicPrincipalPrimeLevelFiniteDimensional m +attribute [local instance] rationalCyclotomicPrincipalProductLevelFiniteDimensional + +open scoped Classical in noncomputable local instance rationalCyclotomicPrincipalProductLevelIsAbelianGalois (m : ℕ+) : @@ -63,6 +79,9 @@ noncomputable local instance (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 @@ -94,6 +113,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceProduct_eq_sign (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. -/ @@ -113,6 +133,7 @@ theorem (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 @@ -131,6 +152,7 @@ theorem 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 @@ -146,8 +168,8 @@ theorem rationalCyclotomicZHatIdeleValue_principalFinitePart_eq_one rationalCyclotomicGlobalArtin_character_toZModPow_principalFinitePart_sq p k x +open scoped Classical in /-- The rational cyclotomic value kills every rational principal idele. -/ -@[simp] theorem rationalCyclotomicZHatIdeleValue_principalIdele_eq_one (x : ℚˣ) : rationalCyclotomicZHatIdeleValue @@ -157,6 +179,7 @@ theorem rationalCyclotomicZHatIdeleValue_principalIdele_eq_one (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index 5049b25eea..4b3e6eb8ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -27,7 +27,7 @@ cyclotomic character then detects that the full local Artin symbol is trivial. -/ -open scoped Classical NNReal NumberField ValuativeRel +open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain noncomputable section @@ -44,9 +44,12 @@ open LocalFieldTheory.DiscreteValuationField.CompleteDVF open LocalFieldTheory.DiscreteValuationField.Examples.Qp open LubinTate -local instance (q : Nat.Primes) : Fact q.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := ⟨q.2⟩ +attribute [local instance] localPrimesInstance1 + attribute [local instance] rationalCyclotomicPrincipalPrimeLevelFiniteDimensional rationalCyclotomicPrincipalPrimeLevelIsAbelianGalois @@ -65,6 +68,7 @@ attribute [local instance] rationalFinitePlaceBaseIsValuativeTopology rationalFinitePlaceBaseIsNonarchimedeanLocalField +open scoped Classical in private theorem rationalRayNorm_integerUnitsMap_mem_higherPrincipalUnits_iff (q : Nat.Primes) (n : ℕ) @@ -90,6 +94,7 @@ private theorem (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]ˣ) : @@ -143,6 +148,7 @@ private theorem rationalRayNorm_fieldUnitsMap_integerUnits (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. -/ @@ -210,6 +216,7 @@ section PrimePowerCalculation attribute [local instance] rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional +open scoped Classical in noncomputable local instance rationalCyclotomicRayNormPadicLevelIsAbelianGalois (q : Nat.Primes) (n : ℕ) : @@ -219,6 +226,9 @@ noncomputable local instance (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 @@ -282,6 +292,7 @@ private theorem rationalPrimePowerPadicAbelianLocalArtin_eq_one 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 @@ -299,6 +310,7 @@ private noncomputable def rationalPrimePowerChosenFinitePlaceArtinValue (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 @@ -322,6 +334,7 @@ private theorem rationalPrimePowerFinitePlaceLocalInputPadicArtin_eq_one (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 @@ -344,6 +357,7 @@ private theorem rationalPrimePowerFinitePlaceArtinOfExtension_eq_one 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 @@ -360,6 +374,7 @@ private theorem 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 @@ -381,6 +396,7 @@ theorem 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. -/ @@ -406,6 +422,7 @@ private theorem 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. -/ @@ -424,6 +441,7 @@ private theorem rationalCyclotomicRayNormAwayChosenFinitePlaceArtin_eq_one end PrimePowerCalculation +open scoped Classical 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. -/ @@ -447,6 +465,7 @@ private theorem _root_.GlobalClassFieldTheory.GlobalClassFields.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 @@ -648,6 +667,7 @@ theorem 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 @@ -676,6 +696,7 @@ theorem rationalCyclotomicLevel_rationalModulus_localNorm 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 @@ -726,6 +747,7 @@ theorem (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 @@ -783,6 +805,7 @@ theorem 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)`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean index 1a8e0d208e..fdcb53f489 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean @@ -15,7 +15,7 @@ through actual finite cyclotomic levels then detects every finite coordinate of the rational cyclotomic `ZHat`-extension. -/ -open scoped Classical NumberField IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField ClassFormation noncomputable section @@ -23,9 +23,13 @@ noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +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. -/ @@ -51,6 +55,7 @@ theorem 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean index e44e94ce36..d9a8a18ddf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean @@ -17,16 +17,19 @@ The last declarations package rational `p`-adic units as units of `ℤ_[p]` and identify the reduction of a natural unit modulo `p ^ k`. -/ -open scoped BigOperators Classical - +open scoped BigOperators noncomputable section namespace GlobalClassFieldTheory namespace Reciprocity -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +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 @@ -35,6 +38,7 @@ def rationalPrimeFactorizationSupport (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 @@ -46,21 +50,23 @@ theorem mem_rationalPrimeFactorizationSupport (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. -/ -@[simp] theorem padicValRat_rationalPrimeUnit (x : ℚˣ) (p : Nat.Primes) : padicValRat p.1 (rationalPrimeUnit x p : ℚ) = 0 := by @@ -75,6 +81,7 @@ theorem padicValRat_rationalPrimeUnit 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 @@ -175,6 +182,7 @@ theorem rational_factorization_over_support ∏ 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 @@ -233,6 +241,7 @@ theorem rationalPrimeUnit_factorization (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 @@ -244,6 +253,7 @@ def padicIntUnitOfRat 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] @@ -254,6 +264,7 @@ theorem padicIntUnitOfRat_coe (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 @@ -273,6 +284,7 @@ theorem padicValRat_rational_num_sign 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]ˣ := @@ -283,15 +295,16 @@ def rationalSignPadicUnit (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. -/ -@[simp] 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 @@ -302,6 +315,7 @@ theorem rationalSignPadicUnit_val 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 @@ -324,9 +338,9 @@ theorem rationalSignPadicUnit_sq rw [hsign] simp +open scoped Classical in /-- Reduction of the rational sign unit modulo `p ^ k` has the expected integer value. -/ -@[simp] theorem rationalSignPadicUnit_toZModPow_val (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : ((Units.map (PadicInt.toZModPow k).toMonoidHom @@ -340,8 +354,8 @@ theorem rationalSignPadicUnit_toZModPow_val rw [rationalSignPadicUnit_val] simp +open scoped Classical in /-- Reduction of the rational sign unit still has square one. -/ -@[simp] theorem rationalSignPadicUnit_toZModPow_sq (x : ℚˣ) (p : Nat.Primes) (k : ℕ) : Units.map (PadicInt.toZModPow k).toMonoidHom @@ -349,6 +363,7 @@ theorem rationalSignPadicUnit_toZModPow_sq 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) : @@ -359,6 +374,7 @@ def padicNatUnit 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) : @@ -366,9 +382,9 @@ theorem padicNatUnit_val 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)`. -/ -@[simp] theorem padicNatUnit_toZModPow (p : Nat.Primes) (q k : ℕ) (h : p.1.Coprime q) : Units.map (PadicInt.toZModPow k).toMonoidHom @@ -377,6 +393,7 @@ theorem padicNatUnit_toZModPow apply Units.ext simp +open scoped Classical in /-- The successor of `p` is a `p`-adic unit. -/ theorem padicValRat_rationalPrime_succ (p : Nat.Primes) : @@ -390,6 +407,7 @@ theorem padicValRat_rationalPrime_succ 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 @@ -414,6 +432,7 @@ theorem padicNatUnit_not_isOfFinOrder_of_one_lt (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 : ℕ} @@ -421,6 +440,7 @@ theorem prime_of_mem_rationalPrimeFactorizationSupport 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 @@ -435,12 +455,14 @@ def rationalPrimeFactorizationSupportEmbedding 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] @@ -463,17 +485,17 @@ theorem mem_rationalPrimeFactorizationPrimeSupport_iff apply Subtype.ext rfl +open scoped Classical in /-- The distinguished prime belongs to the prime-valued support. -/ -@[simp] 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. -/ -@[simp] theorem mem_rationalPrimeFactorizationPrimeSupport_erase_iff (x : ℚˣ) (p q : Nat.Primes) : q ∈ (rationalPrimeFactorizationPrimeSupport x p).erase p ↔ @@ -491,6 +513,7 @@ theorem mem_rationalPrimeFactorizationPrimeSupport_erase_iff (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 @@ -501,6 +524,7 @@ def rationalPrimeOfMemFactorizationSupportErase 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 @@ -523,6 +547,7 @@ def rationalPrimeFactorizationSupportEraseEquiv 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 : ℕ} @@ -537,6 +562,7 @@ theorem coprime_of_mem_rationalPrimeFactorizationSupport_erase (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 @@ -642,6 +668,7 @@ theorem padicIntUnitOfRat_rationalPrimeUnit_factorization 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 : ℕ) : @@ -664,6 +691,7 @@ theorem padicIntUnitOfRat_rationalPrimeUnit_toZModPow 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 @@ -684,6 +712,7 @@ theorem padicIntUnitOfRat_rationalPrimeUnit_mul_inverseFactors_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. -/ @@ -730,6 +759,7 @@ theorem 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 @@ -750,6 +780,7 @@ theorem rationalSignPadicUnit_mul_primeUnit_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 : ℕ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index cf34866078..65571440f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -27,8 +27,7 @@ reciprocity, in the standard field `ℚ_[p]`, and in the valuation subring used by the multiplicative Lubin--Tate construction. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -37,9 +36,13 @@ namespace Reciprocity open LocalFieldTheory.DiscreteValuationField.Examples.Qp -local instance (p : Nat.Primes) : Fact p.1.Prime := +open scoped Classical in +local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := ⟨p.2⟩ +attribute [local instance] localPrimesInstance1 + +open scoped Classical in /-- The rational `p`-unit has value one for the height-one valuation corresponding to `p`. -/ theorem rationalPrimeUnit_heightOneValuation_eq_one @@ -64,6 +67,7 @@ theorem rationalPrimeUnit_heightOneValuation_eq_one 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 @@ -77,6 +81,7 @@ def rationalPrimeUnitValuationSubringUnit (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] @@ -99,6 +104,7 @@ theorem rationalPrimeUnitValuationSubringUnit_coe 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 @@ -116,6 +122,7 @@ theorem standardLubinTateUnitFactorFieldUnit_rationalPrimeUnit 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 @@ -136,6 +143,7 @@ theorem standardLubinTateBaseUniformizerUnit_eq_rationalPrimeGenerator 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 @@ -164,6 +172,7 @@ theorem rationalPrimeUnit_mul_primeGenerator_zpow 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. -/ @@ -184,6 +193,7 @@ theorem rationalPadicFieldUnit_eq_unitFactor_mul_baseUniformizer_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 @@ -264,6 +274,7 @@ theorem rationalPadicFieldUnit_uniformizerValueExponent 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`. -/ @@ -312,6 +323,7 @@ theorem rationalPadicFieldUnit_uniformizerUnitPart 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]`. -/ @@ -340,6 +352,7 @@ theorem padicCompletionEquiv_principalFiniteComponent_rationalPrimeUnit (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]ˣ`. -/ @@ -365,6 +378,7 @@ theorem padicCompletionEquiv_principalFiniteComponent (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 @@ -385,6 +399,7 @@ theorem padicCompletionEquiv_principalFiniteComponent_factorization 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. -/ @@ -404,6 +419,7 @@ theorem 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 @@ -423,6 +439,7 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean index f0f4264551..823e644232 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -12,7 +12,7 @@ The dyadic correction specializes power-residue reciprocity over `ℚ` and derives Gauss's quadratic reciprocity law. -/ -open scoped BigOperators Classical NumberField NumberTheorySymbols ValuativeRel WithZero +open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero open NumberField IsDedekindDomain noncomputable section @@ -23,7 +23,10 @@ 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. -@[reducible] noncomputable local instance +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 ℚ @@ -38,12 +41,15 @@ namespace Reciprocity (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 (𝓞 ℚ) →* ℤ @@ -51,9 +57,11 @@ private def rationalQuadraticRootValuePNatMonoidHom : /-! ## 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 private noncomputable def rationalTwoAdicCompletionToIndexedPadic : (RayClass.rationalPrime rationalTwoPrime).adicCompletion ℚ ≃+* ℚ_[Rat.HeightOneSpectrum.primesEquiv @@ -74,6 +82,7 @@ private noncomputable def rationalTwoAdicCompletionToIndexedPadic : (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 : @@ -90,20 +99,24 @@ noncomputable def rationalTwoAdicCompletionEquivPadic : ((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) : ℚˣ := @@ -113,21 +126,25 @@ noncomputable def rationalNaturalFieldUnit 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 : @@ -137,6 +154,7 @@ theorem powerResidueExponentIdeal_rational_two : 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 : @@ -167,6 +185,7 @@ theorem powerResidueExponentFinitePlaces_rational_two : 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 @@ -180,6 +199,7 @@ noncomputable def rationalTwoAdicSignedOddUnit subst m norm_num at hm))) +open scoped Classical in @[simp] theorem rationalTwoAdicSignedOddUnit_coe (m : ℕ) (hm : Odd m) : @@ -187,6 +207,7 @@ theorem rationalTwoAdicSignedOddUnit_coe (((-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. -/ @@ -276,7 +297,7 @@ theorem rationalTwoAdicSignedOddUnit_squareClass rfl have hfive : toField - ((LocalClassFieldTheory.padicDVR_five : + ((LocalClassFieldTheory.padicDVRFive : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) = five := by @@ -295,19 +316,20 @@ theorem rationalTwoAdicSignedOddUnit_squareClass calc rationalTwoAdicSignedOddUnit m hm = toField qO := hbase.symm _ = toField - ((LocalClassFieldTheory.padicDVR_five : + ((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 := finitePlaceHilbert_completionUnit ℚ v₂ + let aC := finitePlaceHilbertCompletionUnit ℚ v₂ (rationalNaturalFieldUnit m (by intro hm0 subst m @@ -325,12 +347,12 @@ theorem rationalTwoAdicOddUnit_squareClass intro hm0 subst m norm_num at hm - let aC : Cˣ := finitePlaceHilbert_completionUnit ℚ v₂ + 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, finitePlaceHilbert_completionUnit, Units.coe_map, + simp only [aC, C, finitePlaceHilbertCompletionUnit, Units.coe_map, rationalNaturalFieldUnit_coe] exact map_natCast (algebraMap ℚ (HeightOneSpectrum.adicAbv ℚ v₂).Completion) m @@ -400,6 +422,7 @@ theorem rationalTwoAdicOddUnit_squareClass _ = (-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] @@ -413,6 +436,7 @@ private theorem localHilbertSymbol_pow_left 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] @@ -425,6 +449,7 @@ private theorem localHilbertSymbol_pow_right 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] @@ -440,6 +465,7 @@ private theorem localHilbertSymbol_mul_left 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] @@ -451,6 +477,7 @@ private theorem localHilbertSymbol_pow_pow 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] @@ -462,6 +489,7 @@ private theorem localQuadraticHilbertSymbol_square_left_eq_one 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] @@ -473,6 +501,7 @@ private theorem localQuadraticHilbertSymbol_square_right_eq_one 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] @@ -483,6 +512,7 @@ private theorem localQuadraticHilbertSymbol_value_sq_eq_one 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] @@ -523,6 +553,7 @@ private theorem localQuadraticHilbertSymbol_squareClass_formula 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 @@ -596,6 +627,7 @@ theorem rationalTwoAdicHilbert_negOne_five_eq_one : 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 @@ -645,15 +677,18 @@ theorem rationalTwoAdicHilbert_five_five_eq_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 @@ -662,6 +697,7 @@ private theorem rationalQuadraticNegOne_not_mem 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) : @@ -677,6 +713,7 @@ private theorem rationalFinitePlaceHilbert_negOne_negOne_eq_one_of_ne_two · 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`. -/ @@ -760,6 +797,7 @@ theorem rationalFinitePlaceHilbert_negOne_negOne_eq_negOne : _ = 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 : @@ -811,7 +849,7 @@ theorem rationalTwoAdicHilbert_negOne_negOne_eq_negOne : (RayClass.rationalPrime rationalTwoPrime)).Completion (-1) = -1 rw [map_neg, map_one] have hnegC : - finitePlaceHilbert_completionUnit ℚ + finitePlaceHilbertCompletionUnit ℚ (RayClass.rationalPrime rationalTwoPrime) rationalQuadraticNegOneFieldUnit = (-1 : (HeightOneSpectrum.adicAbv ℚ @@ -826,6 +864,7 @@ theorem rationalTwoAdicHilbert_negOne_negOne_eq_negOne : 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 @@ -841,12 +880,12 @@ theorem rationalTwoAdicHilbert_odd_eq_classicalSign (by norm_num) v₂) (finitePlaceHilbert_primitiveRoots_nonempty ℚ (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty v₂) - (finitePlaceHilbert_completionUnit ℚ v₂ + (finitePlaceHilbertCompletionUnit ℚ v₂ (rationalNaturalFieldUnit a (by intro ha0 subst a norm_num at ha))) - (finitePlaceHilbert_completionUnit ℚ v₂ + (finitePlaceHilbertCompletionUnit ℚ v₂ (rationalNaturalFieldUnit b (by intro hb0 subst b @@ -877,9 +916,9 @@ theorem rationalTwoAdicHilbert_odd_eq_classicalSign intro hb0 subst b norm_num at hb - let aC := finitePlaceHilbert_completionUnit ℚ v₂ + let aC := finitePlaceHilbertCompletionUnit ℚ v₂ (rationalNaturalFieldUnit a ha0) - let bC := finitePlaceHilbert_completionUnit ℚ v₂ + let bC := finitePlaceHilbertCompletionUnit ℚ v₂ (rationalNaturalFieldUnit b hb0) let fiveC : Cˣ := Units.mk0 (5 : C) (finitePlaceHilbert_natCast_ne_zero ℚ (5 : ℕ+) (by norm_num) v₂) @@ -897,6 +936,7 @@ theorem rationalTwoAdicHilbert_odd_eq_classicalSign 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 @@ -969,6 +1009,7 @@ theorem rationalFinitePlaceHilbert_odd_eq_classicalSign 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 ℚ) : @@ -997,6 +1038,7 @@ private theorem rationalInfinitePlaceHilbert_natural_eq_one 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. -/ @@ -1041,6 +1083,7 @@ theorem rationalQuadraticBadPlaceCorrection_eq_classicalSign 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 @@ -1057,6 +1100,7 @@ theorem rationalPrincipalIdeal_primeDivisors_away_from_two 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. -/ @@ -1219,6 +1263,7 @@ theorem gaussReciprocity_nat_from_powerResidueReciprocity 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean index 04e99e07ce..b352ced6a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -46,7 +46,7 @@ local instance /-- `Abelianization` is an opaque quotient alias, so install its native quotient topology explicitly before asking for topological properties. -/ local instance - topologicalGlobalNormResidueAbelianization_galoisAbelianizationTopology : + topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology : TopologicalSpace (Abelianization (Gal(L / K))) := by change TopologicalSpace diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean index 65bb279f36..f9234133a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -216,7 +216,8 @@ theorem chosenLocalExtension_decompositionSubgroup_eq_top change σ • target.valuation.valuationSubring = target.valuation.valuationSubring ext z rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] - exact (RamificationTheory.DiscreteValuationField.DVF.mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + exact + (RamificationTheory.DiscreteValuationField.DVF.mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension (base := base) (target := target) huniq σ⁻¹ z).symm /-- At integer indices the lower group defined using Mathlib's valuation @@ -391,7 +392,8 @@ theorem chosenHerbrandFunctionAtLowerIndex_real_eq rw [herbrandFunctionAtLowerIndex_succ, Rat.cast_add, Rat.cast_div] rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat, RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_succ] - rw [← RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat + rw [← + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat F n, ih] congr 1 rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope] @@ -414,14 +416,15 @@ theorem chosenLocalExtension_valuationSubring_eq_canonical [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [ValuativeRel L] [TopologicalSpace L] - [IsNonarchimedeanLocalField 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 + exact + ValuationTheory.DiscreteValuationField.ValuedExtension.valuationSubring_eq_of_finite_separable (localCompleteDVF K) (chosenLocalExtensionCompleteDVF K L) (ValuativeRel.valuation L) @@ -588,7 +591,8 @@ theorem mem_canonicalUpperRamificationGroup_iff_mem_localUpperRamificationGroup ClassFieldTheory.upperRamificationGroup K L t ↔ σ ∈ localUpperRamificationGroup K L t := by have hσChosen : σ ∈ - ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K := by + ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K + := by rw [chosenLocalExtension_valuationSubring_eq_canonical K L] exact hσ have hchosen := @@ -704,7 +708,8 @@ theorem chosenLowerRamificationGroup_eq_iff_localLowerRamificationGroup_eq apply Subgroup.ext intro σ have hσ : σ ∈ - ((chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring).decompositionSubgroup K := by + ((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σ, @@ -915,7 +920,7 @@ noncomputable def shrinkGalEquiv 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.galEquiv_of_equiv_equiv + ClassFieldTheory.galEquivOfEquivEquiv (Shrink.ringEquiv K).symm (Shrink.ringEquiv L).symm (shrinkAlgebra_commutes K L) @@ -930,7 +935,7 @@ theorem shrinkGalEquiv_apply letI : Algebra (Shrink.{0} K) (Shrink.{0} L) := shrinkAlgebra K L by intro σ x - simp [shrinkGalEquiv, ClassFieldTheory.galEquiv_of_equiv_equiv] + 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 @@ -1048,7 +1053,7 @@ theorem shrink_mem_decompositionSubgroup_iff _ ↔ x ∈ B := (hmem x).symm /-- The field equivalence restricts to the two canonical integer rings. -/ -noncomputable def shrink_valuationSubringRingEquiv +noncomputable def shrinkValuationSubringRingEquiv (L : Type*) [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] [Small.{0} L] : letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L @@ -1069,13 +1074,13 @@ theorem shrink_mem_maximalIdeal_pow_iff ∀ x : (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring, x ∈ (IsLocalRing.maximalIdeal (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring) ^ n ↔ - shrink_valuationSubringRingEquiv L x ∈ + shrinkValuationSubringRingEquiv L x ∈ (IsLocalRing.maximalIdeal (ValuativeRel.valuation L).valuationSubring) ^ n := letI : ValuativeRel (Shrink.{0} L) := shrinkLocalFieldValuativeRel L by intro x - let e := shrink_valuationSubringRingEquiv L + let e := shrinkValuationSubringRingEquiv L have hmap : (IsLocalRing.maximalIdeal (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring ^ n).map e = @@ -1114,7 +1119,7 @@ theorem shrink_mem_lowerRamificationGroup_iff by let B := (ValuativeRel.valuation (Shrink.{0} L)).valuationSubring let A := (ValuativeRel.valuation L).valuationSubring - let e := shrink_valuationSubringRingEquiv L + let e := shrinkValuationSubringRingEquiv L intro σ hσ let τ := shrinkGalEquiv K L σ have hτ : τ ∈ A.decompositionSubgroup K := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean index 28ece4c475..bfbf295a65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean @@ -13,7 +13,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomic # 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 +local cyclotomic embedding, and the ramification comparison to replace the full cyclotomic + totient by the exact `p`-primary factor `φ(p ^ n)`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 65071c9bef..8b51c00178 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -16,7 +16,7 @@ Galois/ray-class comparison is retained as a `ContinuousMulEquiv` with the native quotient and finite Krull topologies. -/ -open scoped Classical IsMulCommutative NumberField Cyclotomic +open scoped IsMulCommutative NumberField Cyclotomic noncomputable section @@ -26,6 +26,7 @@ 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 @@ -35,6 +36,7 @@ noncomputable def rationalPrimeUniformizerLocalInput (RayClass.rationalPrime q) (rationalPrimeFinitePlaceFieldUnit q) +open scoped Classical in /-- In the absolute-value logarithmic coordinate, an ordinary uniformizer has value `-1`. -/ theorem rationalPrimeUniformizerLocalInput_valuationMap @@ -52,6 +54,7 @@ theorem rationalPrimeUniformizerLocalInput_valuationMap (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 @@ -65,16 +68,23 @@ section NonzeroOrder variable (m : ℕ) [NeZero m] -local instance : NeZero (m : ℚ) := +open scoped Classical in +local instance localNeZeroInstance1 : NeZero (m : ℚ) := ⟨by exact_mod_cast (NeZero.ne m)⟩ -noncomputable local instance : +attribute [local instance] localNeZeroInstance1 + +open scoped Classical in +noncomputable local instance localNumberFieldInstance1 : NumberField (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := KummerTheory.rationalCyclotomicLevel_numberField ⟨m, NeZero.pos m⟩ +attribute [local instance] localNumberFieldInstance1 + +open scoped Classical in noncomputable local instance rationalCyclotomicArithmeticLevelIsCyclotomicExtension : IsCyclotomicExtension {m} ℚ @@ -88,6 +98,9 @@ noncomputable local instance exact KummerTheory.rationalCyclotomicLevel_isCyclotomicExtension _ +attribute [local instance] rationalCyclotomicArithmeticLevelIsCyclotomicExtension + +open scoped Classical in noncomputable local instance rationalCyclotomicArithmeticLevelIsAbelianGalois : IsAbelianGalois ℚ @@ -95,6 +108,9 @@ noncomputable local instance ⟨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. -/ @@ -135,6 +151,7 @@ theorem 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 @@ -159,6 +176,7 @@ theorem 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 @@ -175,6 +193,7 @@ noncomputable def ⟨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 @@ -203,6 +222,7 @@ theorem 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 @@ -225,6 +245,7 @@ theorem m).apply_symm_apply, rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index 71026bde79..c4ea6940a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -23,7 +23,7 @@ Thus the result is an equality of actual class fields and not merely an equality of degrees or an abstract comparison of finite groups. -/ -open scoped Classical IsMulCommutative NumberField Cyclotomic +open scoped IsMulCommutative NumberField Cyclotomic noncomputable section @@ -34,12 +34,16 @@ 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] @@ -64,6 +68,7 @@ private noncomputable def 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] @@ -103,6 +108,7 @@ private theorem quotientMulEquivOfNormRangeEq_globalNormResidue 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] @@ -129,6 +135,7 @@ private theorem 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 @@ -194,23 +201,33 @@ section NonzeroOrder variable (m : ℕ) [NeZero m] -local instance : NeZero (m : ℚ) := +open scoped Classical in +local instance localNeZeroInstance1 : NeZero (m : ℚ) := ⟨by exact_mod_cast (NeZero.ne m)⟩ -noncomputable local instance : +attribute [local instance] localNeZeroInstance1 + +open scoped Classical in +noncomputable local instance localNumberFieldInstance1 : NumberField (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := KummerTheory.rationalCyclotomicLevel_numberField ⟨m, NeZero.pos m⟩ -noncomputable local instance : +attribute [local instance] localNumberFieldInstance1 + +open scoped Classical in +noncomputable local instance localIsAbelianGaloisInstance1 : IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := rationalCyclotomicLevelIsAbelianGalois ⟨m, NeZero.pos m⟩ +attribute [local instance] localIsAbelianGaloisInstance1 + +open scoped Classical in noncomputable local instance rationalCyclotomicLevelIsCyclotomicExtensionAtOrder : IsCyclotomicExtension {m} ℚ (KummerTheory.rationalCyclotomicLevel @@ -224,15 +241,24 @@ noncomputable local instance rationalCyclotomicLevelIsCyclotomicExtensionAtOrder 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 @@ -242,6 +268,9 @@ noncomputable local instance rationalCyclotomicLevelIdeleClassNormRangeNormal : 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 [ @@ -249,6 +278,9 @@ noncomputable local instance rationalCyclotomicFieldIdeleClassNormRangeNormal : 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. -/ @@ -263,6 +295,7 @@ noncomputable def rationalCyclotomicLevelAlgEquivCyclotomicField ⟨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. -/ @@ -273,6 +306,7 @@ noncomputable def rationalPrimeArithmeticFrobeniusLocalInput (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 @@ -293,6 +327,7 @@ theorem rationalPrimeArithmeticFrobeniusLocalInput_valuationMap rationalPrimeFinitePlaceFieldUnit_valuationMap] norm_num +open scoped Classical in private theorem rationalCyclotomicLevel_chosenFinitePlaceArtin_at_unramifiedPrime (m : ℕ) [NeZero m] @@ -339,6 +374,7 @@ private theorem 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`. -/ @@ -400,6 +436,7 @@ theorem 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. -/ @@ -417,6 +454,7 @@ noncomputable def (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. -/ @@ -440,6 +478,7 @@ theorem (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)`. -/ @@ -460,6 +499,7 @@ theorem 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 @@ -482,6 +522,7 @@ theorem 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 @@ -508,6 +549,7 @@ theorem 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. -/ @@ -531,6 +573,7 @@ noncomputable def rationalCyclotomicPrimeArithmeticFrobenius (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. -/ @@ -572,6 +615,7 @@ theorem rationalCyclotomicPrimeArithmeticFrobenius_galEquivZMod 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 `ℚ`. -/ private noncomputable def rationalRayClassFieldCyclotomicRingEquiv @@ -590,6 +634,7 @@ private noncomputable def rationalRayClassFieldCyclotomicRingEquiv (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 @@ -601,18 +646,25 @@ noncomputable def rationalRayClassFieldCyclotomicAlgEquiv 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 @@ -637,6 +689,7 @@ theorem (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 @@ -658,6 +711,7 @@ theorem 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 @@ -670,6 +724,7 @@ noncomputable def (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ℤ)ˣ`. -/ @@ -684,6 +739,7 @@ noncomputable def 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] @@ -696,6 +752,7 @@ theorem 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. -/ @@ -714,6 +771,7 @@ theorem (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)`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean index 55c350d799..490036fbd1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean @@ -89,11 +89,11 @@ noncomputable def kroneckerWeberPadicExtension @UniformSpace.Completion.algebra (WithAbs vK) _ _ _ _ ℚ _ hWith hUniform let hClosure : Algebra ℚ - (absoluteValueExtension_algebraicCompletionClosure vK) := + (absoluteValueExtensionAlgebraicCompletionClosure vK) := @AlgebraicClosure.instAlgebra vK.Completion _ ℚ _ hBase let : Algebra ℚ vK.Completion := hBase let : Algebra ℚ - (absoluteValueExtension_algebraicCompletionClosure vK) := + (absoluteValueExtensionAlgebraicCompletionClosure vK) := hClosure exact pullbackAbsoluteValueExtension vK diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean index 35cd792f68..bc71bedcb3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean @@ -96,13 +96,13 @@ abbrev PrimeCyclotomicPushout (p : ℕ) := PrimeCyclotomicBase K p ⊗[K] L noncomputable instance primeCyclotomicBaseFiniteDimensional - (p : ℕ) [NeZero p] : + (p : ℕ) : FiniteDimensional K (PrimeCyclotomicBase K p) := IsCyclotomicExtension.finiteDimensional {p} K (PrimeCyclotomicBase K p) noncomputable instance primeCyclotomicBaseIsGalois - (p : ℕ) [NeZero p] : + (p : ℕ) : IsGalois K (PrimeCyclotomicBase K p) := IsCyclotomicExtension.isGalois {p} K (PrimeCyclotomicBase K p) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean index eab5bd90cb..e18873b6d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -21,8 +21,7 @@ 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. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory @@ -37,6 +36,7 @@ variable {K L : Type} [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 @@ -165,6 +165,7 @@ theorem 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean index aabd9cd6c7..0334376997 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean @@ -25,8 +25,7 @@ generating the full extension is used to kill the full inertia group away from `S`. -/ -open scoped NumberField Classical -open NumberField IsDedekindDomain +open scoped NumberField open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification open HilbertRamification.Dedekind @@ -38,6 +37,7 @@ 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 @@ -55,6 +55,7 @@ noncomputable def adjoinSubtypeEquivAmbientAdjoin 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 @@ -75,6 +76,7 @@ theorem adjoin_subtype_eq_of_adjoin_ambient_eq 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. -/ @@ -157,6 +159,7 @@ theorem adjoin_rootUnit_eq_chosenSimpleKummerExtension 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 @@ -185,6 +188,7 @@ theorem exists_sUnit_chosenSimpleKummerExtension_eq_adjoin_of_mem_fullRootSet 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 @@ -321,6 +325,7 @@ theorem exists_sUnitRootUnit_generating_internalAdjoin (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 @@ -350,6 +355,7 @@ theorem fullSUnitKummerRoot_internalAdjoin_isGalois 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 @@ -471,6 +477,7 @@ theorem (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean index 5db06205a7..25fff70ae1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean @@ -13,10 +13,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPre /-! # 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. +The endpoint of the S-unit preparation construction: the rank bound, the exact + restriction-kernel cardinality, and prime-power coordinates. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -27,6 +28,7 @@ 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. -/ @@ -85,6 +87,7 @@ theorem galoisRank_le_totalPlaceCard_enlargedS 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. -/ @@ -175,6 +178,7 @@ theorem card_enlargedSUnitKummerRestrictionHom_ker 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. -/ @@ -271,6 +275,7 @@ theorem (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean index 2d355a9b7c..94214c212c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -9,10 +9,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPre /-! # 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. +The concrete embedding and Galois restriction map, its fixing subgroup, and the cyclic fixed + fields attached to kernel elements. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -23,6 +24,7 @@ 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 @@ -54,6 +56,7 @@ theorem le_fullSUnitKummerExtension_of_enlargedS rw [hgenerate] exact hx +open scoped Classical in /-- The actual inclusion algebra `E → N` supplied by the source-produced containment above. -/ @[reducible] @@ -76,6 +79,7 @@ noncomputable def enlargedSUnitKummerAlgebra (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 @@ -106,6 +110,7 @@ noncomputable def enlargedSUnitKummerRestrictionHom 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] @@ -138,6 +143,7 @@ theorem enlargedSUnitKummerRestrictionHom_surjective (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 @@ -166,6 +172,7 @@ noncomputable def enlargedSUnitKummerEmbeddedExtension 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 @@ -229,6 +236,7 @@ theorem enlargedSUnitKummerRestrictionHom_ker_eq_fixingSubgroup (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 @@ -272,6 +280,7 @@ theorem fixedField_enlargedSUnitKummerRestrictionHom_ker (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. -/ @@ -302,6 +311,7 @@ noncomputable def enlargedSUnitKummerCyclicFixedField (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 @@ -331,6 +341,7 @@ theorem enlargedSUnitKummerEmbeddedExtension_le_cyclicFixedField 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] @@ -374,6 +385,7 @@ theorem enlargedSUnitKummerCyclicFixedField_isGalois (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] @@ -422,6 +434,7 @@ theorem enlargedSUnitKummerCyclicFixedField_finrank 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] @@ -468,6 +481,7 @@ theorem enlargedSUnitKummerCyclicFixedField_isCyclic (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 @@ -502,6 +516,7 @@ theorem orderOf_enlargedSUnitKummerRestrictionKernel_dvd (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 @@ -535,6 +550,7 @@ theorem exists_orderOf_enlargedSUnitKummerRestrictionKernel_eq_prime_pow (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 @@ -568,6 +584,7 @@ theorem enlargedSUnitKummerCyclicFixedField_ne_top 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean index 16efec73ab..6df6ea9907 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean @@ -8,10 +8,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPre /-! # Finite support for Kummer radicals -A chosen finite enlargement of places containing representatives of every class in a finite Kummer radical. +A chosen finite enlargement of places containing representatives of every class in a finite + Kummer radical. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -22,6 +23,7 @@ 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 @@ -33,6 +35,7 @@ def sUnitFiniteKummerRadical 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] @@ -48,6 +51,7 @@ theorem mem_sUnitFiniteKummerRadical_iff 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 @@ -59,6 +63,7 @@ def sUnitKummerSubgroup 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] @@ -76,6 +81,7 @@ theorem sUnitKummerSubgroup_le_finiteKummerRadicalSubgroup (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))} @@ -86,6 +92,7 @@ theorem sUnitGroup_mono 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ˣ) : @@ -94,6 +101,7 @@ noncomputable def chosenUnitFiniteSupport (x : Kˣ) : (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 @@ -123,6 +131,7 @@ theorem mem_sUnitGroup_chosenUnitFiniteSupport (x : Kˣ) : 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. -/ @@ -155,6 +164,7 @@ theorem finite_chosenFiniteKummerRadicalQuotient 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 @@ -170,6 +180,7 @@ noncomputable def chosenFiniteKummerRadicalRepresentative (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 @@ -186,6 +197,7 @@ theorem chosenFiniteKummerRadicalRepresentative_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 @@ -208,6 +220,7 @@ noncomputable def finiteKummerRadicalSupport (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 @@ -220,6 +233,7 @@ noncomputable def enlargeByFiniteKummerRadicalSupport 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] @@ -231,6 +245,7 @@ theorem subset_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 @@ -271,6 +286,7 @@ theorem chosenFiniteKummerRadicalRepresentative_mem_enlargedSUnitGroup (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 @@ -317,6 +333,7 @@ theorem finiteKummerRadicalSubgroup_le_enlargedSUnitKummerSubgroup 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] @@ -338,6 +355,7 @@ theorem enlargedSUnitKummerSubgroup_eq_finiteKummerRadicalSubgroup (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 @@ -351,6 +369,7 @@ theorem sUnitKummerSubgroup_le_fullSUnitKummerSubgroup · 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] @@ -368,11 +387,12 @@ theorem kummerRadicalExtension_mono (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] - [IsSepClosure K Omega] + (E : IntermediateField K Omega) [FiniteDimensional K E] [IsGalois K E] [IsMulCommutative Gal(E/K)] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean index cacc207195..3c1f3a55f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean @@ -9,10 +9,12 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparati /-! # The full S-unit Kummer extension -Construction, finite generation, Galois structure, cardinality, and coordinates for the Kummer extension generated by all `S`-unit roots. +Construction, finite generation, Galois structure, cardinality, and coordinates for the Kummer + extension generated by + all `S`-unit roots. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -23,6 +25,7 @@ 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] @@ -33,6 +36,7 @@ def fullSUnitKummerExtension (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 @@ -123,6 +127,7 @@ theorem exists_sUnitRoot_adjoin_eq_of_mem_fullSUnitKummerRootSet 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] @@ -134,6 +139,7 @@ theorem fullSUnitKummerExtension_isGalois 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] @@ -166,6 +172,7 @@ theorem finite_fullSUnitKummerExtension_galois (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] @@ -186,6 +193,7 @@ theorem fullSUnitKummerExtension_finiteDimensional (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 @@ -252,6 +260,7 @@ theorem exists_finset_fullSUnitKummerRootSet_adjoin_eq 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. -/ @@ -354,6 +363,7 @@ theorem exists_finset_fullSUnitKummerExtensionRoots_adjoin_eq_top 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] @@ -389,6 +399,7 @@ theorem card_fullSUnitKummerExtension_galois _ = (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 @@ -404,6 +415,7 @@ theorem fullSUnitKummerExtension_galois_pow_eq_one 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 @@ -441,6 +453,7 @@ noncomputable def (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 @@ -460,6 +473,7 @@ noncomputable def fullSUnitKummerExtensionGaloisCoordinates (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 @@ -503,6 +517,7 @@ noncomputable def fullSUnitKummerExtensionGaloisEquivPiZMod (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean index d0266df0f6..045691a649 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean @@ -9,10 +9,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass /-! # 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. +The localization map on `S`-units, its kernel, its quotient by + global powers, and the associated Kummer radical. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -23,6 +24,7 @@ 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 @@ -42,6 +44,7 @@ noncomputable def sUnitLocalPowerMap (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 @@ -50,6 +53,7 @@ def sUnitLocalPowerKernel 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 : ℕ+) @@ -74,6 +78,7 @@ theorem mem_sUnitLocalPowerKernel_iff 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 : ℕ+) @@ -97,6 +102,7 @@ theorem nthPowerSubgroup_le_sUnitLocalPowerKernel ((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 : ℕ+) @@ -107,6 +113,7 @@ def sUnitLocalPowerKernelNthPowers 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 : ℕ+) @@ -127,6 +134,7 @@ def sUnitLocalPowerKernelQuotientMap intro x hx exact hx) +open scoped Classical in /-- Inclusion of `Δ` induces an injection on quotients by `Kˢⁿ`. -/ theorem sUnitLocalPowerKernelQuotientMap_injective (n : ℕ+) @@ -147,6 +155,7 @@ theorem sUnitLocalPowerKernelQuotientMap_injective 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 : ℕ+) @@ -159,6 +168,7 @@ noncomputable instance finite_sUnitLocalPowerKernelQuotient (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 : ℕ+) @@ -174,6 +184,7 @@ theorem card_sUnitLocalPowerKernelQuotient_le (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 : ℕ+) @@ -182,6 +193,7 @@ def sUnitLocalPowerRadical (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean index e365c15165..807947deb5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean @@ -11,10 +11,11 @@ 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. +The finite `n`-th-power quotient of an `S`-unit group, its cardinality, and explicit `ZMod n` + coordinates. -/ -open scoped NumberField Classical IsMulCommutative NNReal ValuativeRel +open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory @@ -25,11 +26,13 @@ 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. -/ @@ -43,6 +46,7 @@ theorem totalPlaceCard_eq_sUnitLogRank_add_one 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. -/ @@ -78,6 +82,7 @@ noncomputable def multiplicativeZModProductEquivPiSucc · 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 @@ -89,6 +94,7 @@ def finsuppModHom (d n : ℕ) : 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 @@ -100,6 +106,7 @@ theorem finsuppModHom_surjective (d n : ℕ) : 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 : ℕ) : @@ -128,6 +135,7 @@ theorem finsuppModHom_ker (d n : ℕ) : ext i simp [finsuppModHom] +open scoped Classical in /-- The finite-free quotient `(ℤ^d) / n(ℤ^d)` is `(ZMod n)^d`. -/ noncomputable def finsuppNsmulQuotientEquivPiZMod (d n : ℕ) : @@ -139,6 +147,7 @@ noncomputable def finsuppNsmulQuotientEquivPiZMod (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 @@ -152,6 +161,7 @@ noncomputable def multiplicativeFinsuppNthPowerQuotientEquivPiZMod 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 @@ -165,6 +175,7 @@ noncomputable instance finite_finsupp_nsmulQuotient (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 : ℕ+) : @@ -180,6 +191,7 @@ theorem card_finsupp_nsmulQuotient 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 @@ -215,6 +227,7 @@ theorem n_dvd_numberField_torsionOrder 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 @@ -262,6 +275,7 @@ theorem card_numberField_torsion_nthPowerQuotient 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 @@ -288,6 +302,7 @@ noncomputable def numberFieldTorsionNthPowerQuotientEquivZMod (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 : ℕ+) : @@ -304,6 +319,7 @@ noncomputable instance finite_sUnit_nthPowerQuotient (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)`. @@ -381,6 +397,7 @@ theorem card_sUnit_nthPowerQuotient _ = (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 @@ -413,6 +430,7 @@ noncomputable def sUnitNthPowerQuotientCoordinates (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ˢⁿ`. -/ @@ -432,6 +450,7 @@ theorem mem_sUnitGroup_of_pow_mem (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ˣ` @@ -445,6 +464,7 @@ def fullSUnitKummerSubgroup 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 : ℕ+) @@ -453,6 +473,7 @@ def sUnitToFullSUnitKummerSubgroup (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 @@ -465,6 +486,7 @@ def sUnitToFullSUnitRadicalQuotient 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 : ℕ+) @@ -489,6 +511,7 @@ theorem nthPowerSubgroup_le_ker_sUnitToFullSUnitRadicalQuotient n (fullSUnitKummerSubgroup (K := K) n S)).2 ⟨(y : Kˣ), rfl⟩ +open scoped Classical in /-- The canonical comparison `Kˢ / Kˢⁿ → (Kˢ · Kˣⁿ) / Kˣⁿ`. -/ @@ -509,6 +532,7 @@ def sUnitNthPowerQuotientToFullSUnitRadicalQuotient (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 : ℕ+) @@ -542,6 +566,7 @@ theorem sUnitNthPowerQuotientToFullSUnitRadicalQuotient_surjective 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. -/ @@ -582,6 +607,7 @@ theorem sUnitNthPowerQuotientToFullSUnitRadicalQuotient_injective apply Subtype.ext exact hz +open scoped Classical in /-- The exact quotient identification used to define `N = K(√[n]{Kˢ})`. -/ noncomputable def sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient @@ -601,6 +627,7 @@ noncomputable def sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient sUnitNthPowerQuotientToFullSUnitRadicalQuotient_surjective (K := K) n S⟩ +open scoped Classical in /-- The full `S`-unit radical quotient is finite. -/ noncomputable instance finite_fullSUnitRadicalQuotient (n : ℕ+) @@ -616,6 +643,7 @@ noncomputable instance finite_fullSUnitRadicalQuotient (sUnitNthPowerQuotientEquivFullSUnitRadicalQuotient (K := K) n S) +open scoped Classical in /-- The radical quotient defining `N` has cardinality `n ^ s`. -/ theorem card_fullSUnitRadicalQuotient (n : ℕ+) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean index b94849de6d..0e80b530ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -46,7 +46,7 @@ polynomial API, and the complete-DVF different criterion. No auxiliary Kummer extension or alternative notion of unramifiedness is introduced. -/ -open scoped NumberField Classical NNReal TensorProduct ValuativeRel +open scoped NumberField NNReal TensorProduct ValuativeRel open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification @@ -59,6 +59,7 @@ 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] @@ -90,6 +91,7 @@ private theorem valuativeRelExtension_isNontrivial 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. @@ -100,7 +102,7 @@ and applies the derivative/different criterion to `X ^ n - b`. -/ theorem kummerGeneratedExtension_chosenFinitePlaceIsUnramified_of_valuation_eq_one {L : Type} - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] (n : ℕ+) (b : Kˣ) @@ -135,7 +137,7 @@ theorem let : IsGalois C F := HilbertRamification.algebraicLocalization_isGalois vK w let : NontriviallyNormedField C := - absoluteValueExtension_completionNontriviallyNormedField vK hvK + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : LocallyCompactSpace C := AbsoluteValue.Completion.locallyCompactSpace (finitePlaceCompletionBaseMap_isometry v) @@ -298,6 +300,7 @@ theorem 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. -/ @@ -338,6 +341,7 @@ theorem · 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. -/ @@ -382,6 +386,7 @@ theorem (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. -/ @@ -449,6 +454,7 @@ theorem 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 @@ -572,6 +578,7 @@ private theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean index 4fd6bc8d03..5967d55eee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean @@ -30,7 +30,7 @@ universe u v w z open AlgebraicNumberTheory.Valuations open HilbertRamification open NumberField -open scoped Classical NumberField.LiesOver +open scoped NumberField.LiesOver variable {K L : Type} @@ -38,6 +38,7 @@ variable [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 @@ -48,6 +49,7 @@ def infinitePlaceAbsoluteValueExtension 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 @@ -56,6 +58,7 @@ def absoluteCompletionRingEquivReal (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 @@ -66,6 +69,7 @@ def absoluteCompletionRingEquivComplex 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 @@ -97,6 +101,7 @@ theorem absoluteValueDecompositionGroup_eq_infinitePlaceStabilizer 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 @@ -118,6 +123,7 @@ theorem normUnits_map_ringEquiv 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} @@ -134,6 +140,7 @@ theorem ringEquiv_compat_symm 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 @@ -159,6 +166,7 @@ def normQuotientMapOfRingEquiv 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] @@ -177,6 +185,7 @@ theorem normQuotientMapOfRingEquiv_normClass (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 @@ -221,6 +230,7 @@ def normQuotientEquivOfRingEquiv 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 @@ -246,6 +256,7 @@ theorem herbrandH0_card_eq_one_of_group_card_eq_one 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 @@ -270,6 +281,7 @@ def infiniteCompletionNormQuotientEquivRealComplex (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. -/ @@ -315,6 +327,7 @@ def localizedCompletionNormQuotientEquivAbsoluteCompletions 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 `ℂ/ℝ`. -/ @@ -429,12 +442,14 @@ def absoluteCompletionNormQuotientEquivRealComplex ((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] @@ -443,6 +458,7 @@ theorem realUnitsSign_coe (x : ℝˣ) : (SignType.sign (x : ℝ) : ℤ) := rfl +open scoped Classical in /-- Both integral signs occur. -/ theorem realUnitsSign_surjective : Function.Surjective realUnitsSign := by @@ -453,8 +469,8 @@ theorem realUnitsSign_surjective : apply Units.ext simp [realUnitsSign]⟩ +open scoped Classical in /-- A nonzero real unit has trivial sign precisely when it is positive. -/ -@[simp] theorem mem_realUnitsSign_ker_iff (x : ℝˣ) : x ∈ realUnitsSign.ker ↔ 0 < (x : ℝ) := by rw [MonoidHom.mem_ker] @@ -469,6 +485,7 @@ theorem mem_realUnitsSign_ker_iff (x : ℝˣ) : 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] @@ -492,6 +509,7 @@ theorem realUnitsSign_continuous : 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 @@ -518,6 +536,7 @@ theorem realUnitsSign_ker_eq_complexNormSubgroup : 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 ℝ ℂ ≃* ℤˣ := @@ -526,6 +545,7 @@ def realComplexNormQuotientEquivSign : 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 : @@ -533,6 +553,7 @@ noncomputable instance realComplexNormQuotientFinite : 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 @@ -541,6 +562,7 @@ theorem realComplexNormQuotient_card_eq_two : 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. -/ @@ -631,6 +653,7 @@ theorem infinitePlaceLocalHerbrandH0_card_eq_localDegree _ = 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⁰`. -/ @@ -705,6 +728,7 @@ theorem infinitePlaceLocalClassAxiom_cards 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 @@ -808,6 +832,7 @@ theorem infinitePlaceLocalHerbrandH0Finite (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean index cc365f1368..6ec9e356e5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -151,7 +151,7 @@ def fixedUnitToInvariantsNormQuotientMonoidHom /-- 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ˣ) : + [Fintype (Gal(L/K))] (x : fixedSubgroup (Gal(L/K)) Lˣ) : Multiplicative.toAdd (fixedUnitToInvariantsNormQuotientMonoidHom K L x) = (unitsTateH0NormSubmodule K L).mkQ @@ -291,7 +291,7 @@ def additiveNormKernelEquivUnitsNormKer [Fintype (Gal(L/K))] : /-- 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)) : + (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 @@ -388,7 +388,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_ker /-- 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)) : + [Fintype (Gal(L/K))] (g : Gal(L/K)) : Function.Surjective (normKernelToUnitsBoundaryQuotientMonoidHom K L g) := by intro q diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean index 4ffac58a78..c54bd0eb50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean @@ -26,7 +26,7 @@ variable {K : Type u} {L : Type v} /-- Degree-zero cohomology for a finite family of local blocks. -/ noncomputable def localBlockFamilyHerbrandH0Equiv - {ι : Type w} [Fintype ι] + {ι : Type w} (d : ι → LocalPlaceDatum K L) (σ : L ≃ₐ[K] L) (hgen : ∀ τ : L ≃ₐ[K] L, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean index f062a2ec4b..bd893d26b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean @@ -26,7 +26,7 @@ variable {K : Type u} {L : Type v} /-- Degree-minus-one cohomology for a finite family of local blocks. -/ noncomputable def localBlockFamilyHerbrandHMinusOneEquiv - {ι : Type w} [Fintype ι] + {ι : Type w} (d : ι → LocalPlaceDatum K L) (σ : L ≃ₐ[K] L) (hgen : ∀ τ : L ≃ₐ[K] L, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean index 0fc55edfcb..ef60ad810a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -205,8 +205,9 @@ noncomputable def localBlockFamilyHerbrandH0EquivNormQuotients (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 +theorem localBlockFamilyHerbrandH0Finite [Finite ι] (d : ι → LocalPlaceDatum K L) (σ : L ≃ₐ[K] L) (hgen : ∀ τ : L ≃ₐ[K] L, @@ -247,6 +248,8 @@ theorem localBlockFamilyHerbrandH0Finite 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 @@ -334,9 +337,10 @@ theorem localBlockFamilyHerbrandH0Finite (localBlockFamilyHerbrandH0Equiv d σ hgen).symm.toEquiv +omit [Fintype ι] in /-- The degree-minus-one cohomology of a finite family of local blocks is finite. -/ -theorem localBlockFamilyHerbrandHMinusOneFinite +theorem localBlockFamilyHerbrandHMinusOneFinite [Finite ι] (d : ι → LocalPlaceDatum K L) (σ : L ≃ₐ[K] L) (hgen : ∀ τ : L ≃ₐ[K] L, @@ -377,6 +381,8 @@ theorem localBlockFamilyHerbrandHMinusOneFinite 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 @@ -472,9 +478,10 @@ theorem localBlockFamilyHerbrandHMinusOneFinite (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 +theorem localBlockFamilyHerbrandHMinusOne_card_eq_one [Finite ι] (d : ι → LocalPlaceDatum K L) (σ : L ≃ₐ[K] L) (hgen : ∀ τ : L ≃ₐ[K] L, @@ -521,6 +528,8 @@ theorem localBlockFamilyHerbrandHMinusOne_card_eq_one 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean index 000a886462..3daa086201 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean @@ -170,7 +170,6 @@ noncomputable def conjugateCompletionRingEquiv (conjugateWithAbsRingEquiv_symm_isometry w σ).continuous omit [FiniteDimensional K L] [IsGalois K L] in -@[simp] theorem conjugateCompletionRingEquiv_toCompletion (w : AbsoluteValue L ℝ) (σ : L ≃ₐ[K] L) (x : L) : conjugateCompletionRingEquiv w σ @@ -262,7 +261,6 @@ noncomputable def conjugateExtensionCompletionRingEquiv exact conjugateCompletionRingEquiv w.1 σ omit [FiniteDimensional K L] [IsGalois K L] in -@[simp] theorem conjugateExtensionCompletionRingEquiv_toCompletion (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) @@ -326,7 +324,7 @@ noncomputable def localTensorEvaluation letI := AbsoluteValue.completionAlgebra vK w.1 w.2 exact (localizedCompletionEquivCompletion vK hvK w).symm.toAlgHom.comp - (absoluteValueExtension_localizationTensorHom vK w) + (absoluteValueExtensionLocalizationTensorHom vK w) omit [IsGalois K L] in @[simp] @@ -484,9 +482,9 @@ theorem conjugateExtensionCompletionRingEquiv_completionTensorDecomposition_left Algebra vK.Completion w'.1.Completion := fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 conjugateExtensionCompletionRingEquiv vK w g - (completionTensorDecomposition_left (K := K) (L := L) vK hvK z + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK z (absoluteValueExtensionConjugate vK w g)) = - absoluteValueExtension_localizationTensorHom vK w + absoluteValueExtensionLocalizationTensorHom vK w (localTensorConjugation vK g z) := by let _ : ∀ w' : AbsoluteValueExtension vK L, Algebra vK.Completion w'.1.Completion := @@ -504,7 +502,7 @@ theorem conjugateExtensionCompletionRingEquiv_completionTensorDecomposition_left conjugateExtensionCompletionRingEquiv vK w g (AbsoluteValue.toCompletion (absoluteValueExtensionConjugate vK w g).1 x) = - absoluteValueExtension_localizationTensorHom vK w + absoluteValueExtensionLocalizationTensorHom vK w (localTensorConjugation vK g (b ⊗ₜ[K] x)) rw [conjugateExtensionCompletionRingEquiv_toCompletion, localTensorConjugation_tmul, @@ -779,7 +777,6 @@ noncomputable def rightCosetCompletionUnitsEquiv vK w (Quotient.out q)).toMulEquiv omit [FiniteDimensional K L] in -@[simp] theorem rightCosetCompletionUnitsEquiv_apply_coe (q : InducedRightCosets (absoluteValueDecompositionGroup K w.1)) @@ -793,7 +790,8 @@ theorem rightCosetCompletionUnitsEquiv_apply_coe (rightCosetExtensionEquiv vK hvK w q).1.Completion) := rfl -/-- The product supplied by the completion tensor-product decomposition, rewritten as one copy of the +/-- 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 @@ -948,7 +946,7 @@ theorem localTensorUnitsEquivLocalPlaceBlock_apply_out_coe (localizedCompletionEquivCompletion vK hvK w).symm (conjugateExtensionCompletionRingEquiv vK w (Quotient.out q) - (completionTensorDecomposition_left (K := K) (L := L) vK hvK + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (z : LocalTensorAlgebra (L := L) vK) (absoluteValueExtensionConjugate vK w (Quotient.out q)))) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean index 87b1874e75..440dba26d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean @@ -282,7 +282,7 @@ theorem localTensorDetNorm_eq_prod_chosenCoordinates vK hvK w z q) := by classical let _ := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 @@ -316,7 +316,7 @@ theorem localTensorDetNorm_eq_prod_chosenCoordinates (z : LocalTensorAlgebra (L := L) vK) = ∏ w' : AbsoluteValueExtension vK L, Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (z : LocalTensorAlgebra (L := L) vK) w') at hnorm @@ -324,7 +324,7 @@ theorem localTensorDetNorm_eq_prod_chosenCoordinates change (∏ w' : AbsoluteValueExtension vK L, Algebra.norm vK.Completion - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK (z : LocalTensorAlgebra (L := L) vK) w')) = Units.coeHom vK.Completion @@ -368,7 +368,7 @@ theorem localTensorNormSubgroup_eq_localNormSubgroup (LocalizedCompletion vK w) := by classical let _ := - completionTensorDecomposition_extensionFintype + completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean index 9cd3530b32..2079290460 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLat import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic import Mathlib.FieldTheory.Galois.NormalBasis import Mathlib.LinearAlgebra.Quotient.Pi -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasis` Lean module. -/ +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasis` + Lean module. -/ namespace LocalClassFieldTheory @@ -238,7 +239,8 @@ theorem mem_chosenNormalBasisCoordinateMaximalSubmodule_iff ∀ σ : Gal(L / K), f σ ∈ (𝓂[K] : Ideal 𝒪[K]) := by simp [chosenNormalBasisCoordinateMaximalSubmodule] -/-- Normal-basis coordinates identify the uniformizer submodule with pointwise maximal-ideal values. -/ +/-- Normal-basis coordinates identify the uniformizer submodule with pointwise maximal-ideal +values. -/ theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_equivFun : (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map ((chosenNormalBasisIntegerLatticeBasis K L).equivFun : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean index a18b9b00a5..1138866e40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient` Lean module. -/ namespace LocalClassFieldTheory open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean index 72862dafc3..38e8467ed3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLat import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation import Mathlib.GroupTheory.GroupAction.Quotient -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction` Lean module. -/ namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean index 863c5a24b3..5a347553b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFor import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting` Lean module. -/ namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean index 9eb23e54f3..15c3346627 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLat import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct` Lean module. -/ namespace LocalClassFieldTheory open CyclicCohomology @@ -90,7 +91,7 @@ theorem chosenNormalBasisPrincipalUnitSet_mem_principalUnits_succ_of_lattice_bou /-- 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] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [UniformSpace L] [IsNonarchimedeanLocalField L] {b n : Nat} (hb : chosenBaseUniformizerPowSubmodule K L b (chosenNormalBasisIntegerLattice K L) ≤ @@ -117,7 +118,7 @@ theorem tendsto_chosenNormalBasisPrincipalUnitSequence_one_of_lattice_bound 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] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [UniformSpace L] [IsNonarchimedeanLocalField L] (e : 𝒪[L] ≃+* 𝒪[L]) : Continuous e := by apply continuous_of_continuousAt_zero e.toAddMonoidHom rw [ContinuousAt, map_zero, tendsto_def] @@ -387,7 +388,7 @@ omit [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation /-- 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] [IsUniformAddGroup L] [IsNonarchimedeanLocalField L] + [UniformSpace L] [IsNonarchimedeanLocalField L] {n : Nat} (hclosed : IsClosed ((chosenBaseUniformizerPowSubmodule K L n @@ -438,7 +439,8 @@ theorem exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct 𝒪[L]ˣ) : 𝒪[L])) atTop (nhds ((x : 𝒪[L]ˣ) : 𝒪[L])) ∧ x ∈ chosenNormalBasisPrincipalUnitSet K L n := by - rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + 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⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean index c76c873c47..173540ca58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean @@ -64,7 +64,8 @@ theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : (K := K) (L := L) with ⟨cStep, hStep⟩ rcases exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct (K := K) (L := L) with ⟨cProd, hProd⟩ - rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_integerRingFieldSubmodule + 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 @@ -161,7 +162,8 @@ theorem exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne (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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean index 037ca09d86..b07fdbb4ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded` Lean module. -/ namespace LocalClassFieldTheory @@ -231,7 +232,8 @@ theorem exists_chosenNormalBasisPrincipalUnitSuccQuotMulEquivLatticeSuccQuot (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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean index 33b9d127a3..b0147693b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -8,7 +8,8 @@ import Mathlib.FieldTheory.Galois.Basic import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.Valuation` Lean module. -/ +/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.Valuation` + Lean module. -/ namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean index df9a7c1d49..6a195fca0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean @@ -8,7 +8,8 @@ import Mathlib.SetTheory.Cardinal.Finite import Mathlib.Data.ZMod.QuotientGroup import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -/-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.ValueGroupCohomology` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.ClassFormation.ValueGroupCohomology` Lean module. -/ namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean index 62e4fb0668..0d23bf75eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -46,26 +46,31 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_odd 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 + 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⟩ + 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 + 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 + 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 @@ -342,7 +347,8 @@ 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) < + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + 2)).residueCharacteristic : ℚ) - 1) < (2 : ℚ) := by let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ rw [padicDVR_ramificationIndex_eq_one 2, @@ -355,7 +361,8 @@ 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) < + (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) @@ -376,7 +383,8 @@ theorem padicDVR_higherPrincipalUnit_two_power let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2 let F := LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v - change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2), + change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + + 2), ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, (r : F.valuationSubringˣ) ^ (2 ^ m) = (u : F.valuationSubringˣ) @@ -404,7 +412,8 @@ theorem padicDVR_higherPrincipalUnit_two_power 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) + 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 : @@ -413,7 +422,8 @@ theorem padicDVR_higherPrincipalUnit_two_power 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) : + change ((r ^ (2 ^ m) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) = (u : F.valuationSubringˣ) rw [hrpow, ← hua] apply Units.ext @@ -425,7 +435,8 @@ theorem padicDVR_higherPrincipalUnit_two_power (padicDVR_logExp_level_add_two m) a have hleft' : ((((E2 ((Multiplicative.ofAdd b2) ^ (2 ^ m)) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + F.valuationSubringˣ) : F.valuationSubring) : ℚ_[2]) = LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation v ((((Multiplicative.ofAdd b2) ^ (2 ^ m)).toAdd : @@ -434,7 +445,8 @@ theorem padicDVR_higherPrincipalUnit_two_power 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ˣ) : + ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + (m + 2)) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[2]) = LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation v ((a.toAdd : F.valuationSubring) : ℚ_[2]) @@ -447,7 +459,7 @@ theorem padicDVR_higherPrincipalUnit_two_power /-- The unit `5`, regarded as an element of the second higher-principal-unit group over `ℚ₂`. -/ -noncomputable def padicDVR_five : +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 @@ -471,11 +483,12 @@ noncomputable def padicDVR_five : refine ⟨1, ?_⟩ norm_num -/-- The underlying `ℚ₂` value of `padicDVR_five` is `5`. -/ +/-- 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 - ((((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 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 @@ -493,9 +506,11 @@ theorem padicDVR_U2_split (u : 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ˣ) ∈ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3 ∨ (u : F.valuationSubringˣ) / - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) ∈ + (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 @@ -562,14 +577,15 @@ theorem padicDVR_U2_split (u : _ = (2 : ℤ_[2]) ^ 3 * d := by rw [hd]; ring have hdiff : ((u : F.valuationSubringˣ) : F.valuationSubring) - - (((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + (((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]) = - (((padicDVR_five : + (((padicDVRFive : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) : F.valuationSubring) := by apply Subtype.ext @@ -582,15 +598,18 @@ theorem padicDVR_U2_split (u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 (u : F.valuationSubringˣ) = LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 - ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + ((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)) - ((((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + ((((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) : F.valuationSubring))).2 hdiff - rw [← LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom_ker_eq F 3, + rw [← + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom_ker_eq F 3, MonoidHom.mem_ker] rw [map_div, hq] exact div_self' _ @@ -607,7 +626,8 @@ theorem padicDVR_U2_square_class ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, (u : F.valuationSubringˣ) = (r : F.valuationSubringˣ) ^ 2 ∨ (u : F.valuationSubringˣ) = - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (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 @@ -626,27 +646,34 @@ theorem padicDVR_U2_square_class (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⟩ + · 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ˣ) / - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2), hu⟩ + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2), hu⟩ obtain ⟨r, hr⟩ := hroot w have hr' : (r : F.valuationSubringˣ) ^ 2 = (u : F.valuationSubringˣ) / - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) := by + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) := by simpa [w] using hr refine ⟨r, Or.inr ?_⟩ calc (u : F.valuationSubringˣ) = - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * ((u : F.valuationSubringˣ) / - (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2)) := by + (padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + 2)) := by symm rw [mul_comm] exact div_mul_cancel _ _ - _ = (padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) * + _ = (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 @@ -713,11 +740,13 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ (5 : ℚ_[2]) ^ (2 ^ m) exact hnormy rintro x ⟨u, hu, rfl⟩ - have huD : EU u ∈ LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2) := by + 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⟩ + 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, @@ -744,7 +773,8 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ 2 (u : 𝒪[ℚ_[2]]) have hfive : toField - ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) = five := by apply Units.ext dsimp [toField, five, F] @@ -781,20 +811,24 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ exact hsNorm · have huDprod : (uD : F.valuationSubringˣ) = - ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + ((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 - _ = (((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + _ = (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) * (sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by rw [hsD] - _ = ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + _ = ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) ^ (2 ^ m) * ((sD : F.valuationSubringˣ) ^ 2) ^ (2 ^ m) := by rw [mul_pow] - _ = ((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + _ = ((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) ^ (2 ^ m) * (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1)) := by rw [← pow_mul] @@ -808,7 +842,8 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ integerUnitsToFieldUnits ℚ_[2] u = toField (uD : F.valuationSubringˣ) := hbase.symm _ = toField - (((padicDVR_five : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : + (((padicDVRFive : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) ^ (2 ^ m) * (sD : F.valuationSubringˣ) ^ (2 ^ (m + 1))) := congrArg toField huDprod diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean index 9039bb0504..ac6219a545 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean @@ -52,7 +52,7 @@ theorem finiteAbelianNormSubgroupMap_surjective_of_charZero : /-- 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 finiteAbelianNormSubgroupOrderIso_of_charZero : +noncomputable def finiteAbelianNormSubgroupOrderIsoOfCharZero : FiniteAbelianSubextension (intrinsicAbstractBase K) ≃o (OpenFiniteIndexSubgroup K)ᵒᵈ where toEquiv := Equiv.ofBijective (finiteAbelianNormSubgroupMap K) @@ -66,16 +66,16 @@ noncomputable def finiteAbelianNormSubgroupOrderIso_of_charZero : /-- Underlying equivalence of the characteristic-zero local existence order isomorphism. -/ -noncomputable def finiteAbelianNormSubgroupEquiv_of_charZero : +noncomputable def finiteAbelianNormSubgroupEquivOfCharZero : FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ OpenFiniteIndexSubgroup K := - (finiteAbelianNormSubgroupOrderIso_of_charZero K).toEquiv + (finiteAbelianNormSubgroupOrderIsoOfCharZero K).toEquiv /-- States the theorem `finiteAbelianNormSubgroupOrderIso_of_charZero_apply`. -/ @[simp] theorem finiteAbelianNormSubgroupOrderIso_of_charZero_apply (L : FiniteAbelianSubextension (intrinsicAbstractBase K)) : - finiteAbelianNormSubgroupOrderIso_of_charZero K L = + finiteAbelianNormSubgroupOrderIsoOfCharZero K L = finiteAbelianNormSubgroupMap K L := by rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean index cd79e9923e..1caa14875c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean @@ -586,7 +586,7 @@ theorem finiteAbelianNormSubgroupMap_surjective_of_charP /-- 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 finiteAbelianNormSubgroupOrderIso_of_charP +noncomputable def finiteAbelianNormSubgroupOrderIsoOfCharP (p : ℕ) [Fact p.Prime] [CharP K p] : FiniteAbelianSubextension (intrinsicAbstractBase K) ≃o (OpenFiniteIndexSubgroup K)ᵒᵈ where @@ -600,18 +600,18 @@ noncomputable def finiteAbelianNormSubgroupOrderIso_of_charP exact (finiteAbelianSubextension_le_iff_normSubgroup_le K L₁ L₂).symm /-- Underlying equivalence of positive-characteristic local existence. -/ -noncomputable def finiteAbelianNormSubgroupEquiv_of_charP +noncomputable def finiteAbelianNormSubgroupEquivOfCharP (p : ℕ) [Fact p.Prime] [CharP K p] : FiniteAbelianSubextension (intrinsicAbstractBase K) ≃ OpenFiniteIndexSubgroup K := - (finiteAbelianNormSubgroupOrderIso_of_charP K p).toEquiv + (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)) : - finiteAbelianNormSubgroupOrderIso_of_charP K p L = + finiteAbelianNormSubgroupOrderIsoOfCharP K p L = finiteAbelianNormSubgroupMap K L := by rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean index a4dc2ff68e..5fd05ae517 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean @@ -59,7 +59,7 @@ noncomputable instance localFiniteUnramifiedField_isAbelianGalois (localFiniteUnramifiedAbelianSubextension K d hd) /-- The canonical spectral norm on the standard unramified fixed field. -/ -noncomputable instance localFiniteUnramifiedField_nontriviallyNormedField +noncomputable instance localFiniteUnramifiedFieldNontriviallyNormedField (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (d : ℕ) (hd : 0 < d) : @@ -68,7 +68,7 @@ noncomputable instance localFiniteUnramifiedField_nontriviallyNormedField (localFiniteUnramifiedField K d hd) /-- The valuation relation induced by the canonical spectral norm. -/ -noncomputable instance localFiniteUnramifiedField_valuativeRel +noncomputable instance localFiniteUnramifiedFieldValuativeRel (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (d : ℕ) (hd : 0 < d) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean index a207c5c429..e7bed398c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean @@ -25,6 +25,7 @@ variable {F : Type u} {M : Type v} {F' : Type w} {M' : Type x} [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') diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean index 77c34c0f38..f131d0a6f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean @@ -150,7 +150,8 @@ theorem exists_finiteAbelianNormSubgroup_eq_of_normOpen 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 + 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 = @@ -193,7 +194,7 @@ omit [ValuativeRel K] [TopologicalSpace K] theorem finiteIndexSubgroup_isNormOpen_of_normSubgroup_le (E : Type) [Field E] [Algebra K E] [FiniteDimensional K E] [IsGalois K E] - (H : Subgroup Kˣ) [H.FiniteIndex] + (H : Subgroup Kˣ) (hnorm : localNormSubgroup K E ≤ H) : let A := intrinsicAbsoluteUnits K let B := intrinsicAbstractBase K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean index f407724979..bcde32a818 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean @@ -167,7 +167,8 @@ 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 + (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) @@ -239,7 +240,7 @@ noncomputable instance finiteUnramifiedNormQuotient (K : Type u) /-- 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) [NeZero n] : + (n : Nat) : Nat.card (Kˣ ⧸ unramifiedNormSubgroup K n) = n := by calc Nat.card (Kˣ ⧸ unramifiedNormSubgroup K n) = @@ -248,7 +249,8 @@ theorem unramifiedNormQuotient_card_eq_degree (K : Type u) _ = 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. -/ +/-- 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ˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean index 05203d0fe3..b50920174d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -17,7 +17,8 @@ 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 +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. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index 59c1a5560c..dfa3adb750 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -834,7 +834,8 @@ theorem finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation_additive (MulEquiv.toAdditive ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr) z) = MulEquiv.toAdditive - ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr) z := by + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr) z + := by apply Additive.toMul.injective exact finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation K L i j z.toMul diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean index 8dfaba8ecb..8fca294f92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean @@ -42,7 +42,8 @@ theorem concreteNormResidueSymbolOfEmbedding_apply_primeNorm (sigma : D.FrobeniusElements ((intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D) (Eᵢ).field (Eᵢ).below) (hsigma : D.frobeniusRestriction - ((intrinsicFiniteAbstractBase K).toFiniteResidueAbstractField D) (Eᵢ).field (Eᵢ).below sigma = q) + ((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)) @@ -99,9 +100,11 @@ theorem concreteNormResidueSymbolOfEmbedding_apply_primeNorm 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) + 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 + 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) @@ -110,13 +113,15 @@ theorem concreteNormResidueSymbolOfEmbedding_apply_primeNorm 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 + 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) = + (finiteNormClass (intrinsicAbsoluteUnits K) (intrinsicAbstractBase K) (Eᵢ).field + (Eᵢ).below a) = Additive.ofMul (normClass K L x) := by rw [← hbase] convert diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index 19d8a328e3..26e571b1a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -77,7 +77,8 @@ def concreteReciprocityAddEquivOfEmbedding Additive (Abelianization Gal(L / K)) ≃+ Additive (NormQuotient K L) := (MulEquiv.toAdditive - ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr.symm)).trans + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L + i).abelianizationCongr.symm)).trans ((D.abstractReciprocityEquiv (A K) v hcf (intrinsicFiniteAbstractBase K) (finiteGaloisAbstractExtensionOfEmbedding K L i)).trans (finiteNormQuotientEquivEmbeddedNormQuotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean index b9a6895d30..e37543e64d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -45,7 +45,8 @@ theorem abelianizedGaloisConjugationOfEmbeddings_eq_refl change (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L j).abelianizationCongr ((finiteGaloisConjugationOfEmbeddings K L i j).abelianizationCongr - ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).abelianizationCongr.symm z)) = + ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L + i).abelianizationCongr.symm z)) = z exact (finiteGaloisAbstractQuotientEquivGaloisGroup_conjugation @@ -105,9 +106,9 @@ noncomputable def topologicalAbelianizationConjugationOfEmbeddings QuotientGroup.discreteTopology (isOpen_discrete _) let e : TopologicalAbelianization (Gal(L / K)) ≃* TopologicalAbelianization (Gal(L / K)) := - (topologicalAbelianization_finite_equiv K L).symm.trans + (topologicalAbelianizationFiniteEquiv K L).symm.trans ((abelianizedGaloisConjugationOfEmbeddings K L i j).trans - (topologicalAbelianization_finite_equiv K L)) + (topologicalAbelianizationFiniteEquiv K L)) exact { e with continuous_toFun := continuous_of_discreteTopology @@ -117,10 +118,10 @@ noncomputable def topologicalAbelianizationConjugationOfEmbeddings algebraic conjugation through the finite abelianization comparison. -/ theorem topologicalAbelianizationConjugationOfEmbeddings_toMonoidHom (i j : L →ₐ[K] SeparableClosure K) : - (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp (topologicalAbelianizationConjugationOfEmbeddings K L i j).toMonoidHom = (abelianizedGaloisConjugationOfEmbeddings K L i j).toMonoidHom.comp - (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom := by + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom := by ext x rfl @@ -140,13 +141,13 @@ theorem localArtinMap_conjugation apply ContinuousMonoidHom.ext intro x change - (topologicalAbelianization_finite_equiv K L) + (topologicalAbelianizationFiniteEquiv K L) ((abelianizedGaloisConjugationOfEmbeddings K L i j) - ((topologicalAbelianization_finite_equiv K L).symm + ((topologicalAbelianizationFiniteEquiv K L).symm (localArtinMap K L x))) = localArtinMap K L x rw [abelianizedGaloisConjugationOfEmbeddings_eq_refl] - exact (topologicalAbelianization_finite_equiv K L).apply_symm_apply _ + exact (topologicalAbelianizationFiniteEquiv K L).apply_symm_apply _ end LocalContinuous diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean index b74e178f2a..a3294a9180 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean @@ -137,18 +137,22 @@ theorem finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationG RamificationTheory.HilbertRamification.Higher.herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq 1 have hs : 0 < s ∧ s ≤ 1 := by - change 0 < (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + 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 RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_one_pos_le_one _ + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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⟩)) + (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 := @@ -165,7 +169,8 @@ theorem finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationG (base := base) (target := target) huniq 1) = RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup (base := base) (target := target) huniq 1 - exact RamificationTheory.HilbertRamification.Higher.upperRamificationGroupOfUniqueExtension_herbrandFunction + exact + RamificationTheory.HilbertRamification.Higher.upperRamificationGroupOfUniqueExtension_herbrandFunction (base := base) (target := target) huniq 1 calc localUpperRamificationGroup K L 1 = artinPrincipalUnitGroup K L 1 := @@ -240,7 +245,8 @@ theorem localConductorExponent_le_one_iff_residueChar_not_dvd_ramificationIndex (chosenLocalExtensionCompleteDVF K L).toDVF := by let A := (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring rw [localConductorExponent_le_one_iff_hilbertRamificationGroup_eq_bot] - exact (RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card + exact + (RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card K A p).trans (by rw [RamificationTheory.LocalField.chosenLocalExtension_inertia_card_eq_ramificationIndex K L]) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean index f52d5b851a..a0bbe217b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -163,7 +163,8 @@ theorem map_extensionSubgroup_abstractSubgroupEquiv 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 +/-- 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))) @@ -363,11 +364,11 @@ theorem abstractRelativeFixedField_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))) + (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))) + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) = @@ -386,7 +387,8 @@ theorem finiteAbstractExtension_degree_eq_finrank calc ((DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).degree : ℕ) = (extensionSubgroup K L hLK).index := - (DegreeData.FiniteAbstractExtension.ofInclusion L K hLK).extensionSubgroup_index_eq_degree.symm + (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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean index 11f57592a3..a377b88c01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean @@ -67,7 +67,8 @@ def finiteGaloisClosedFixingSubgroupOfEmbedding closedFixingSubgroup K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i) -/-- The fixing subgroup of an embedded finite Galois extension is normal in the absolute subgroup. -/ +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean index f1fc4e5e18..f0a9c839a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean @@ -122,7 +122,6 @@ theorem finiteResidueFrobeniusExponentEquiv_apply (z) : rfl /-- The Frobenius exponent equivalence sends one to arithmetic Frobenius. -/ -@[simp] theorem finiteResidueFrobeniusExponentEquiv_one : finiteResidueFrobeniusExponentEquiv k L (Multiplicative.ofAdd (1 : ZMod (Module.finrank k L))) = @@ -156,7 +155,6 @@ theorem finiteResidueFrobeniusFromZHat_apply (z : ZHatMul) : rfl /-- The distinguished profinite integer `1` acts as arithmetic Frobenius. -/ -@[simp] theorem finiteResidueFrobeniusFromZHat_one : finiteResidueFrobeniusFromZHat k L (Multiplicative.ofAdd (1 : ZHat)) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index 40816b5acb..023ad03b3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -60,6 +60,8 @@ noncomputable local instance localAbstractFixedResidueIntermediateFieldAlgebra (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 @@ -68,6 +70,8 @@ noncomputable local instance localAbstractFixedResidueIntermediateFieldSMul @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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index f574ff91c5..a156599431 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -535,7 +535,7 @@ noncomputable def lowerNormResidueMap T.lowerBase T.lowerTop T.lowerTop_le_lowerBase /-- Forgetting continuity recovers the lower algebraic norm-residue map. -/ -@[simp] theorem lowerNormResidueMap_toMonoidHom +theorem lowerNormResidueMap_toMonoidHom (T : LocalFixedFieldNormRestrictionSquare k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.lowerBase) := @@ -574,7 +574,7 @@ noncomputable def upperNormResidueMap T.upperBase T.upperTop T.upperTop_le_upperBase /-- Forgetting continuity recovers the upper algebraic norm-residue map. -/ -@[simp] theorem upperNormResidueMap_toMonoidHom +theorem upperNormResidueMap_toMonoidHom (T : LocalFixedFieldNormRestrictionSquare k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.upperBase) := @@ -620,7 +620,7 @@ noncomputable def normUnitsMap T.lowerBase T.upperBase T.upperBase_le_lowerBase /-- Forgetting continuity recovers the algebraic norm on units. -/ -@[simp] theorem normUnitsMap_toMonoidHom +theorem normUnitsMap_toMonoidHom (T : LocalFixedFieldNormRestrictionSquare k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.lowerBase) := @@ -659,7 +659,7 @@ noncomputable def abelianizedRestrictionMap T.upperBase_le_lowerBase T.upperTop_le_lowerTop /-- Forgetting continuity recovers algebraic abelianized restriction. -/ -@[simp] theorem abelianizedRestrictionMap_toMonoidHom +theorem abelianizedRestrictionMap_toMonoidHom (T : LocalFixedFieldNormRestrictionSquare k) : (abelianizedRestrictionMap T).toMonoidHom = MonoidHom.toAdditive.symm (abelianizedRestriction T) := rfl @@ -772,7 +772,7 @@ noncomputable def baseNormResidueMap (T.top_le_intermediate.trans T.intermediate_le_base) /-- Forgetting continuity recovers the total algebraic norm-residue map. -/ -@[simp] theorem baseNormResidueMap_toMonoidHom +theorem baseNormResidueMap_toMonoidHom (T : LocalFixedFieldTransferTower k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.base) := @@ -813,7 +813,7 @@ noncomputable def intermediateNormResidueMap T.intermediate T.top T.top_le_intermediate /-- Forgetting continuity recovers the intermediate norm-residue map. -/ -@[simp] theorem intermediateNormResidueMap_toMonoidHom +theorem intermediateNormResidueMap_toMonoidHom (T : LocalFixedFieldTransferTower k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.intermediate) := @@ -857,7 +857,7 @@ noncomputable def unitsInclusionMap T.base T.intermediate T.intermediate_le_base /-- Forgetting continuity recovers algebraic inclusion of fixed-field units. -/ -@[simp] theorem unitsInclusionMap_toMonoidHom +theorem unitsInclusionMap_toMonoidHom (T : LocalFixedFieldTransferTower k) : letI : FiniteDimensional k (abstractFixedField k (SeparableClosure k) T.base) := @@ -891,7 +891,7 @@ noncomputable def abelianizedTransferMap T.top_le_intermediate T.intermediate_le_base /-- Forgetting continuity recovers algebraic abelianized transfer. -/ -@[simp] theorem abelianizedTransferMap_toMonoidHom +theorem abelianizedTransferMap_toMonoidHom (T : LocalFixedFieldTransferTower k) : (abelianizedTransferMap T).toMonoidHom = MonoidHom.toAdditive.symm (abelianizedTransfer T) := rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean index cf8832be07..07dcd020d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -29,15 +29,15 @@ over `F` with its realization inside the ambient separable closure of `K`. -/ abbrev ambientEmbeddedSeparableClosureEquiv (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) := @AlgEquiv F (SeparableClosure F) (SeparableClosure K) _ _ _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean index 0ebe8cc889..9515bd76ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -553,7 +553,7 @@ theorem (K F L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - [Field F] [Field L] [Algebra F L] [FiniteDimensional F L] + [Field F] [Field L] [Algebra F L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] (H : FiniteAbstractField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean index c8c7e20364..7783e77e88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # 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. +This module identifies extension subgroups transported through an embedded finite Galois + extension and constructs the resulting ambient quotient equivalence with the actual Galois group. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean index 2ea3257cab..3e95f18938 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # Embedded inertia comparison -This module transports extension inertia between an intrinsic finite extension and its realization inside an ambient separable closure. +This module transports extension inertia between an intrinsic finite extension and its + realization inside an ambient separable closure. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean index ba391e9646..f3b39622cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -11,7 +11,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLoca /-! # 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. +This module compares cohomological finite norm quotients with ordinary field-norm quotients and + records their compatibility with fixed-field norm-residue symbols. -/ noncomputable section @@ -241,7 +242,7 @@ theorem fixedFieldFiniteNormQuotientEquivNormQuotient_finiteNormClass prime element is the prescribed Frobenius quotient class. -/ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] - [IsGalois k Ω] [IsSepClosed Ω] + [IsGalois k Ω] (D : DegreeData Gal(Ω/k)) (v : ValuationData D (galoisAmbientUnitsRep k Ω)) (hcf : SatisfiesClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean index 6df7476a93..dd64784724 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # Intrinsic fixed-field specialization -This module specializes the embedded subgroup and inertia comparisons to actual finite fixed fields and packages the intrinsic Frobenius quotient. +This module specializes the embedded subgroup and inertia comparisons to actual finite fixed + fields and packages the intrinsic Frobenius quotient. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean index a3d93525b3..2de589cc6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L /-! # 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. +This module compares the intrinsic absolute Galois base of a finite extension with its + realization as a fixing subgroup in an ambient separable closure. -/ noncomputable section @@ -192,7 +193,7 @@ ambient subgroup fixing the embedding's field range. -/ noncomputable def intrinsicBaseEquivAmbientEmbeddedField (K F : Type) [Field K] [Field F] - [Algebra K F] [FiniteDimensional K F] [Algebra.IsSeparable K F] + [Algebra K F] [FiniteDimensional K F] (i : F →ₐ[K] SeparableClosure K) : letI : Algebra F (SeparableClosure F) := (separableClosure F (AlgebraicClosure F)).algebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index 0473edeb2e..9c47be80d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -14,7 +14,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.Contin /-! # Embedded Frobenius transport -This module transports inertia, Frobenius elements, and fixed fields across an explicit equivalence of separable closures. +This module transports inertia, Frobenius elements, and fixed fields across an explicit + equivalence of separable closures. -/ noncomputable section @@ -1732,7 +1733,6 @@ noncomputable def /-- After coercion to `SeparableClosure K`, the Frobenius fixed-field equivalence acts as the original separable-closure equivalence. -/ -@[simp] theorem intrinsicFrobeniusFixedFieldEquivAmbientEmbeddedField_apply_val (j : E →ₐ[K] SeparableClosure K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index 77cb528372..fa3bdb301c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -31,7 +31,7 @@ theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction [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'] + [IsScalarTower K K' L'] [FiniteDimensional K K'] [Algebra.IsSeparable K K'] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation K')] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean index c44fe353a5..1f4be32d16 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -66,7 +66,9 @@ local notation "qH" => abstractExtensionQuotientEquivGaloisGroup K (SeparableClosure K) H.field J hJH hJnormal -local instance intrinsicPrimeComparison_separableClosureAlgebra : +/-- 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 @@ -84,11 +86,13 @@ local instance intrinsicPrimeComparison_fixedFieldFiniteDimensional : abstractFixedField_finiteDimensional K (SeparableClosure K) H.field H.finite -local instance intrinsicPrimeComparison_fixedFieldNormed : +/-- The comparison fixed field carries the spectral norm extending the local base-field norm. -/ +local instance intrinsicPrimeComparisonFixedFieldNormed : NontriviallyNormedField F := finiteExtensionSpectralNormedField K F -local instance intrinsicPrimeComparison_fixedFieldValuative : +/-- The valuation relation on the comparison fixed field induced by its spectral norm. -/ +local instance intrinsicPrimeComparisonFixedFieldValuative : ValuativeRel F := finiteExtensionSpectralValuativeRel K F @@ -244,7 +248,9 @@ abbrev intrinsicFixedFieldFrobeniusAmbientField (intrinsicFixedFieldFrobeniusAmbientBelow K H J hJH e σ) -local instance intrinsicPrimeComparison_frobeniusSourceAlgebra +/-- 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 @@ -262,12 +268,12 @@ local instance intrinsicPrimeComparison_frobeniusSourceFiniteDimensional (intrinsicFixedFieldFrobeniusSourceField K H J hJH e σ) _ _ - (intrinsicPrimeComparison_frobeniusSourceAlgebra + (intrinsicPrimeComparisonFrobeniusSourceAlgebra K H J hJH e σ)) := by let : Algebra F (intrinsicFixedFieldFrobeniusSourceField K H J hJH e σ) := - intrinsicPrimeComparison_frobeniusSourceAlgebra + intrinsicPrimeComparisonFrobeniusSourceAlgebra K H J hJH e σ let _hRFFinite : Finite @@ -283,7 +289,9 @@ local instance intrinsicPrimeComparison_frobeniusSourceFiniteDimensional ((localResidueDatum F).frobeniusFixedField_absoluteFinite (intrinsicFiniteAbstractBase F) (EI).field (EI).below σ) -local instance intrinsicPrimeComparison_frobeniusSourceNormed +/-- 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 @@ -292,7 +300,9 @@ local instance intrinsicPrimeComparison_frobeniusSourceNormed (intrinsicFixedFieldFrobeniusSourceField K H J hJH e σ) -local instance intrinsicPrimeComparison_frobeniusSourceValuative +/-- 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 @@ -321,7 +331,9 @@ local instance intrinsicPrimeComparison_frobeniusSourceValuationExtension (intrinsicFixedFieldFrobeniusSourceField K H J hJH e σ) -local instance intrinsicPrimeComparison_frobeniusAmbientAlgebraK +/-- 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 @@ -330,7 +342,9 @@ local instance intrinsicPrimeComparison_frobeniusAmbientAlgebraK (intrinsicFixedFieldFrobeniusAmbientClosedField K H J hJH e σ)).algebra -local instance intrinsicPrimeComparison_frobeniusAmbientAlgebraF +/-- 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 @@ -348,12 +362,12 @@ local instance intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalK (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) _ _ - (intrinsicPrimeComparison_frobeniusAmbientAlgebraK + (intrinsicPrimeComparisonFrobeniusAmbientAlgebraK K H J hJH e σ)) := by let : Algebra K (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) := - intrinsicPrimeComparison_frobeniusAmbientAlgebraK + intrinsicPrimeComparisonFrobeniusAmbientAlgebraK K H J hJH e σ change FiniteDimensional K (abstractFixedField K (SeparableClosure K) @@ -369,7 +383,9 @@ local instance intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalK (intrinsicFrobeniusElementToAmbientFixedField K H J hJH e σ)) -local instance intrinsicPrimeComparison_frobeniusAmbientNormed +/-- 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 @@ -378,7 +394,9 @@ local instance intrinsicPrimeComparison_frobeniusAmbientNormed (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) -local instance intrinsicPrimeComparison_frobeniusAmbientValuative +/-- 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 @@ -417,12 +435,12 @@ local instance intrinsicPrimeComparison_frobeniusAmbientFiniteDimensionalF (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) _ _ - (intrinsicPrimeComparison_frobeniusAmbientAlgebraF + (intrinsicPrimeComparisonFrobeniusAmbientAlgebraF K H J hJH e σ)) := by let : Algebra F (intrinsicFixedFieldFrobeniusAmbientField K H J hJH e σ) := - intrinsicPrimeComparison_frobeniusAmbientAlgebraF + intrinsicPrimeComparisonFrobeniusAmbientAlgebraF K H J hJH e σ exact abstractRelativeFixedField_finiteDimensional @@ -816,10 +834,10 @@ private theorem intrinsicFixedFieldFrobeniusPrimeNorm_ambient (intrinsicFrobeniusElementToAmbientFixedField K H J hJH e σ) (_hLHNorm := - intrinsicPrimeComparison_frobeniusAmbientNormed + intrinsicPrimeComparisonFrobeniusAmbientNormed K H J hJH e σ) (_hLHVal := - intrinsicPrimeComparison_frobeniusAmbientValuative + intrinsicPrimeComparisonFrobeniusAmbientValuative K H J hJH e σ) (_hLHLocal := intrinsicPrimeComparison_frobeniusAmbientLocal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index ceaa754a95..7c2ef9fb80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -32,6 +32,7 @@ private abbrev finiteFixedField Type := abstractFixedField K (SeparableClosure K) H.field +/-- 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))) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index 70eca1bf8f..1b91c57585 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -30,6 +30,8 @@ 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] @@ -193,7 +195,7 @@ theorem relativeNorm_abstractFixedFieldUnit_eq_normUnits (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] (x : (abstractRelativeFixedField k Ω hLK)ˣ) : relativeNorm (galoisAmbientUnitsRep k Ω) K L hLK diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean index cd7d5da156..d537d35c48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -371,7 +371,8 @@ theorem concreteNormResidueAutomorphism_restrict 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 + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean index 266cfa8d8a..a1c749e39b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean @@ -82,3 +82,5 @@ theorem intrinsicFiniteAbstractBase_eq_base 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/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index 11ff38aeb0..2bfc7dd775 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -44,6 +44,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean index fde4187719..9c1bb0e56b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean @@ -43,7 +43,8 @@ noncomputable def abelianizationEquivNormQuotient : (localHenselianValuation K) (separableClosureUnits_isClassFormation K) -/-- The isomorphism in the finite local reciprocity construction is independent of the embedding used to +/-- 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean index ca27b00e0b..588dcddaa9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean @@ -27,6 +27,8 @@ 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] : @@ -34,6 +36,8 @@ noncomputable local instance localNormQuotientTopologicalSpace 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] : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean index 16a2ca9296..62db5a656d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean @@ -62,7 +62,7 @@ noncomputable def topologicalAbelianizationEquivSelf : letI : DiscreteTopology (TopologicalAbelianization Gal(L / K)) := QuotientGroup.discreteTopology (isOpen_discrete _) let e : TopologicalAbelianization Gal(L / K) ≃* Gal(L / K) := - (topologicalAbelianization_finite_equiv K L).symm.trans + (topologicalAbelianizationFiniteEquiv K L).symm.trans (Abelianization.equivOfComm (H := Gal(L / K))).symm exact { e with @@ -84,7 +84,7 @@ theorem abelianLocalArtinMap_toMonoidHom : abelianLocalArtinMonoidHom K L := by change ((Abelianization.equivOfComm (H := Gal(L / K))).symm).toMonoidHom.comp - ((topologicalAbelianization_finite_equiv K L).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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean index a6f9e07e6d..59017e9ce4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean @@ -97,7 +97,6 @@ def residueFrobeniusToLimit : omit [IsGalois k Omega] in /-- States the theorem `residueFrobeniusToLimit_apply_component`. -/ -@[simp] theorem residueFrobeniusToLimit_apply_component (z : ZHatMul) (E : (FiniteGaloisIntermediateField k Omega)ᵒᵖ) : (residueFrobeniusToLimit k Omega z).val E = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean index eecbbc57c9..d3aee8b633 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -19,7 +19,8 @@ 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 +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 @@ -163,6 +164,7 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean index b38bbfa045..c35c6cf726 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -22,6 +22,7 @@ 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] @@ -35,7 +36,7 @@ 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] - [FiniteDimensional k L] [Algebra.IsSeparable k L] + [Algebra.IsSeparable k E] [FiniteDimensional k E] (pb : PowerBasis k L) : ∏ σ : E →ₐ[k] Ω, σ (algebraMap L E pb.gen) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean index d1f042c796..8416ff287f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -21,7 +21,8 @@ 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 +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. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean index 5ea12136dd..f0f2d39802 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -30,6 +30,7 @@ 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] : @@ -363,7 +364,7 @@ private theorem commutator_topologicalClosure_eq /-- For a finite-dimensional Galois extension, algebraic and topological abelianization agree as multiplicative groups. -/ -noncomputable def topologicalAbelianization_finite_equiv : +noncomputable def topologicalAbelianizationFiniteEquiv : Abelianization (Gal(L / K)) ≃* TopologicalAbelianization (Gal(L / K)) := by let h : Subgroup.topologicalClosure (commutator (Gal(L / K))) = commutator (Gal(L / K)) := @@ -379,7 +380,7 @@ noncomputable def localReciprocityEquiv : QuotientGroup.discreteTopology (isOpen_discrete _) let e : NormQuotient K L ≃* TopologicalAbelianization (Gal(L / K)) := (abelianizationEquivNormQuotient K L).symm.trans - (topologicalAbelianization_finite_equiv K L) + (topologicalAbelianizationFiniteEquiv K L) exact { e with continuous_toFun := continuous_of_discreteTopology @@ -390,7 +391,7 @@ isomorphism followed by the finite abelianization comparison. -/ theorem localReciprocityEquiv_toMulEquiv : (localReciprocityEquiv K L).toMulEquiv = (abelianizationEquivNormQuotient K L).symm.trans - (topologicalAbelianization_finite_equiv K L) := by + (topologicalAbelianizationFiniteEquiv K L) := by rfl /-- The quotient map to the norm quotient, bundled as a continuous @@ -409,31 +410,31 @@ noncomputable def localArtinMap : /-- Forgetting the topology and comparing finite abelianizations recovers the algebraic local Artin homomorphism. -/ theorem localArtinMap_toMonoidHom : - (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp (localArtinMap K L).toMonoidHom = localArtinMonoidHom K L := by ext x change - (topologicalAbelianization_finite_equiv K L).symm + (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) = - topologicalAbelianization_finite_equiv K L + 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 (topologicalAbelianization_finite_equiv K L).symm_apply_apply _ + 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) : - (topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp (localArtinMap K L).toMonoidHom = concreteNormResidueSymbolOfEmbedding K L i (localResidueDatum K) @@ -463,7 +464,7 @@ theorem localArtinMap_ker : /-- The canonical first-isomorphism equivalence induced by the continuous local Artin map. -/ -noncomputable def localArtinMap_quotientKerEquiv : +noncomputable def localArtinMapQuotientKerEquiv : Kˣ ⧸ (localArtinMap K L).toMonoidHom.ker ≃* TopologicalAbelianization (Gal(L / K)) := QuotientGroup.quotientKerEquivOfSurjective @@ -471,9 +472,8 @@ noncomputable def localArtinMap_quotientKerEquiv : /-- The first-isomorphism equivalence sends the class of a field unit to its image under the local Artin map. -/ -@[simp] theorem localArtinMap_quotientKerEquiv_mk (x : Kˣ) : - localArtinMap_quotientKerEquiv K L (QuotientGroup.mk x) = + localArtinMapQuotientKerEquiv K L (QuotientGroup.mk x) = localArtinMap K L x := by rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean index a13e36dfbd..2659f0aa73 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -401,16 +401,16 @@ theorem localArtinMonoidHom_eq_frobenius_zpow (x : Kˣ) : class of arithmetic Frobenius raised to its normalized valuation. -/ theorem localArtinMap_eq_frobenius_zpow (x : Kˣ) : localArtinMap K L x = - (topologicalAbelianization_finite_equiv K L + (topologicalAbelianizationFiniteEquiv K L (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L))) ^ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x) := by - apply (topologicalAbelianization_finite_equiv K L).symm.injective + apply (topologicalAbelianizationFiniteEquiv K L).symm.injective rw [map_zpow, - (topologicalAbelianization_finite_equiv K L).symm_apply_apply] + (topologicalAbelianizationFiniteEquiv K L).symm_apply_apply] change - (((topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (((topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp (localArtinMap K L).toMonoidHom) x) = (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) ^ @@ -425,13 +425,13 @@ the topological abelianization. -/ @[simp] theorem localArtinMap_localAbstractPrimeFieldUnit : localArtinMap K L (localAbstractPrimeFieldUnit K) = - topologicalAbelianization_finite_equiv K L + topologicalAbelianizationFiniteEquiv K L (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) := by - apply (topologicalAbelianization_finite_equiv K L).symm.injective - rw [(topologicalAbelianization_finite_equiv K L).symm_apply_apply] + apply (topologicalAbelianizationFiniteEquiv K L).symm.injective + rw [(topologicalAbelianizationFiniteEquiv K L).symm_apply_apply] change - (((topologicalAbelianization_finite_equiv K L).symm.toMonoidHom.comp + (((topologicalAbelianizationFiniteEquiv K L).symm.toMonoidHom.comp (localArtinMap K L).toMonoidHom) (localAbstractPrimeFieldUnit K)) = Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L) @@ -442,7 +442,7 @@ theorem localArtinMap_localAbstractPrimeFieldUnit : @[simp] theorem localArtinMap_uniformizer : localArtinMap K L (inverseIntegerRingUniformizerFieldUnit K) = - topologicalAbelianization_finite_equiv K L + topologicalAbelianizationFiniteEquiv K L (Abelianization.of (arithmeticFrobeniusOfUnramifiedValuation K L)) := by rw [localArtinMap_eq_frobenius_zpow, @@ -461,7 +461,8 @@ theorem localArtinMap_eq_one_of_valuationMap_eq_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 + 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean index 47acf8ce02..b0263a0914 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean @@ -28,7 +28,7 @@ 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] [IsUniformAddGroup L] [IsNonarchimedeanLocalField 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean index 007174e73a..4cf3c7eada 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -73,7 +73,8 @@ theorem finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow K L u hval x constructor · intro hσ - apply LocalFieldTheory.galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + apply + LocalFieldTheory.galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation K L apply AlgEquiv.ext intro y diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean index 133af1b822..68094a90df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean @@ -35,7 +35,8 @@ theorem localSeparableValuationSubring_comap_semilinear 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 ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + apply + ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback intro x change e (algebraMap K (SeparableClosure K) x) ∈ localSeparableValuationSubring K' ↔ x ∈ (localCompleteDVF K).valuation.valuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean index 07e63f4c18..6fcfe4b1aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean @@ -9,4 +9,5 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.U import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified` Lean module. -/ +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified` Lean + module. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean index a90859bb5a..4432866dcd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.Norm` Lean module. -/ +/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.Norm` Lean + module. -/ noncomputable section @@ -86,7 +87,8 @@ theorem v_normUnits_integerUnitsToFieldUnits have hval : LocalFieldTheory.IsNonarchimedeanLocalField.v K (Additive.ofMul (integerUnitsToFieldUnits K (normIntegerUnits K L u))) = 0 := - LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits K (normIntegerUnits K L u) + LocalFieldTheory.IsNonarchimedeanLocalField.v_integerUnitsToFieldUnits K (normIntegerUnits K + L u) simpa [LocalFieldTheory.normUnits, normIntegerUnits_to_fieldUnits K L u] using hval @@ -114,7 +116,8 @@ theorem v_normUnits_mapBase_inverseIntegerRingUniformizerFieldUnit_zpow (K := K) (L := L) ((inverseIntegerRingUniformizerFieldUnit K) ^ m) simpa [LocalFieldTheory.normUnits] using hnorm rw [hbase] - rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_pow, LocalFieldTheory.IsNonarchimedeanLocalField.v_zpow, + rw [LocalFieldTheory.IsNonarchimedeanLocalField.v_pow, + LocalFieldTheory.IsNonarchimedeanLocalField.v_zpow, v_inverseIntegerRingUniformizerFieldUnit] rw [mul_one] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean index 8cbaf748a2..230dcea38a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean @@ -8,4 +8,5 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.U import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits` Lean module. -/ +/-! 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 index 41fa53cfcf..5aadafea31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -7,7 +7,8 @@ Authors: n-yamaguchi-0729 import Mathlib.FieldTheory.Galois.Basic import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic` Lean module. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean index ce96b46972..a37d8fa7b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -5,7 +5,8 @@ Authors: n-yamaguchi-0729 -/ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift` Lean module. -/ noncomputable section @@ -18,7 +19,8 @@ open LocalFieldTheory open LocalFieldTheory.IsNonarchimedeanLocalField open Filter -/-- States the theorem `principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ`. -/ +/-- States the theorem +`principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ`. -/ theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_lift_mod_succ (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] @@ -281,7 +283,8 @@ theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_su /-- The actual integral-closure correction sequence encoded by consecutive coherent approximation states. -/ -noncomputable def chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq +noncomputable def + chosenPrincipalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxCorrectionSeq (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] @@ -418,7 +421,8 @@ theorem eventually_normIntegerUnits_div_mem_principalUnits_of_tendsto_units_of_i /-- The limit of the actual integral-closure coherent approximation states preserves all finite-depth error bounds. -/ -theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosureApproxState_limit_error_mem_add_all +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] @@ -487,11 +491,11 @@ theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_eq_of_error_m (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] + [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]] - [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] + (n : Nat) (y : principalUnits K n) (x : principalUnits L n) (h : ∀ d : Nat, ((y : 𝒪[K]ˣ) / normIntegerUnits K L (x : 𝒪[L]ˣ)) ∈ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean index 77518e552e..66d7bf3ca9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import Mathlib.FieldTheory.Galois.Basic import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide` Lean module. -/ noncomputable section @@ -35,8 +36,8 @@ 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] [IsNonarchimedeanLocalField K] - [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [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] @@ -62,8 +63,8 @@ theorem integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosur /-- 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] [IsNonarchimedeanLocalField K] - [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] + [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] @@ -152,7 +153,8 @@ theorem principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod /-- Actual integral-closure version of the first-order norm-product calculation before residue trace identification. -/ -theorem principalUnitsNormExtensionSideOfIsIntegralClosure_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ +theorem + principalUnitsNormExtensionSideOfIsIntegralClosure_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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean index ac92698921..4b980c7274 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import Mathlib.FieldTheory.Galois.Basic import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace` Lean module. -/ noncomputable section @@ -113,7 +114,8 @@ 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 principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_oneAdd_uniformizer_pow_eq_trace +theorem + principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_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] @@ -224,7 +226,6 @@ noncomputable def principalUnitsSuccQuotTraceOfUnramifiedValuation (K L : Type u (principalUnitsSuccQuotAddEquivResidueOfIrreducible L πL hπL n hn).toAddMonoidHom) /-- States the theorem `principalUnitsSuccQuotTraceOfUnramifiedValuation_apply`. -/ -@[simp] theorem principalUnitsSuccQuotTraceOfUnramifiedValuation_apply (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean index 6587c4abe2..18d0f019dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.U import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift -/-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.ResidueNorm` Lean module. -/ +/-! Provides the public declarations in the + `LocalClassFieldTheory.Finite.Unramified.ResidueNorm` Lean module. -/ noncomputable section @@ -148,7 +149,8 @@ theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_alg /-- 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 +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] @@ -172,7 +174,8 @@ theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_bas /-- 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 integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_eq_residueNorm_of_unramifiedValuation +theorem + integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_eq_residueNorm_of_unramifiedValuation (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] @@ -193,7 +196,8 @@ theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_eq_residueN /-- The actual integral-closure quotient norm on `𝒪[L]ˣ/U_L¹` is surjective in the unramified valuation case. -/ -theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_surjective_of_unramifiedValuation +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean index 123b91dcd3..881a3d2a59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -45,7 +45,7 @@ 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 - chosenNormQuotientEquivZModResidueFinrank_of_fieldPrincipalUnits_zero_le + chosenNormQuotientEquivZModResidueFinrankOfFieldPrincipalUnitsZeroLe (K L : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] @@ -208,7 +208,7 @@ theorem isFiniteUnramifiedValuationExtension_of_localConductorIdeal_eq_one have hU : LocalFieldTheory.fieldPrincipalUnits K 0 ≤ localNormSubgroup K L := (localConductorIdeal_eq_one_iff K L).1 hcond let hequiv := - chosenNormQuotientEquivZModResidueFinrank_of_fieldPrincipalUnits_zero_le + chosenNormQuotientEquivZModResidueFinrankOfFieldPrincipalUnitsZeroLe K L hU let : Finite (NormQuotient K L) := normQuotientFiniteOfIsAbelianGalois K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean index 83724e7dd6..84164e0288 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean @@ -216,7 +216,6 @@ noncomputable def separableAbsoluteLocalArtinMap : /-- Projection of the absolute local Artin map to an open finite quotient is the corresponding finite local Artin coordinate. -/ -@[simp] theorem separableAbsoluteLocalArtinMap_finiteProjection (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) (a : Kˣ) : QuotientGroup.mk' N.toSubgroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean index 55fac1eb86..0bb002a83a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -32,6 +32,8 @@ 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)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean index a9a1168222..7dc81419a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean @@ -300,7 +300,7 @@ theorem abstractProfiniteCompletionToTopological_map /-- Under the condition that all finite-index normal subgroups are open, the open-quotient completion is canonically the abstract profinite completion. -/ -def topologicalProfiniteCompletion_compare_abstract +def topologicalProfiniteCompletionCompareAbstract (hOpen : ∀ H : Subgroup G, H.Normal → H.FiniteIndex → IsOpen (H : Set G)) : TopologicalProfiniteCompletion G ≃ₜ* AbstractProfiniteCompletion G := by let forward := topologicalProfiniteCompletionToAbstract G hOpen diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean index 06a82169ac..d62c30b833 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -29,6 +29,8 @@ variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] private 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] : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean index 1ff9c51f84..0758362798 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean @@ -31,7 +31,7 @@ open LocalFieldTheory.IsNonarchimedeanLocalField open finite-index normal subgroup. -/ def finiteTargetKernelOpenFiniteIndexNormalSubgroup {G : Type u} {F : Type v} - [Group G] [TopologicalSpace G] [IsTopologicalGroup G] + [Group G] [TopologicalSpace G] [Group F] [Finite F] [TopologicalSpace F] [DiscreteTopology F] (f : G →ₜ* F) : OpenFiniteIndexNormalSubgroup G := ⟨ @@ -51,7 +51,7 @@ def valuationModContinuousMonoidHom (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : ℕ) [TopologicalSpace (Multiplicative (ZMod n))] - [DiscreteTopology (Multiplicative (ZMod n))] : + : Kˣ →ₜ* Multiplicative (ZMod n) where toMonoidHom := (Int.castAddHom (ZMod n)).toMultiplicative.comp (valuationUnitsMulHom K) @@ -71,9 +71,9 @@ theorem exists_openFiniteIndexNormalSubgroup_not_mem_localMultiplicativeGroup by_cases hvaluation : valuationExponent = 0 · have hvaluation' : valuationMap K (Additive.ofMul x) = 0 := by simpa [valuationExponent] using hvaluation - let unitFactor : Kˣ →ₜ* LocalFieldTheory.localUnits_profinite K := + let unitFactor : Kˣ →ₜ* LocalFieldTheory.localUnitsProfinite K := localUnitFactorContinuousMonoidHom K - let ux : LocalFieldTheory.localUnits_profinite K := unitFactor x + let ux : LocalFieldTheory.localUnitsProfinite K := unitFactor x have hux : ux ≠ 1 := by intro h apply hx @@ -88,21 +88,21 @@ theorem exists_openFiniteIndexNormalSubgroup_not_mem_localMultiplicativeGroup _ = integerUnitsToFieldUnits K ux := rfl _ = integerUnitsToFieldUnits K 1 := congrArg _ h _ = 1 := map_one (integerUnitsToFieldUnits K) - have hone : (1 : LocalFieldTheory.localUnits_profinite K) ∈ - ({ux}ᶜ : Set (LocalFieldTheory.localUnits_profinite K)) := by + 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.localUnits_profinite K))) hone + ({ux}ᶜ : Set (LocalFieldTheory.localUnitsProfinite K))) hone let H : OpenFiniteIndexNormalSubgroup Kˣ := topologicalProfiniteCompletionPreimageIndex - (LocalFieldTheory.localUnits_profinite K) unitFactor N + (LocalFieldTheory.localUnitsProfinite K) unitFactor N refine ⟨H, ?_⟩ intro hmem have hunit : unitFactor x ∈ N := hmem have hnot : unitFactor x ∈ - ({ux}ᶜ : Set (LocalFieldTheory.localUnits_profinite K)) := hN hunit + ({ux}ᶜ : Set (LocalFieldTheory.localUnitsProfinite K)) := hN hunit exact hnot (by rfl) · let n : ℕ := valuationExponent.natAbs + 1 let : TopologicalSpace (Multiplicative (ZMod n)) := ⊥ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean index 6ef165bcfd..fd31efda15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean @@ -72,7 +72,8 @@ instance : PartialOrder (OpenFiniteIndexNormalSubgroup G) := instance : SmallCategory (OpenFiniteIndexNormalSubgroup G) := Preorder.smallCategory _ -/-- A morphism of open finite-index normal subgroups induces inclusion of the underlying subgroups. -/ +/-- 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 @@ -356,7 +357,6 @@ def topologicalProfiniteCompletionFiniteProjection (topologicalProfiniteCompletionPreimageIndex P f N)) /-- The induced finite projection sends the completion image of `g` to the class of `f g`. -/ -@[simp] theorem topologicalProfiniteCompletionFiniteProjection_map (P : ProfiniteGrp.{v}) (f : G →ₜ* P) (N : OpenNormalSubgroup P) (g : G) : topologicalProfiniteCompletionFiniteProjection P f N diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean index 6f9a78cb34..5316eaf752 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -190,7 +190,8 @@ noncomputable def profiniteLocalReciprocityHom : topologicalProfiniteCompletionLift (standardLocalAbsoluteAbelianProfinite K) (absoluteLocalArtinMap K) -/-- The standard reciprocity lift agrees with the absolute Artin map on canonical completion points. -/ +/-- The standard reciprocity lift agrees with the absolute Artin map on canonical completion +points. -/ @[simp] theorem profiniteLocalReciprocityHom_map (a : Kˣ) : profiniteLocalReciprocityHom K @@ -218,7 +219,6 @@ theorem profiniteLocalReciprocityHom_surjective : /-- Finite target projections agree with projection of the absolute Artin map on the dense copy of `K×`. -/ -@[simp] theorem profiniteLocalReciprocityHom_finiteProjection_map (N : OpenNormalSubgroup (standardLocalAbsoluteAbelianProfinite K)) (a : Kˣ) : @@ -289,7 +289,6 @@ theorem profiniteLocalReciprocity_apply /-- Profinite reciprocity restricts to the absolute local Artin map on the dense copy of the local multiplicative group. -/ -@[simp] theorem profiniteLocalReciprocity_completionMap (a : Kˣ) : profiniteLocalReciprocity K (topologicalProfiniteCompletionMap Kˣ a) = @@ -385,7 +384,6 @@ noncomputable def standardAbsoluteGaloisAbelianizationLimitEquiv : /-- Every finite projection of the absolute Artin map is its corresponding finite local Artin coordinate after canonical transport to the separable closure model. -/ -@[simp] theorem absoluteLocalArtinMap_finiteProjection (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) (a : Units K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 0e3b74a7b1..8c48b1b393 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -153,7 +153,6 @@ private noncomputable def localHilbertRightPowerClassHom exact (KummerTheory.mem_nthRootsSubgroup_iff K).mp (maximalLocalKummerPairingRightHom K n hnK hmu a c).property) -@[simp] private theorem localHilbertRightPowerClassHom_mk (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : @@ -231,7 +230,6 @@ noncomputable def localHilbertPairing /-- Evaluation of the descended pairing agrees with the original local Hilbert symbol on representatives. -/ -@[simp] theorem localHilbertPairing_apply (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b : Kˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean index 492b4d2777..360b586580 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean @@ -143,7 +143,6 @@ theorem maximalLocalKummerPairingRightHom_map_eq_rootQuotient_of_pow rootQuotient (K := K) (L := E) beta sigma exact (D.rootCharacter_eq_of_same_pow hfixed delta hbeta' sigma).symm -@[simp] theorem maximalLocalKummerPairing_mul_right (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a b c : Kˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean index 163f79f1e4..d376d4d5d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -21,7 +21,7 @@ identifies the arithmetic-Frobenius root quotient with the finite-field power residue symbol, and derives the tame formula for the local Hilbert symbol. -/ -open scoped Classical ValuativeRel +open scoped ValuativeRel noncomputable section @@ -35,6 +35,7 @@ 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 : ℕ)) : @@ -46,6 +47,7 @@ theorem nthRootsSubgroup_valuationMap_eq_zero 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 @@ -53,6 +55,7 @@ noncomputable def nthRootIntegerUnit integerUnitOfValuationMapZero K z.1 (nthRootsSubgroup_valuationMap_eq_zero K n z) +open scoped Classical in @[simp] theorem integerUnitsToFieldUnits_nthRootIntegerUnit (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : @@ -60,12 +63,14 @@ theorem integerUnitsToFieldUnits_nthRootIntegerUnit 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 @@ -87,6 +92,7 @@ noncomputable def localNthRootsReduction apply Units.ext rfl +open scoped Classical in @[simp] theorem localNthRootsReduction_apply (n : ℕ+) (z : nthRootsSubgroup K (n : ℕ)) : @@ -94,6 +100,7 @@ theorem localNthRootsReduction_apply 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] @@ -124,6 +131,7 @@ theorem localNthRootsReduction_nthRootsSubgroupMap 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 @@ -156,6 +164,7 @@ theorem valuationMap_eq_zero_of_pow_eq_map_integerUnit 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 @@ -187,6 +196,7 @@ theorem integerUnitOfValuationMapZero_pow_eq_integerUnitsMap 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 @@ -262,6 +272,7 @@ theorem residue_arithmeticFrobenius_integerUnitQuotient 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 @@ -338,6 +349,7 @@ theorem localNthRootsReduction_injective 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 @@ -380,6 +392,7 @@ noncomputable def localNthRootsReductionEquiv 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 @@ -407,6 +420,7 @@ theorem dvd_residueCard_sub_one_of_primitiveRoots 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 @@ -493,6 +507,7 @@ theorem residue_arithmeticFrobenius_kummerRootQuotient _ = (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 @@ -511,6 +526,7 @@ noncomputable def localTamePowerResidueSymbol 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 @@ -530,6 +546,7 @@ theorem localNthRootsReductionEquiv_localTamePowerResidueSymbol 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 @@ -690,6 +707,7 @@ theorem nthRootsSubgroupMap_localTamePowerResidueSymbol_eq_arithmeticFrobenius_r 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 @@ -704,6 +722,7 @@ theorem natCast_ne_zero_of_valuation_eq_one 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 @@ -800,6 +819,7 @@ theorem _ = (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 @@ -831,6 +851,7 @@ theorem (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 @@ -851,6 +872,7 @@ theorem localHilbertSymbol_zpow_right 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. -/ @@ -940,6 +962,7 @@ theorem localHilbertSymbol_integerUnit_integerUnit_eq_one _ = (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index ae3da65f70..386a956bc7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -323,7 +323,8 @@ theorem equalCharacteristicTargetLaurentUnitsEquiv_uniformizer_inv /-- 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 +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] @@ -749,7 +750,8 @@ private theorem equalCharacteristicTransported_normUnits (equalCharacteristicTargetLaurentRingEquiv K p ϖ hϖ).apply_symm_apply] rfl -/-- Mapping the explicit norm-subgroup computation norm subgroup along the base-field equivalence gives +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean index ccb173accb..ef9cbc993c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean @@ -46,7 +46,7 @@ open ValuationTheory.DiscreteValuationField open ValuationTheory.DiscreteValuationField.ValuedExtension private theorem natCard_ker_eq_pow_sub_of_surjective - {G H : Type*} [Group G] [Group H] [Finite G] [Finite H] + {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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index 4ea7b966a6..df63129b57 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -146,7 +146,8 @@ theorem padicFieldExponentialValuationSubring_eq_completeDVF (p : ℕ) [Fact p.Prime] : LubinTate.Valuations.exponentialValuationSubringAsValuationSubring (padicFieldExponentialValuation p) = - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring := by + (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 @@ -170,22 +171,26 @@ theorem padicFieldExponentialValuationSubring_eq_completeDVF · intro hx let z : ℤ_[p] := ⟨x, hx⟩ have he : ((e z : - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).valuationSubring) : + (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 := + 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) : + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring) : ℚ_[p]) := rfl _ = (y : ℚ_[p]) := congrArg - (fun w : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p).valuationSubring => + (fun w : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring => (w : ℚ_[p])) hez _ = x := rfl have hz := PadicInt.norm_le_one z @@ -221,7 +226,7 @@ theorem padicCyclotomicUnramified_padicExponentialValuation_henselian /-- 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 padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod +noncomputable def padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod (p : ℕ) [Fact p.Prime] : padicCyclotomicUnramifiedResidueField (padicFieldExponentialValuation p) ≃+* ZMod p := by @@ -245,7 +250,8 @@ noncomputable def padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMo 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.padicIntEquivValuationSubring + p)).symm).trans (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntResidueFieldEquivZMod p) /-- The residue field used by the unramified cyclotomic theorem has cardinality `p`. -/ @@ -260,7 +266,7 @@ theorem padicCyclotomicUnramified_padicExponentialResidueField_card (padicFieldExponentialValuation p)) = Fintype.card (ZMod p) := Fintype.card_congr - (padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod p).toEquiv + (padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p).toEquiv _ = p := ZMod.card p /-- the unramified cyclotomic theorem on the canonical `ℚ_p` valuation, specialized to @@ -273,7 +279,7 @@ theorem padicCyclotomic_finrank_prime_pow_sub_one (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : Module.finrank ℚ_[p] L = f := by let v := padicFieldExponentialValuation p - let e := padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod p + let e := padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p let : Finite (padicCyclotomicUnramifiedResidueField v) := Finite.of_equiv (ZMod p) e.symm.toEquiv let : Fintype (padicCyclotomicUnramifiedResidueField v) := Fintype.ofFinite _ @@ -309,7 +315,7 @@ noncomputable def padicFiniteExtensionAbsoluteValue let hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty (absoluteValueValuationSubring a hn) := (henselianValuation_iff_henselFactorization a hn).1 hh - exact normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + exact normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := ℚ_[p]) (L := L) a hn hv /-- The norm-formula absolute value is nonarchimedean. -/ @@ -359,7 +365,7 @@ theorem padicFiniteExtensionAbsoluteValue_complete IsCompleteForAbsoluteValue (padicFiniteExtensionAbsoluteValue p L) := by let v : AbsoluteValue ℚ_[p] ℝ := NormedField.toAbsoluteValue ℚ_[p] - let R := finiteNormExtension_nonarchimedean_finite_extension + let R := finiteNormExtensionNonarchimedeanFiniteExtension (K := ℚ_[p]) (L := L) v (padicFieldAbsoluteValue_complete p) (padicFieldAbsoluteValue_nonarchimedean p) @@ -567,15 +573,17 @@ private theorem padicCyclotomicUnramified_valuationSubring_eq_integralClosure /-- Identity-on-elements equivalence between the exponential valuation ring of `ℚ_p` and the standard complete-DVF valuation ring. -/ -noncomputable def padicCyclotomicUnramified_padicExponentialValuationSubringEquivCompleteDVF +noncomputable def padicCyclotomicUnramifiedPadicExponentialValuationSubringEquivCompleteDVF (p : ℕ) [Fact p.Prime] : LubinTate.Valuations.exponentialValuationSubring (padicFieldExponentialValuation p) ≃+* - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring := by + (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 + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring have hVC : V = C := padicFieldExponentialValuationSubring_eq_completeDVF p exact @@ -594,7 +602,7 @@ noncomputable def padicCyclotomicUnramified_padicExponentialValuationSubringEqui /-- If a complete-DVF target is the actual integral closure, its valuation ring is identity-equivalent to the norm-formula valuation ring. -/ -noncomputable def padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv +noncomputable def padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv (p : ℕ) [Fact p.Prime] (L : Type*) [Field L] [Algebra ℚ_[p] L] [FiniteDimensional ℚ_[p] L] (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) @@ -617,12 +625,15 @@ noncomputable def padicCyclotomicUnramified_padicFiniteExtensionValuationSubring L).toSubring := by let : IsIntegralClosure T - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring L := by + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring L := by change IsIntegralClosure target.valuationSubring - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuationSubring L infer_instance exact padicCyclotomicUnramified_valuationSubring_eq_integralClosure - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring T + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.valuationSubring T exact { toFun := fun x => ⟨x, by change (x : L) ∈ T.toSubring @@ -649,7 +660,7 @@ theorem padicFiniteExtensionExponentialValuationSubring_eq_completeDVF (padicFiniteExtensionExponentialValuation p L) = target.valuation.valuationSubring := by let e := - padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv p L target + padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv p L target ext y constructor · intro hy @@ -670,7 +681,7 @@ theorem padicCyclotomic_finiteUnramified_of_coprime (padicFiniteExtensionExponentialValuation p L) (padicFiniteExtensionExponentialValuation_extends p L) := by let v := padicFieldExponentialValuation p - let e := padicCyclotomicUnramified_padicExponentialResidueFieldEquivZMod p + let e := padicCyclotomicUnramifiedPadicExponentialResidueFieldEquivZMod p let : Finite (padicCyclotomicUnramifiedResidueField v) := Finite.of_equiv (ZMod p) e.symm.toEquiv let : Fintype (padicCyclotomicUnramifiedResidueField v) := Fintype.ofFinite _ @@ -706,7 +717,8 @@ theorem padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) [hExt : - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.HasExtension + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension target.valuation] [IsIntegralClosure target.valuationSubring (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : @@ -723,9 +735,9 @@ theorem padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one let iCanonical : base.valuationSubring →+* target.valuationSubring := algebraMap base.valuationSubring target.valuationSubring let eBase : V ≃+* base.valuationSubring := - padicCyclotomicUnramified_padicExponentialValuationSubringEquivCompleteDVF p + padicCyclotomicUnramifiedPadicExponentialValuationSubringEquivCompleteDVF p let eTarget : W ≃+* target.valuationSubring := - padicCyclotomicUnramified_padicFiniteExtensionValuationSubringEquiv p L target + padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringEquiv p L target let : IsDiscreteValuationRing base.valuationSubring := base.valuationSubring_isDiscreteValuationRing let : IsDiscreteValuationRing target.valuationSubring := @@ -823,7 +835,8 @@ theorem padicCyclotomicUnramified_padic_isFiniteUnramified_prime_pow_sub_one (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) (target : ValuationTheory.DiscreteValuationField.CompleteDVF L) [hExt : - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.HasExtension + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension target.valuation] [IsIntegralClosure target.valuationSubring (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : @@ -866,13 +879,16 @@ theorem exists_padicCyclotomic_completeDVF_isFiniteUnramified_degree_eq (hζgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : ∃ target : ValuationTheory.DiscreteValuationField.CompleteDVF.{_, 0} L, ∃ hExt : - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.HasExtension + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension target.valuation, letI : - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.HasExtension + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension target.valuation := hExt IsIntegralClosure target.valuationSubring - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L ∧ + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuationSubring L ∧ ValuationTheory.DiscreteValuationField.ValuedExtension.IsFiniteUnramified (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).toDVF target.toDVF ∧ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index 556c19bb21..11280c4830 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. /-! # 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 +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 @@ -35,6 +36,8 @@ 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⸩ @@ -43,7 +46,7 @@ noncomputable local instance equalCharacteristicChangedCompletedBaseAlgebra private instance equalCharacteristicChangedCompletedBaseCharP (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] : + : CharP (equalCharacteristicCompletedUnramifiedField F.residueField) F.residueCharacteristic := charP_of_injective_algebraMap @@ -57,12 +60,15 @@ noncomputable local instance equalCharacteristicChangedCompletedBaseValuationIsN (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 @@ -108,7 +114,7 @@ def equalCharacteristicChangedCompletedLevelField (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField /-- The splitting field of the completed changed primitive polynomial is a field. -/ -instance equalCharacteristicChangedCompletedLevelField_field +instance equalCharacteristicChangedCompletedLevelFieldField (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : Field (equalCharacteristicChangedCompletedLevelField F u n) := by change Field @@ -116,7 +122,7 @@ instance equalCharacteristicChangedCompletedLevelField_field infer_instance /-- The changed completed level field is an algebra over the completed unramified field. -/ -noncomputable instance equalCharacteristicChangedCompletedLevelField_algebra +noncomputable instance equalCharacteristicChangedCompletedLevelFieldAlgebra (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicChangedCompletedLevelField F u n) := by @@ -126,7 +132,9 @@ noncomputable instance equalCharacteristicChangedCompletedLevelField_algebra section -local instance equalCharacteristicChangedCompletedLevelField_module +/-- 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) @@ -137,7 +145,7 @@ local instance equalCharacteristicChangedCompletedLevelField_module @Algebra.toModule (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicChangedCompletedLevelField F u n) _ _ - (equalCharacteristicChangedCompletedLevelField_algebra F u n) + (equalCharacteristicChangedCompletedLevelFieldAlgebra F u n) /-- The changed completed level field is finite-dimensional over its completed base. -/ instance equalCharacteristicChangedCompletedLevelField_finiteDimensionalInstance @@ -158,7 +166,7 @@ local instance equalCharacteristicChangedCompletedLevelField_isAlgebraic @Algebra.IsAlgebraic.of_finite (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicChangedCompletedLevelField F u n) _ _ _ - (equalCharacteristicChangedCompletedLevelField_algebra F u n) + (equalCharacteristicChangedCompletedLevelFieldAlgebra F u n) (equalCharacteristicChangedCompletedLevelField_finiteDimensionalInstance F u n) /-- The changed completed level field has the residue characteristic. -/ @@ -274,6 +282,8 @@ noncomputable def equalCharacteristicChangedCompletedLevelNormedField (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 @@ -317,6 +327,7 @@ noncomputable def equalCharacteristicChangedCompletedLevelValued 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 := @@ -425,7 +436,7 @@ theorem equalCharacteristicChangedCompletedLevelUniformizer_norm_lt_one private theorem equalCharacteristicChangedPiPolynomial_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) (x : A) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean index 89f1730dc0..45f9a3dec9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -11,7 +11,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. /-! # 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 +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 @@ -36,6 +37,8 @@ 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⸩ @@ -284,7 +287,7 @@ noncomputable def equalCharacteristicChangedCompletedUnitRoot private theorem equalCharacteristicChangedActionPiPolynomial_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) (x : A) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean index 8794d12f84..58c0f8e448 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean @@ -32,7 +32,7 @@ variable {K : Type u} [Field K] ambient field is the corresponding distinguished endomorphism. -/ theorem equalCharacteristicChangedPiPolynomial_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) (x : A) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean index cea8846401..a0197c5060 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean @@ -18,7 +18,8 @@ repeats the mechanical part of the Lubin--Tate construction with 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. +This is the changed-uniformizer algebra used in the proof of the completed theta-intertwining + theorem. -/ noncomputable section @@ -264,7 +265,8 @@ theorem equalCharacteristicChangedIntegralPrimitivePolynomial_map_constantCoeff equalCharacteristicChangedIntegralPiPolynomialIterate_map_constantCoeff, equalCharacteristicChangedIntegralUniformizer, ← pow_mul, Nat.mul_comm] -/-- The constant coefficient of the changed integral primitive polynomial is the changed uniformizer. -/ +/-- 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 = @@ -436,7 +438,8 @@ 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_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. -/ @@ -512,7 +515,7 @@ theorem equalCharacteristicChangedPrimitivePolynomial_separable /-- The changed primitive polynomial has a root in the separable closure. -/ theorem exists_equalCharacteristicChangedPrimitivePolynomial_root (F : LocalField.{u, v} K) (a : F.residueField⟦X⟧ˣ) - [CharP K F.residueCharacteristic] (n : ℕ) : + (n : ℕ) : ∃ x : SeparableClosure F.residueField⸨X⸩, ((equalCharacteristicChangedPrimitivePolynomial F a n).map (equalCharacteristicSeparableBaseHom F)).IsRoot x := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean index 12afaec63d..1fed14f9ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean @@ -26,12 +26,16 @@ 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⸩ @@ -49,7 +53,8 @@ local instance equalCharacteristicCompletedFrobeniusScalarTower (equalCharacteristicCompletedLevelField F n) := IsScalarTower.of_algebraMap_eq' rfl -/-- The completed theta-intertwining theorem completed lift fixes every element of the embedded Laurent +/-- The completed theta-intertwining theorem completed lift fixes every element of the embedded +Laurent base `k((T))`. -/ @[simp] theorem equalCharacteristicCompletedFrobeniusLiftEquiv_fixesLaurentBase @@ -71,7 +76,8 @@ theorem equalCharacteristicCompletedFrobeniusLiftEquiv_fixesLaurentBase (equalCharacteristicCompletedUnramifiedFrobenius F.residueField).commutes] rfl -/-- The prescribed the completed theta-intertwining theorem lift, regarded as an automorphism over the original +/-- 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean index b45d8a22ec..52fb39ebbe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean @@ -30,6 +30,8 @@ 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⸩ @@ -43,6 +45,7 @@ noncomputable local instance (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] : @@ -50,6 +53,8 @@ noncomputable local instance (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] : @@ -57,6 +62,8 @@ noncomputable local instance equalCharacteristicFrobeniusContinuityBaseNormedFie (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 : ℕ) : @@ -193,7 +200,8 @@ theorem equalCharacteristicCompletedFrobeniusLift_isometry Isometry (equalCharacteristicCompletedFrobeniusLiftEquiv F n u⁻¹) := equalCharacteristicCompletedFrobeniusLiftEquiv_isometry F n u⁻¹ -/-- The completed theta-intertwining theorem specialization is continuous for the standard completed-level +/-- The completed theta-intertwining theorem specialization is continuous for the standard +completed-level spectral-norm topology. -/ theorem equalCharacteristicCompletedFrobeniusLift_continuous (F : LocalField.{u, v} K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean index efd31b8377..80bc5d9f07 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean @@ -30,12 +30,16 @@ 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⸩ @@ -53,7 +57,8 @@ local instance equalCharacteristicCompletedFrobeniusFixedScalarTower (equalCharacteristicCompletedLevelField F n) := IsScalarTower.of_algebraMap_eq' rfl -/-- The cyclic subgroup generated by the completed theta-intertwining theorem completed Frobenius lift. -/ +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean index 26a45457ed..79b842276b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean @@ -25,12 +25,16 @@ 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⸩ @@ -54,7 +58,8 @@ noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldSubring Subring (equalCharacteristicCompletedLevelField F n) := (equalCharacteristicCompletedFrobeniusFixedField F a n).toSubring -/-- The canonical `k((T))`-algebra structure on the completed theta-intertwining theorem fixed field. -/ +/-- The canonical `k((T))`-algebra structure on the completed theta-intertwining theorem fixed +field. -/ @[reducible] noncomputable def equalCharacteristicCompletedFrobeniusFixedFieldAlgebra (F : LocalField K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean index b0f3dbd555..c60c61bb60 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean @@ -27,6 +27,8 @@ 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) : @@ -34,6 +36,8 @@ noncomputable local instance (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 : ℕ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean index ee491e5e9c..bd21923d1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. # 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`. +Together with the fixed-field generation theorem this gives the exact extension degree `(q - 1) + q^n`. -/ noncomputable section @@ -26,6 +27,8 @@ 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) : @@ -33,6 +36,8 @@ noncomputable local instance (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 : ℕ) : @@ -52,6 +57,8 @@ local instance (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) @@ -62,6 +69,8 @@ noncomputable local instance 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) @@ -72,6 +81,8 @@ noncomputable local instance @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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean index 8c9ba0c19a..87d0fff291 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean @@ -27,6 +27,8 @@ 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) : @@ -34,6 +36,8 @@ noncomputable local instance (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 : ℕ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean index 6c0a4a5c0f..1b420f4ac1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean @@ -26,6 +26,8 @@ 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean index b44d5f453d..446241669d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean @@ -29,6 +29,8 @@ 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) : @@ -72,7 +74,8 @@ private theorem simpa [equalCharacteristicCompletedLevelBaseHom] using equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isRoot_target F a n -/-- States the theorem `equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase`. -/ +/-- States the theorem +`equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase`. -/ theorem equalCharacteristicDirectThetaAtCompletedPrimitiveRoot_isIntegral_completedBase (F : LocalField.{u, v} K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean index 249ae6f545..cc78e45e58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean @@ -29,12 +29,16 @@ 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⸩ @@ -52,6 +56,8 @@ local instance equalCharacteristicCompletedFrobeniusFixedNormScalarTower (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) @@ -66,6 +72,8 @@ noncomputable local instance 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) @@ -77,6 +85,8 @@ noncomputable local instance (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) @@ -177,7 +187,8 @@ theorem equalCharacteristicCompletedFrobeniusPrimeElement_minpoly (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. -/ +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean index fdab725042..fed330ef47 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean @@ -30,6 +30,7 @@ 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⸩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean index a09f34287d..2400da5c17 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -47,7 +47,7 @@ noncomputable local instance equalCharacteristicCompletedLevelBaseAlgebra private instance equalCharacteristicCompletedLevelBaseCharP (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] : + : CharP (equalCharacteristicCompletedUnramifiedField F.residueField) F.residueCharacteristic := charP_of_injective_algebraMap @@ -95,6 +95,7 @@ noncomputable def equalCharacteristicCompletedBaseValuationRankOne (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 @@ -110,6 +111,8 @@ rank-one valuation. -/ 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 @@ -146,14 +149,14 @@ def equalCharacteristicCompletedLevelField (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField /-- The splitting field of the completed primitive polynomial is a field. -/ -instance equalCharacteristicCompletedLevelField_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 equalCharacteristicCompletedLevelField_algebra +noncomputable instance equalCharacteristicCompletedLevelFieldAlgebra (F : LocalField.{u, v} K) (n : ℕ) : Algebra (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicCompletedLevelField F n) := by @@ -161,6 +164,8 @@ noncomputable instance equalCharacteristicCompletedLevelField_algebra (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⸩ @@ -189,7 +194,9 @@ private instance equalCharacteristicCompletedLevelCharP section -local instance equalCharacteristicCompletedLevelField_module +/-- 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) @@ -200,7 +207,7 @@ local instance equalCharacteristicCompletedLevelField_module @Algebra.toModule (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicCompletedLevelField F n) _ _ - (equalCharacteristicCompletedLevelField_algebra F n) + (equalCharacteristicCompletedLevelFieldAlgebra F n) /-- The completed level field is finite-dimensional over its completed base. -/ instance equalCharacteristicCompletedLevelField_finiteDimensionalInstance @@ -222,7 +229,7 @@ instance equalCharacteristicCompletedLevelField_isAlgebraic @Algebra.IsAlgebraic.of_finite (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicCompletedLevelField F n) _ _ _ - (equalCharacteristicCompletedLevelField_algebra F n) + (equalCharacteristicCompletedLevelFieldAlgebra F n) (equalCharacteristicCompletedLevelField_finiteDimensionalInstance F n) /-- Comparison with the library splitting-field model. -/ @@ -320,6 +327,8 @@ theorem equalCharacteristicCompletedPrimitiveRoot_isRoot (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) := @@ -361,6 +370,8 @@ noncomputable local instance equalCharacteristicCompletedLevelCompleteSpaceInsta 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean index 6fc485a2c1..1b7c39d377 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. /-! # 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 +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean index 75b5579376..112910f365 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean @@ -32,6 +32,8 @@ 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⸩ @@ -195,7 +197,8 @@ theorem equalCharacteristicCompletedPrimitivePolynomial_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_monic F + n).irreducible_iff_irreducible_map_fraction_map.mp (equalCharacteristicCompletedIntegralPrimitivePolynomial_irreducible F n) rwa [equalCharacteristicCompletedIntegralPrimitivePolynomial_map] at hmap diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean index 315eef4826..3485f9e7d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean @@ -8,11 +8,13 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction /-! -# The completed theta-intertwining theorem: the formal standard bracket at a completed division point +# 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 +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))` @@ -52,18 +54,22 @@ noncomputable local instance equalCharacteristicDirectBracketBaseValuationIsNont (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) := @@ -79,6 +85,7 @@ noncomputable local instance equalCharacteristicDirectBracketLevelCompleteSpace 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean index a0dce58a23..051b5a2253 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean @@ -16,7 +16,8 @@ In the proof of the completed theta-intertwining theorem the standard Lubin--Tat 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 +`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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean index 4418613715..ab8185d885 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. # 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 +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))`. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean index 4a73b0f736..33b52b79f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel /-! -# The completed theta-intertwining theorem: the direct target level inside the completed source level +# 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, @@ -30,12 +31,15 @@ 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⸩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean index b686115202..bdcb53aa8c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -38,7 +38,7 @@ variable {K : Type u} [Field K] private instance equalCharacteristicDirectThetaCompletedBaseCharP (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] : + : CharP (equalCharacteristicCompletedUnramifiedField F.residueField) F.residueCharacteristic := charP_of_injective_algebraMap @@ -63,18 +63,21 @@ noncomputable local instance (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) := @@ -90,6 +93,7 @@ noncomputable local instance equalCharacteristicDirectThetaLevelCompleteSpace 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean index 26b08f4a9c..add8c0b904 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -46,6 +46,8 @@ private instance equalCharacteristicDirectThetaFixedLevelCharP (equalCharacteristicCompletedLevelField F n)).injective F.residueCharacteristic +/-- 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⸩ @@ -59,6 +61,7 @@ noncomputable local instance (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) : @@ -66,12 +69,14 @@ noncomputable local instance (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) := @@ -87,6 +92,7 @@ noncomputable local instance equalCharacteristicDirectThetaFixedLevelCompleteSpa 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 := @@ -128,7 +134,8 @@ private noncomputable local instance (Valued.integer (equalCharacteristicCompletedLevelField F n)) := (equalCharacteristicCompletedLevelCoefficientHom F n).toAlgebra -/-- Restriction of the completed theta-intertwining theorem Frobenius lift to the spectral valuation ring. -/ +/-- 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] @@ -238,7 +245,8 @@ private theorem equalCharacteristicCompletedIntegerFrobeniusLift_hasEval rw [hpow] simpa only [map_zero] using h -/-- Convergent evaluation is semilinear for the completed theta-intertwining theorem Frobenius lift. -/ +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean index 2774f0110d..f7dc7991e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -37,18 +37,21 @@ noncomputable local instance equalCharacteristicThetaAtLevelBaseValuationIsNontr (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) := @@ -64,6 +67,7 @@ noncomputable local instance equalCharacteristicThetaAtLevelCompleteSpace 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean index 792139c4a3..cbb8b8c5c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean @@ -190,6 +190,7 @@ 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) := @@ -205,6 +206,7 @@ noncomputable local instance equalCharacteristicThetaInverseLevelCompleteSpace 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean index 2a0ba6778b..a42a11b071 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean @@ -39,7 +39,7 @@ 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 Γ] [MulArchimedean Γ] + [LinearOrderedCommGroupWithZero Γ] [Valued L Γ] [Valuation.IsNontrivial (Valued.v : Valuation L Γ)] : letI := ValuativeRel.ofValuation (Valued.v : Valuation L Γ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean index e9595a26b6..9bcd292207 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean @@ -84,7 +84,6 @@ theorem equalCharacteristicLaurentRingEquiv_apply rfl /-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_C`. -/ -@[simp] theorem equalCharacteristicLaurentRingEquiv_algebraMap_C (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] @@ -116,7 +115,6 @@ theorem equalCharacteristicLaurentRingEquiv_algebraMap_C pi hpi a /-- States the theorem `equalCharacteristicLaurentRingEquiv_algebraMap_X`. -/ -@[simp] theorem equalCharacteristicLaurentRingEquiv_algebraMap_X (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean index 736252c252..a1d2421ec3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean @@ -35,7 +35,7 @@ variable {K : Type u} [Field K] private instance equalCharacteristicDivisionBaseCharP (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] : + : CharP F.residueField⸨X⸩ F.residueCharacteristic := charP_of_injective_algebraMap (algebraMap F.residueField F.residueField⸨X⸩).injective @@ -140,7 +140,7 @@ theorem equalCharacteristicLubinTatePrimitivePolynomial_natDegree distinguished endomorphism. -/ theorem equalCharacteristicLubinTatePiPolynomial_eval₂ (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] + {A : Type*} [Field A] [CharP A F.residueCharacteristic] (φ : F.residueField⸨X⸩ →+* A) (x : A) : Polynomial.eval₂ φ x (equalCharacteristicLubinTatePiPolynomial F) = @@ -329,7 +329,7 @@ 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) - [CharP K F.residueCharacteristic] + (n : ℕ) : ∃ x : SeparableClosure F.residueField⸨X⸩, ((equalCharacteristicLubinTatePrimitivePolynomial F n).map diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean index 5b083f39a5..96cb7d3a3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -11,7 +11,8 @@ import Mathlib.Algebra.Module.RingHom import Mathlib.Data.Fintype.EquivFin import Mathlib.LinearAlgebra.FreeModule.Basic /-! -# The primitive-division-module equivalence: equal-characteristic division points are free of rank one +# 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 @@ -43,7 +44,7 @@ structure equalCharacteristicLubinTateParameter coeff : Fin (n + 1) → F.residueField /-- A Lubin–Tate parameter evaluates to its finite coefficient function. -/ -instance equalCharacteristicLubinTateParameter_coeFun +instance equalCharacteristicLubinTateParameterCoeFun (F : LocalField.{u, v} K) (n : ℕ) : CoeFun (equalCharacteristicLubinTateParameter F n) (fun _ => Fin (n + 1) → F.residueField) := @@ -253,7 +254,7 @@ def equalCharacteristicLubinTateTruncatedRing /-- The commutative ring structure on the named truncated coefficient ring. -/ -instance equalCharacteristicLubinTateTruncatedRing_commRing +instance equalCharacteristicLubinTateTruncatedRingCommRing (F : LocalField.{u, v} K) (n : ℕ) : CommRing (equalCharacteristicLubinTateTruncatedRing F n) := by change CommRing @@ -352,6 +353,7 @@ noncomputable local instance equalCharacteristicLubinTateTruncatedSelfSMul (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) @@ -576,7 +578,8 @@ theorem equalCharacteristicLubinTatePrimitiveEvaluation_surjective rfl _ = x := ha -/-- The public the primitive-division-module equivalence equivalence: at positive division level `n + 1`, +/-- 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 @@ -605,7 +608,8 @@ theorem equalCharacteristicLubinTateFreeRankOneEquiv_apply_one equalCharacteristicLubinTatePrimitiveTorsionPoint F n exact one_smul _ _ -/-- In particular the division module of the primitive-division-module equivalence is genuinely free. The +/-- 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean index 7ab3d6ee14..ef09112093 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean @@ -316,7 +316,8 @@ theorem equalCharacteristicLubinTatePrimitivePolynomial_irreducible Irreducible ((equalCharacteristicLubinTateIntegralPrimitivePolynomial F n).map (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩)) := - (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F n).irreducible_iff_irreducible_map_fraction_map.mp + (equalCharacteristicLubinTateIntegralPrimitivePolynomial_monic F + n).irreducible_iff_irreducible_map_fraction_map.mp (equalCharacteristicLubinTateIntegralPrimitivePolynomial_irreducible F n) simpa [equalCharacteristicLubinTateIntegralPrimitivePolynomial_map] using hmap diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean index 6ae0c83fe4..56410f4a1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean @@ -331,7 +331,6 @@ theorem equalCharacteristicLubinTateAmbientBracket_succ_apply equalCharacteristicLubinTateAmbientPiIterate_succ] /-- The first ambient `π`-iterate is the ambient `π`-endomorphism. -/ -@[simp] theorem equalCharacteristicLubinTateAmbientPiIterate_one (F : LocalField.{u, v} K) {A : Type w} [Field A] [CharP A F.residueCharacteristic] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean index 114ed8d9ca..811c915ffa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean @@ -204,7 +204,6 @@ theorem equalCharacteristicLubinTateBracket_succ_apply equalCharacteristicLubinTatePiIterate_succ] /-- States the theorem `equalCharacteristicLubinTatePiIterate_one`. -/ -@[simp] theorem equalCharacteristicLubinTatePiIterate_one (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean index a06934cd3a..4368017a5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -58,7 +58,7 @@ private theorem addMonoidEnd_sum_apply private instance equalCharacteristicLaurentCharP (F : LocalField.{u, v} K) - [CharP K F.residueCharacteristic] : + : CharP F.residueField⸨X⸩ F.residueCharacteristic := charP_of_injective_algebraMap (algebraMap F.residueField F.residueField⸨X⸩).injective diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean index dc1a3db66b..ca01435459 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean @@ -8,15 +8,19 @@ import Mathlib.SetTheory.Cardinal.Finite import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius import Mathlib.RingTheory.PowerSeries.Basic /-! -# The equal-characteristic completed-unramified construction: equal-characteristic Frobenius on the completed unramified ring +# The equal-characteristic completed-unramified construction: equal-characteristic Frobenius on + the completed unramified ring For a finite field `k`, arithmetic Frobenius acts on `AlgebraicClosure k` by the `#k`-power map and hence coefficientwise on `(AlgebraicClosure k)[[T]]`. These definitions belong to the completed -maximal-unramified source used in the equal-characteristic completed-unramified construction; the theta construction of the equal-characteristic theta construction +maximal-unramified source used in the equal-characteristic completed-unramified construction; + the theta construction of the equal-characteristic theta construction depends on them, not conversely. -This is an equal-characteristic specialization of the general local-field construction, not a claim that Lemma the equal-characteristic completed-unramified construction is complete in general. +This is an equal-characteristic specialization of the general local-field construction, not a + claim that Lemma the equal-characteristic completed-unramified construction is complete in + general. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean index 3ab47b03ed..0d48ed0ac9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField import Mathlib.RingTheory.PowerSeries.Evaluation /-! -# The equal-characteristic completed-unramified construction: the completed maximal-unramified field in equal characteristic +# The equal-characteristic completed-unramified construction: the completed maximal-unramified + field in equal characteristic For a finite field `k`, the equal-characteristic model of the completion of the maximal unramified extension of `k((T))` is @@ -17,7 +18,8 @@ the maximal unramified extension of `k((T))` is coefficientwise arithmetic Frobenius over `k((T))`. This is the equal-characteristic specialization of the completed-unramified -source in the equal-characteristic completed-unramified construction. In particular, the Frobenius below is an actual algebra +source in the equal-characteristic completed-unramified construction. In particular, the + Frobenius below is an actual algebra equivalence; it is not a theorem-shaped replacement for later theta evaluation or norm-subgroup arguments. -/ @@ -103,6 +105,7 @@ noncomputable local instance valuedIntegerIsUniformAddGroupInstance valuedIntegerIsUniformAddGroup omit [Finite k] in +/-- The algebraic closure of the coefficient field carries the discrete uniformity. -/ noncomputable local instance equalCharacteristicCoefficientUniformSpace : UniformSpace (AlgebraicClosure k) := ⊥ @@ -146,13 +149,13 @@ def equalCharacteristicCompletedUnramifiedField := (AlgebraicClosure k)⸨X⸩ /-- The completed unramified Laurent-series model is a field. -/ -instance equalCharacteristicCompletedUnramifiedField_field : +instance equalCharacteristicCompletedUnramifiedFieldField : Field (equalCharacteristicCompletedUnramifiedField k) := by change Field ((AlgebraicClosure k)⸨X⸩) infer_instance /-- The completed unramified field carries its Laurent-series valuation. -/ -noncomputable instance equalCharacteristicCompletedUnramifiedField_valued : +noncomputable instance equalCharacteristicCompletedUnramifiedFieldValued : Valued (equalCharacteristicCompletedUnramifiedField k) ℤᵐ⁰ := by change Valued ((AlgebraicClosure k)⸨X⸩) ℤᵐ⁰ infer_instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean index de496eee66..4e5d157b15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -11,7 +11,8 @@ import Mathlib.FieldTheory.Galois.Profinite import Mathlib.LinearAlgebra.Basis.Basic import Mathlib.LinearAlgebra.Dimension.Free /-! -# The equal-characteristic completed-unramified construction: finite unramified coefficient extensions in equal characteristic +# 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 @@ -21,7 +22,8 @@ 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 +unramified field in the equal-characteristic completed-unramified construction. The + construction is coefficientwise and does not postulate an abstract unramified extension. -/ @@ -66,7 +68,6 @@ theorem laurentSeriesCoefficientMap_coeff rfl /-- The coefficient map sends a constant series to the mapped constant series. -/ -@[simp] theorem laurentSeriesCoefficientMap_C [Field k] [Field l] (f : k →+* l) (a : k) : laurentSeriesCoefficientMap f (HahnSeries.C (Γ := ℤ) a) = @@ -134,10 +135,13 @@ section FiniteBasis variable [Field k] [Field l] [Algebra k l] {ι : Type*} [Fintype ι] -private theorem laurentSeriesCoefficientBasis_linearIndependent +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] @@ -163,11 +167,14 @@ private theorem laurentSeriesCoefficientBasis_linearIndependent exact hb exact hrepr i -private theorem laurentSeriesCoefficientBasis_span +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] @@ -440,7 +447,7 @@ def equalCharacteristicFiniteUnramifiedExtension := (FiniteField.Extension k p n)⸨X⸩ /-- The finite unramified Laurent-series extension is a field. -/ -instance equalCharacteristicFiniteUnramifiedExtension_field : +instance equalCharacteristicFiniteUnramifiedExtensionField : Field (equalCharacteristicFiniteUnramifiedExtension k p n) := by change Field ((FiniteField.Extension k p n)⸨X⸩) infer_instance @@ -452,6 +459,8 @@ noncomputable instance equalCharacteristicFiniteUnramifiedAlgebra : 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean index 478698f64b..ed4de9fe7e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean @@ -7,7 +7,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra /-! -# LubinTate the explicit norm-subgroup computation: the standard level embedded in the higher-unit fixed field +# 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean index 836998c76d..3aedb4a012 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective /-! -# LubinTate the explicit norm-subgroup computation: the standard level is the higher-unit fixed field +# 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`. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean index 5b400dde69..49694e7f4f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed /-! -# LubinTate the explicit norm-subgroup computation: the standard level lies in the higher-unit fixed field +# LubinTate the explicit norm-subgroup computation: the standard level lies in the higher-unit + fixed field -/ noncomputable section @@ -21,12 +22,15 @@ 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⸩ @@ -40,7 +44,8 @@ local instance equalCharacteristicHigherUnitMembershipScalarTower (equalCharacteristicCompletedLevelField F n) := IsScalarTower.of_algebraMap_eq' rfl -/-- States the theorem `equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit`. -/ +/-- States the theorem +`equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit`. -/ theorem equalCharacteristicLubinTateLevelFieldToCompleted_mem_fixedField_of_mem_higherUnit (F : LocalField K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean index 451dbdcd16..846d0d29ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean @@ -7,7 +7,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree /-! -# LubinTate the explicit norm-subgroup computation: surjectivity of the higher-unit fixed-field embedding +# 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. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean index 84e32de05b..9b8911f30b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean @@ -26,13 +26,16 @@ 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`. -/ +/-- States the theorem +`equalCharacteristicCompletedFrobeniusAlgEquiv_primitiveRoot_fixed_of_mem_higherUnit`. -/ theorem equalCharacteristicCompletedFrobeniusAlgEquiv_primitiveRoot_fixed_of_mem_higherUnit (F : LocalField K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean index 8a5e1f072b..1f60c3f002 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms /-! -# LubinTate the explicit norm-subgroup computation: higher-unit Frobenius fixes the standard level map +# LubinTate the explicit norm-subgroup computation: higher-unit Frobenius fixes the standard + level map -/ noncomputable section @@ -42,12 +43,15 @@ private theorem ringHom_apply_eq_of_powerBasis 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⸩ @@ -157,7 +161,8 @@ private theorem higherUnitLevelMap_fixed_core F a n ha · exact higherUnitFrobeniusRingHom_levelMap_algebraMap F a n -/-- States the theorem `equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit`. -/ +/-- States the theorem +`equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit`. -/ theorem equalCharacteristicCompletedFrobeniusAlgEquiv_comp_levelFieldToCompleted_of_mem_higherUnit (F : LocalField K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean index 1f0e25710a..9712d317cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean @@ -155,7 +155,8 @@ theorem equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_fieldPrincipalUnit rw [equalCharacteristicLubinTateHigherUnitSubgroup_map_eq_principalUnits] rfl -private theorem equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_mem_higherUnitSubgroup +private theorem + equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_mem_higherUnitSubgroup (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) (u : F.residueField⟦X⟧ˣ) : @@ -221,9 +222,11 @@ private theorem equalCharacteristicLubinTateAmbientBracket_primitiveRoot_eq_iff_ (chosenEqualCharacteristicLubinTatePrimitiveRoot F n) (chosenEqualCharacteristicLubinTatePrimitiveRoot_torsion F n)) -/-- The `[u⁻¹]` action occurring in the completed theta-intertwining theorem fixes the standard primitive +/-- 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. -/ +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean index 186372ab4d..b1376969d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean @@ -11,7 +11,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic. /-! # 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 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean index 8e664b4b51..c576337fcd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean @@ -7,7 +7,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient /-! -# LubinTate the explicit norm-subgroup computation: canonical algebra and norm subgroup at a finite level +# 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 @@ -26,11 +27,14 @@ 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⸩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean index 23b2548cc9..007fa4c603 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean @@ -31,7 +31,7 @@ universe u private theorem inverse_mem_normSubgroup_of_normUnits_eq {B E : Type u} [Field B] [Field E] [Algebra B E] - [FiniteDimensional B E] (y : Eˣ) (pi : Bˣ) + (y : Eˣ) (pi : Bˣ) (hyNorm : LocalFieldTheory.normUnits B E y = pi) : pi⁻¹ ∈ LocalFieldTheory.localNormSubgroup B E := by have hyMem : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean index d625da3e16..4112a7814b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean @@ -74,7 +74,8 @@ theorem equalCharacteristicChangedLaurentUniformizerUnit_eq_unit_mul /-- 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. -/ +`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₀) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean index 5f0ea2062b..9c7788e8e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean @@ -435,7 +435,7 @@ private theorem equalCharacteristicLubinTateBracketInteger_addVal_eq_order at an index at most `n`. -/ theorem equalCharacteristicLubinTateUnitParameterSeries_sub_one_order_toNat_le (F : LocalField.{0, v} K₀) - [CharP K₀ F.residueCharacteristic] + (n : ℕ) (a : equalCharacteristicLubinTateUnitParameter F n) (hu : equalCharacteristicLubinTateUnitParameterSeries F n a - 1 ≠ 0) : (equalCharacteristicLubinTateUnitParameterSeries F n a - 1).order.toNat ≤ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean index 252a79c387..072357850e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean @@ -634,7 +634,8 @@ theorem equalCharacteristicLubinTateRealLowerRamificationGroup_natCard_pow_sub_o /-- 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 +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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index c04dcd0bb7..3c55ba0ac6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -514,7 +514,7 @@ chosen Laurent uniformizer. -/ theorem equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_isEisensteinAt (F : LocalField.{0, v} K₀) - [CharP K₀ F.residueCharacteristic] + (n : ℕ) : (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring F n).IsEisensteinAt @@ -613,7 +613,8 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) : - ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, 0, 0, y} + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, 0, + 0, y} (base := equalCharacteristicLubinTateBaseCompleteDVF F) (target := equalCharacteristicLubinTateLevelCompleteDVF F n) := by let : FiniteDimensional F.residueField⸨X⸩ @@ -626,7 +627,8 @@ theorem (ValuationTheory.DiscreteValuationField.ValuedExtension.hasUniqueValuationExtension_of_finite_separable (equalCharacteristicLubinTateBaseCompleteDVF F) (equalCharacteristicLubinTateLevelCompleteDVF F n) : - ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, 0, 0, y} + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, + 0, 0, y} (base := equalCharacteristicLubinTateBaseCompleteDVF F) (target := equalCharacteristicLubinTateLevelCompleteDVF F n)) @@ -644,7 +646,7 @@ theorem private theorem addVal_prod_valuationSubringAut {K₁ L₁ : Type} [Field K₁] [Field L₁] [Algebra K₁ L₁] - [FiniteDimensional K₁ L₁] [IsGalois K₁ L₁] + [FiniteDimensional K₁ L₁] (base : DVF.{0, 0} K₁) (target : DVF.{0, 0} L₁) [base.valuation.HasExtension target.valuation] (huniq : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean index 58d7d40559..787f5c994c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean @@ -31,6 +31,7 @@ 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) := ⊥ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean index b501b02235..68f0cc704b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -328,7 +328,8 @@ theorem equalCharacteristicCompletedSourceBracketCoefficient_succ_comparison map_sub, map_mul, map_pow, equalCharacteristicSourceUniformizer_map] using h -/-- The Lubin–Tate endomorphism commutation law: the independently constructed `[u]` commutes with the +/-- 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⟧ˣ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean index e900000ef9..be1f2accbe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean @@ -11,7 +11,8 @@ 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 +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)`. @@ -30,7 +31,8 @@ universe u v w namespace LubinTate namespace EqualCharacteristic -local instance (p : Prop) : Decidable p := Classical.propDecidable p +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean index d3cddad7ec..0433c0e6a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -213,7 +213,8 @@ theorem {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} + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{u, v, u, + 0, 0} (base := F.toCompleteDVF) (target := standardLubinTateChangedLevelCompositumCompleteDVF hπ u n) := by @@ -292,7 +293,6 @@ theorem standardLubinTateChangedLevelToCompositum_coe /-- The original primitive generator has the same ambient value after inclusion in the compositum. -/ -@[simp] theorem standardLubinTateLevelToChangedLevelCompositum_levelGenerator_coe {F : LocalField.{u, v} K} {π : F.valuationSubring} @@ -307,7 +307,6 @@ theorem /-- The changed primitive generator has the same ambient value after inclusion in the compositum. -/ -@[simp] theorem standardLubinTateChangedLevelToCompositum_levelGenerator_coe {F : LocalField.{u, v} K} {π : F.valuationSubring} diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean index af898fb4e9..f7294370d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean @@ -83,7 +83,6 @@ theorem standardLubinTatePolynomial_toPowerSeries /-- For a uniformizer, coercing the standard polynomial gives the underlying series of the bundled standard Lubin--Tate input. -/ -@[simp] theorem standardLubinTatePolynomial_toPowerSeries_eq_series {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean index 9fcc077b12..26076726a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean @@ -30,7 +30,8 @@ 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 + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroupClassInQuotient k (n + 1) /-- A represented finite parameter belongs to the `k`-th parameter subgroup @@ -44,7 +45,8 @@ theorem standardLubinTateUnitParameterClass_mem_subgroup_iff change QuotientGroup.mk' (higherPrincipalUnitGroup F.toCompleteDVF (n + 1)) u ∈ - (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubgroupClassInQuotient + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubgroupClassInQuotient k (n + 1) ↔ u ∈ higherPrincipalUnitGroup F.toCompleteDVF k exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean index 75522b4f00..fb7f8c3a74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean @@ -44,7 +44,7 @@ def standardLubinTateUnitParameter /-- The finite unit parameter quotient carries its canonical commutative group structure. -/ -instance standardLubinTateUnitParameter_commGroup +instance standardLubinTateUnitParameterCommGroup (F : LocalField.{u, v} K) (n : ℕ) : CommGroup (standardLubinTateUnitParameter F n) := by change CommGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean index 5760af1eb6..54138faa29 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -85,7 +85,6 @@ 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. -/ -@[simp] theorem standardLubinTateUnitParameterEquivGal_inv_class_apply_gen (F : LocalField.{u, v} K) {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean index c6d36884a5..95a4ff3b95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean @@ -32,7 +32,8 @@ 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} + ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{u, v, u, + 0, 0} (base := F.toCompleteDVF) (target := standardLubinTateLevelCompleteDVF hπ n) := by let : FiniteDimensional K (standardLubinTateLevelField hπ n) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean index 84ec87c18c..f8506b1e0a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean @@ -112,7 +112,8 @@ theorem standardLubinTatePrimitivePolynomialOverField_irreducible let : IsIntegrallyClosed F.valuationSubring := F.toCompleteDVF.toDVF.valuationSubring_isIntegrallyClosed exact - (standardLubinTatePrimitivePolynomial_monic F π n).irreducible_iff_irreducible_map_fraction_map.mp + (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean index fe66b3b7fd..dc104968d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean @@ -66,7 +66,8 @@ variable {K : Type u} [Field K] variable {F : LocalField.{u, v} K} {π : F.valuationSubring} variable {σ : Type w} [Fintype σ] -private theorem truncTotal_powerSeries_subst_eq_of_truncTotal_eq +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) @@ -74,6 +75,8 @@ private theorem truncTotal_powerSeries_subst_eq_of_truncTotal_eq {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' := @@ -102,12 +105,15 @@ private theorem truncTotal_powerSeries_subst_eq_of_truncTotal_eq (x := fun _ : Unit ↦ k) hH'subst.const (fun _ ↦ le_rfl)).symm -private theorem truncTotal_inVariables_subst_eq_of_truncTotal_eq +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 := @@ -127,6 +133,7 @@ private theorem truncTotal_inVariables_subst_eq_of_truncTotal_eq (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`. @@ -134,7 +141,7 @@ depends only on coefficients of the proposed intertwiner through total 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 +theorem coeff_defect_eq_of_coeff_eq_degree_le [Finite σ] (e ebar : LubinTateSeries F π) {H H' : MvPowerSeries σ F.valuationSubring} (hH : MvPowerSeries.constantCoeff H = 0) @@ -145,6 +152,8 @@ theorem coeff_defect_eq_of_coeff_eq_degree_le {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 @@ -400,12 +409,16 @@ private theorem linearInVariableStabilization_constantCoeff ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPowerSeries.coeff_zero_X, mul_zero] -private theorem linearInVariableStabilization_hasSubst +omit [Fintype σ] in +private theorem linearInVariableStabilization_hasSubst [Finite σ] (π : F.valuationSubring) : MvPowerSeries.HasSubst - (linearInVariableStabilization (σ := σ) π) := - MvPowerSeries.hasSubst_of_constantCoeff_zero - (linearInVariableStabilization_constantCoeff π) + (linearInVariableStabilization (σ := σ) π) := by + classical + let := Fintype.ofFinite σ + exact + MvPowerSeries.hasSubst_of_constantCoeff_zero + (linearInVariableStabilization_constantCoeff π) omit [Fintype σ] in private theorem one_le_order_inVariable_stabilization @@ -467,7 +480,8 @@ private theorem two_le_order_inVariable_sub_linearInVariableStabilization simp [inVariable, linearInVariableStabilization, PowerSeries.coeff_subst_single, hdi, hX] -private theorem degree_add_one_le_order_subst_monomial_sub_linear_stabilization +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 : ℕ) : ℕ∞) ≤ @@ -476,6 +490,8 @@ private theorem degree_add_one_le_order_subst_monomial_sub_linear_stabilization 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) - @@ -540,7 +556,8 @@ private theorem coeff_subst_linearInVariableStabilization_monomial · rw [MvPowerSeries.coeff_monomial_ne hqd, mul_zero, ite_eq_right hqd] -private theorem coeff_subst_inVariables_monomial_of_degree_le +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) : @@ -548,6 +565,8 @@ private theorem coeff_subst_inVariables_monomial_of_degree_le (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 @@ -571,7 +590,8 @@ private theorem coeff_subst_inVariables_monomial_of_degree_le rw [hcoeff, coeff_subst_linearInVariableStabilization_monomial] -private theorem coeff_subst_inVariables_add_monomial_of_degree_le +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) @@ -582,6 +602,8 @@ private theorem coeff_subst_inVariables_add_monomial_of_degree_le 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, @@ -755,7 +777,8 @@ private theorem coeff_subst_lubinTateSeries_add_monomial_of_degree_le π * (if q = d then c else 0) := by rw [LubinTateSeries.coeff_one_eq_uniformizer] -private theorem coeff_defect_add_monomial_eq_of_degree_le_constantCoeff +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) @@ -767,6 +790,8 @@ private theorem coeff_defect_add_monomial_eq_of_degree_le_constantCoeff if q = d then π * ((1 - π ^ (d.degree - 1)) * c) else 0 := by + classical + let := Fintype.ofFinite σ simp only [ defect, map_sub, @@ -822,7 +847,8 @@ private theorem linearForm_eq_sum_monomial_stabilization MvPowerSeries.monomial_mul_monomial] simp -private theorem coeff_defect_sum_linear_monomials_eq_zero +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) : @@ -831,6 +857,8 @@ private theorem coeff_defect_sum_linear_monomials_eq_zero (∑ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean index 3804c57c8c..cd2e36a0a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean @@ -262,11 +262,15 @@ private theorem linearInVariable_constantCoeff ← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPowerSeries.coeff_zero_X, mul_zero] -private theorem linearInVariable_hasSubst +omit [Fintype σ] in +private theorem linearInVariable_hasSubst [Finite σ] (π : F.valuationSubring) : - MvPowerSeries.HasSubst (linearInVariable (σ := σ) π) := - MvPowerSeries.hasSubst_of_constantCoeff_zero - (linearInVariable_constantCoeff π) + 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 @@ -319,7 +323,8 @@ private theorem two_le_order_inVariable_sub_linearInVariable PowerSeries.coeff_subst_single, hdi, MvPowerSeries.coeff_X, hsingle] -private theorem degree_add_one_le_order_subst_monomial_sub_linear +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 : ℕ) : ℕ∞) ≤ @@ -327,6 +332,8 @@ private theorem degree_add_one_le_order_subst_monomial_sub_linear (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) - @@ -380,13 +387,16 @@ private theorem coeff_subst_linearInVariable_monomial simp only [Finsupp.prod, Function.const_apply, Finset.prod_pow_eq_pow_sum, Finsupp.degree_apply] -private theorem coeff_subst_inVariables_monomial +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 : @@ -405,7 +415,8 @@ private theorem coeff_subst_inVariables_monomial rw [map_sub, sub_eq_zero] at hcoeff rw [hcoeff, coeff_subst_linearInVariable_monomial] -private theorem coeff_subst_inVariables_add_monomial +omit [Fintype σ] in +private theorem coeff_subst_inVariables_add_monomial [Finite σ] (ebar : LubinTateSeries F π) (H : MvPowerSeries σ F.valuationSubring) (d : σ →₀ ℕ) (c : F.valuationSubring) : @@ -415,6 +426,8 @@ private theorem coeff_subst_inVariables_add_monomial 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean index e95658a50a..2efa4d39ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean @@ -30,7 +30,7 @@ open LocalFieldTheory.DiscreteValuationField `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} [Finite σ] (f : MvPowerSeries σ 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 @@ -88,9 +88,10 @@ theorem map_subst_lubinTateSeries 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 +theorem map_subst_inVariables [Finite σ] (ebar : LubinTateSeries F π) (H : MvPowerSeries σ F.valuationSubring) : MvPowerSeries.map F.residueMap @@ -99,6 +100,8 @@ theorem map_subst_inVariables 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean index 758aa497c4..1fe776b418 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean @@ -270,7 +270,7 @@ theorem subst /-- Reindexing variables preserves the intertwining equation. -/ theorem reindex - [Fintype σ] [Fintype τ] + [Finite σ] [Finite τ] {e ebar : LubinTateSeries F π} {H : MvPowerSeries σ F.valuationSubring} (hH : Intertwines e ebar H) @@ -279,6 +279,9 @@ theorem reindex 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)) @@ -288,7 +291,7 @@ theorem reindex /-- One-variable power-series composition is a special case of substitution by an intertwining family. -/ theorem powerSeries_subst - [Fintype τ] + [Finite τ] {e ebar ehat : LubinTateSeries F π} {H : PowerSeries F.valuationSubring} (hH : Intertwines e ebar H) @@ -297,16 +300,20 @@ theorem powerSeries_subst (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 - [Fintype σ] + [Finite σ] (e ebar : LubinTateSeries F π) : Intertwines e ebar (0 : MvPowerSeries σ F.valuationSubring) := by + classical + let := Fintype.ofFinite σ rw [Intertwines] change MvPowerSeries.subst @@ -889,10 +896,12 @@ theorem standardLubinTateEndomorphismInVariable_hasLinearTerm /-- The reindexed series `[a](X_i)` remains an intertwiner. -/ theorem standardLubinTateEndomorphismInVariable_intertwines - {σ : Type w} [Fintype σ] + {σ : 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean index 176d74775b..3bed51b449 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean @@ -75,7 +75,6 @@ noncomputable def padicValuationSubringToCompletedUnramifiedWittRing /-- The canonical map from the valuation ring of `ℚ_[p]` sends its standard uniformizer to the Witt-vector prime. -/ -@[simp] theorem padicValuationSubringToCompletedUnramifiedWittRing_uniformizer (p : ℕ) [Fact p.Prime] : padicValuationSubringToCompletedUnramifiedWittRing p diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean index db5c930c45..24c200b4a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean @@ -11,7 +11,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.Multiplicative /-! # 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. +This module extends the multiplicative and changed-standard Lubin--Tate series to the completed +unramified Witt ring and records their coefficients and residue reductions. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean index 5efbe69cf6..1b222f9d80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -12,7 +12,8 @@ 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. +This module computes how a degreewise correction changes the semilinear substitution defect and + constructs the unique coefficient that kills that defect. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean index 3a71219863..e384850700 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniform /-! # Changed-uniformizer intertwiner construction -This module builds compatible finite-degree approximations, assembles the changed-uniformizer intertwiner, proves its functional equation, and establishes uniqueness. +This module builds compatible finite-degree approximations, assembles the changed-uniformizer + intertwiner, proves its functional equation, and establishes uniqueness. -/ noncomputable section @@ -151,7 +152,6 @@ theorem padicChangedUniformizerIntertwiner_constantCoeff simpa only [PowerSeries.coeff_zero_eq_constantCoeff_apply] using (padicChangedUniformizerApproximation p u 0).constantCoeff_eq_zero -@[simp] theorem padicChangedUniformizerIntertwiner_coeff_one (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) : @@ -289,7 +289,8 @@ private theorem padicChangedUniformizerDefect_coeff_one PowerSeries.coeff 1 (PowerSeries.subst P (padicCompletedChangedStandardSeries p u)) = - ((V : padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p)) * ε := by + ((V : padicCompletedUnramifiedWittRing p) * (p : padicCompletedUnramifiedWittRing p)) * + ε := by rw [padicCompletedChangedStandardSeries_eq, PowerSeries.subst_add hPsubst, PowerSeries.subst_mul hPsubst, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean index d59dc8887a..2a1c498186 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniform /-! # Changed-uniformizer scalar compatibility -This module proves that the changed-uniformizer intertwiner commutes with every scalar endomorphism and identifies its coefficientwise Frobenius twist. +This module proves that the changed-uniformizer intertwiner commutes with every scalar + endomorphism and identifies its coefficientwise Frobenius twist. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean index b71059a938..05d7cdbd7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean @@ -12,7 +12,9 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniform /-! # 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. +This module constructs the completed multiplicative and changed-standard scalar endomorphisms + and proves their linear terms, composition laws, Frobenius invariance, and substitution + commutation. -/ noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean index a7fbb098fb..714708c171 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean @@ -125,7 +125,7 @@ noncomputable instance (padicCompletedChangedUniformizerFixedField p u n) noncomputable instance - padicCompletedStandardChangedCompositum_changedFieldAlgebra + padicCompletedStandardChangedCompositumChangedFieldAlgebra (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : Algebra (padicCompletedChangedUniformizerFixedField p u n) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean index cb7f60d1e2..983a0c6708 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -455,7 +455,7 @@ noncomputable instance /-- The changed fixed field carries its canonical finite-extension spectral norm. -/ noncomputable instance - padicCompletedChangedUniformizerFixedField_nontriviallyNormedField + padicCompletedChangedUniformizerFixedFieldNontriviallyNormedField (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : NontriviallyNormedField @@ -466,7 +466,7 @@ noncomputable instance /-- The standard/changed compositum carries its canonical finite-extension spectral norm. -/ noncomputable instance - padicCompletedStandardChangedCompositum_nontriviallyNormedField + padicCompletedStandardChangedCompositumNontriviallyNormedField (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : NontriviallyNormedField @@ -477,7 +477,7 @@ noncomputable instance /-- The changed fixed field has the canonical valuative relation induced by its finite p-adic spectral norm. -/ noncomputable instance - padicCompletedChangedUniformizerFixedField_valuativeRel + padicCompletedChangedUniformizerFixedFieldValuativeRel (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : ValuativeRel @@ -488,7 +488,7 @@ noncomputable instance /-- The standard/changed compositum has the canonical valuative relation induced by its finite p-adic spectral norm. -/ noncomputable instance - padicCompletedStandardChangedCompositum_valuativeRel + padicCompletedStandardChangedCompositumValuativeRel (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean index c6963d24f5..2a42a2c3be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean @@ -378,6 +378,8 @@ theorem padicChangedUniformizerThetaValue_minpoly_padicBase 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] @@ -387,6 +389,7 @@ noncomputable local instance 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] @@ -396,6 +399,7 @@ noncomputable local instance @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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean index f1451210a7..6874cce29b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -147,14 +147,14 @@ def padicCompletedLevelField (padicCompletedPrimitivePolynomial p n).SplittingField @[reducible] -instance padicCompletedLevelField_field +instance padicCompletedLevelFieldField (p : ℕ) [Fact p.Prime] (n : ℕ) : Field (padicCompletedLevelField p n) := by change Field (padicCompletedPrimitivePolynomial p n).SplittingField infer_instance @[reducible] -noncomputable instance padicCompletedLevelField_algebra +noncomputable instance padicCompletedLevelFieldAlgebra (p : ℕ) [Fact p.Prime] (n : ℕ) : Algebra (padicCompletedUnramifiedField p) (padicCompletedLevelField p n) := by @@ -164,13 +164,14 @@ noncomputable instance padicCompletedLevelField_algebra section -local instance padicCompletedLevelField_module +/-- 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) - _ _ (padicCompletedLevelField_algebra p n) + _ _ (padicCompletedLevelFieldAlgebra p n) instance padicCompletedLevelField_finiteDimensional (p : ℕ) [Fact p.Prime] (n : ℕ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean index 63d12e516c..6779900cf6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean @@ -119,7 +119,6 @@ theorem padicCompletedLevelResidueFieldEquiv_apply /-- On integral representatives, the completed-level residue equivalence is the residue of the canonical valuation-ring inclusion. -/ -@[simp] theorem padicCompletedLevelResidueFieldEquiv_apply_residue (p : ℕ) [Fact p.Prime] (n : ℕ) (a : (padicCompletedUnramifiedCompleteDVF p).valuationSubring) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean index 03aa5fe867..99e8ebb234 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -229,7 +229,6 @@ noncomputable instance padicCompletedUnramifiedFieldAlgebra /-- The canonical field embedding agrees with the original Witt-ring map on p-adic integers. -/ -@[simp] theorem padicCompletedUnramifiedField_algebraMap_padicInt (p : ℕ) [Fact p.Prime] (z : ℤ_[p]) : algebraMap ℚ_[p] (padicCompletedUnramifiedField p) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean index d033b560ce..8941485a3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean @@ -62,7 +62,7 @@ noncomputable local instance /-- The completed Lubin--Tate level as an algebra over the original p-adic base field, through the completed unramified coefficient field. -/ -noncomputable instance padicCompletedLevelField_padicAlgebra +noncomputable instance padicCompletedLevelFieldPadicAlgebra (p : ℕ) [Fact p.Prime] (n : ℕ) : Algebra ℚ_[p] (padicCompletedLevelField p n) := ((algebraMap (padicCompletedUnramifiedField p) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean index 97bd112768..5d821222d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -23,7 +23,9 @@ 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 +by + the localization and decomposition comparison applies to the chosen global prime without an + extra compatibility hypothesis. -/ @@ -601,8 +603,10 @@ theorem globalPadicIdealInertiaToLocalizationInertia_injective 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 +/-- 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean index 284add77bf..4e005d8bf2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean @@ -66,7 +66,7 @@ residue-field separability. -/ theorem exponentialRamificationIndex_eq_ramificationIndex_of_valuationSubrings_eq {K : Type u} {L : Type w} [Field K] [Field L] - [Algebra K L] [FiniteDimensional K L] + [Algebra K L] {base : CompleteDVF.{u, v} K} {target : CompleteDVF.{w, x} L} [base.valuation.HasExtension target.valuation] (vK : LubinTate.Valuations.ExponentialValuation K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean index 4e6b02b24d..cacd51db36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean @@ -14,13 +14,14 @@ class field contains `L`. Since the public interface makes no global choice of ray class fields, the theorem asserts existence of this least modulus. -/ -open scoped Classical NumberField +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean index afa3eae86a..aaae306556 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean @@ -19,13 +19,14 @@ Reducing the modulus yields an embedding of ray class field realizations that intertwines their Artin maps. -/ -open scoped Classical NumberField +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) @@ -49,6 +50,7 @@ private theorem rayArtin_prime_eq_arithmeticPrimeArtin (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) : @@ -59,7 +61,8 @@ private theorem rayClassFieldRealization_norm_range (R.extension ≃ₐ[K] R.extension) := (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.trans R.artinEquiv - apply GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + apply + GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv m' e intro v hv have hvm : v ∉ m.finitePart.support := hv @@ -80,6 +83,7 @@ private theorem rayClassFieldRealization_norm_range (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean index 9ad651bcfb..0fffc007d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean @@ -13,7 +13,7 @@ upstairs exponents, each weighted by its inertia degree. This is the calculation needed when passing from ideals to norm-defined ray subgroups. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -22,6 +22,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean index 3d24660ad5..e6e6f68e95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean @@ -20,18 +20,22 @@ statement uses only Mathlib and public Definitions vocabulary; the idelic implementation appears only in the proof. -/ -open scoped Classical NumberField +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) @@ -55,6 +59,7 @@ private theorem rayArtin_prime_eq_arithmeticPrimeArtin (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] @@ -79,6 +84,7 @@ private theorem arithmeticPrimeArtin_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] @@ -135,6 +141,7 @@ private theorem rayClassGroup_hom_ext_of_prime 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean index f29ef82127..78287e4026 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean @@ -14,7 +14,7 @@ the ideal-theoretic ray class group. The realization is explicit, so this module does not depend on an implementation-level choice of field. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -22,6 +22,7 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean index 5ee785b8e9..60a250c21b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean @@ -16,7 +16,7 @@ isomorphism identifies complete splitting with triviality of the corresponding ray class. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -26,6 +26,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean index 5f05025b41..86dae2133e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean @@ -14,12 +14,13 @@ is the ideal-theoretic ray class group modulo `m`, compatibly with finite global reciprocity. No global choice of ray class field is exposed. -/ -open scoped Classical NumberField +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean index 5cea3da720..e0db0b1753 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean @@ -14,13 +14,14 @@ The kernel in prime-to-modulus ideals is the product of the genuine ideal norm image and the principal ray-ideal subgroup. -/ -open scoped Classical NumberField IsMulCommutative +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean index 190bfede8f..a8f324b18c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean @@ -17,7 +17,7 @@ The latter projection is directly surjective since both ray class groups are quotients of the same idèle class group. -/ -open scoped Classical NumberField +open scoped NumberField open NumberField IsDedekindDomain noncomputable section @@ -26,11 +26,15 @@ 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) @@ -86,6 +90,7 @@ private theorem rayClassGroup_hom_ext_of_prime 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean index c07f9dc1da..b4d671e647 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean @@ -16,13 +16,14 @@ The ideal norms are norms of fractional ideals prime to the modulus; the principal ray ideals are absorbed by the ray quotient. -/ -open scoped Classical NumberField IsMulCommutative +open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain noncomputable section namespace ClassFieldTheory +open scoped Classical 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean index aeab4ad266..848462b179 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean @@ -19,13 +19,14 @@ their finite abelian class fields. The embedding between arbitrary Frobenius-normalized realizations intertwines both Artin actions. -/ -open scoped Classical NumberField +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)} @@ -50,6 +51,7 @@ private theorem subgroupArtin_prime_eq_arithmeticPrimeArtin (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)} @@ -88,6 +90,7 @@ private theorem subgroupRealization_mem_norm_range_iff 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] @@ -112,6 +115,7 @@ private theorem arithmeticPrimeArtin_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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean index ea15e8c65a..1c89271f6f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean @@ -16,12 +16,13 @@ uses ideal classes; the proof transports the existing idelic reciprocity construction to that interface. -/ -open scoped Classical NumberField +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean index 20329f5e5a..eb5ab6f39a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean @@ -14,7 +14,7 @@ At a prime away from the modulus, complete splitting is equivalent to membership of the prime's ray class in the defining subgroup. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -24,6 +24,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean index bb42b8bb4d..a078aaccca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean @@ -20,7 +20,6 @@ namespace ClassFieldTheory universe u /-- A ray class maps to its original Artin value under the induced quotient isomorphism. -/ -@[simp] theorem rayClassSubgroupQuotientEquiv_mk (K : Type u) [Field K] [NumberField K] (m : RayClassModulus K) (H : Subgroup (RayClassGroup m)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean index 2a6b719c81..a44f2444e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean @@ -14,7 +14,7 @@ The local congruence condition makes the corresponding principal idèle integral-unit-valued at every finite prime in the modulus support. -/ -open scoped Classical NumberField +open scoped NumberField noncomputable section @@ -24,6 +24,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean index 0c320500df..813a2b122b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean @@ -40,7 +40,7 @@ theorem bigHilbertClassField_artinEquiv artin (narrowRayClassOfFinitePrime v) = arithmeticFrobeniusAt (K := K) w := by let g := - GlobalClassFieldComparison.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_of_isBig E hE + GlobalClassFieldComparison.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsBig E hE let artin : RayClassGroup (narrowRayClassModulus K) ≃* (E ≃ₐ[K] E) := (GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup K).trans g.symm refine ⟨artin, ?_⟩ @@ -60,7 +60,8 @@ theorem bigHilbertClassField_artinEquiv _ = g (arithmeticFrobeniusAt (K := K) w) := by rw [← GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt (K := K) (L := E) v w hw hunram] - exact (GlobalClassFieldComparison.arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_prime + 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 index 54efc06f95..ef9e2c1bfd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean @@ -32,7 +32,8 @@ theorem bigHilbertClassField_degree_eq_narrowClassGroup_card 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 + GlobalClassFieldComparison.bigHilbertClassField_degree_eq_narrowClassGroup_card_of_isBig K + E hE _ = Nat.card (RayClassGroup (narrowRayClassModulus K)) := (Nat.card_congr (GlobalClassFieldComparison.narrowRayClassGroupEquivNarrowClassGroup K).toEquiv).symm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean index f6e1539536..606a244fd4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean @@ -17,13 +17,14 @@ when its narrow ideal class is trivial. Real-place ramification does not affect this finite-prime criterion. -/ -open scoped Classical NumberField +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean index b55e411b36..5609470c85 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean @@ -16,13 +16,14 @@ A finite prime splits completely in the big Hilbert class field exactly when its fractional ideal has a totally positive generator. -/ -open scoped Classical NumberField +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean index fbdef73b57..7b3ea58f72 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean @@ -40,7 +40,7 @@ theorem smallHilbertClassField_artinEquiv artin (ordinaryRayClassOfFinitePrime v) = arithmeticFrobeniusAt (K := K) w := by let g := - SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_of_isSmall E hE + SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE let artin : RayClassGroup (ordinaryRayClassModulus K) ≃* (E ≃ₐ[K] E) := (ordinaryRayClassGroupEquivClassGroup (K := K)).trans g.symm refine ⟨artin, ?_⟩ @@ -59,7 +59,8 @@ theorem smallHilbertClassField_artinEquiv _ = g (arithmeticFrobeniusAt (K := K) w) := by rw [← GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt (K := K) (L := E) v w hw hunram] - exact (SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime + exact + (SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime E hE v).symm end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean index 53d2ef1de3..c4bd7087ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean @@ -34,7 +34,8 @@ theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal FinitePrimeSplitsCompletely K E v ↔ finitePrimeFractionalIdeal v ∈ (toPrincipalIdeal (𝓞 K) K).range := by - exact GlobalClassFieldComparison.finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal_of_isSmall + exact + GlobalClassFieldComparison.finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal_of_isSmall K E hE v end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean index 7c5f53e9ac..d40743336b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean @@ -20,7 +20,6 @@ namespace ClassFieldTheory universe u v /-- The quotient isomorphism evaluates to the original Artin map. -/ -@[simp] theorem finiteAbelianReciprocityQuotientEquiv_mk (K : Type u) (L : Type v) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean index 6d0bb33f34..f85cf75425 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -36,7 +36,7 @@ of any ray-class Artin map. -/ theorem exists_finitePlaceCompletionLocalArtin (K L : Type) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] (v : HeightOneSpectrum (𝓞 K)) : let vK := NumberField.HeightOneSpectrum.adicAbv K v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean index 754a7e485e..4dd911cd5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -26,11 +26,11 @@ universe u v decreasing filtration of its canonical decomposition group. -/ theorem realLowerRamificationGroup_canonical_antitone (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)] : Antitone (ClassFieldTheory.realLowerRamificationGroup K (ValuativeRel.valuation L).valuationSubring) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean index a0d2f39652..71aee566cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean @@ -37,7 +37,8 @@ theorem upperRamificationGroup_eventually_bot 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 + exact ((LocalFieldTheory.chosenLocalExtensionCompleteDVF K + L).toDVF).valuationSubring_isNoetherianRing obtain ⟨N, hN⟩ := lowerRamificationGroup_eventually_bot K A refine ⟨herbrandFunction K A (N : ℝ), ?_⟩ intro t ht diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean index a54d2cbc04..c4ebeec652 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean @@ -31,7 +31,7 @@ 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] [IsAbelianGalois K L] + [FiniteDimensional K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (artin : Kˣ →ₜ* (L ≃ₐ[K] L)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean index b4efca9d22..b8208de0db 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean @@ -48,11 +48,11 @@ theorem completionTensorNormDecomposition Algebra.norm vK.Completion (e z w) := by classical refine ⟨ - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + 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.completionTensorDecomposition_left + AlgebraicNumberTheory.Valuations.completionTensorDecompositionLeft (K := K) (L := L) vK hvK, ?_⟩ intro z diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean index b940ad8ae3..cf422d2fd9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean @@ -54,11 +54,11 @@ theorem completionTensorNormDecomposition_canonical Algebra.norm vK.Completion (e z w) := by classical refine ⟨ - AlgebraicNumberTheory.Valuations.completionTensorDecomposition_extensionFintype + 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.completionTensorDecomposition_left + AlgebraicNumberTheory.Valuations.completionTensorDecompositionLeft (K := K) (L := L) vK hvK, ?_, ?_⟩ · intro b a w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean index e6afae61c1..5c3b265725 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean @@ -28,7 +28,7 @@ universe u v theorem isNormAtInfinitePlace_of_complex (K : Type u) (L : Type v) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] (v : InfinitePlace K) (hv : v.IsComplex) (x : Kˣ) : IsNormAtInfinitePlace K L v x := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean index 92a34e0764..7d3fae8864 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean @@ -27,7 +27,7 @@ universe u v theorem globalNorm_isEverywhereLocalNorm (K : Type u) (L : Type v) [Field K] [NumberField K] - [Field L] [NumberField L] [Algebra K L] + [Field L] [Algebra K L] [FiniteDimensional K L] (x : Kˣ) : IsFieldNorm K L x → IsEverywhereLocalNorm K L x := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean index a712c12461..5c64939409 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean @@ -27,7 +27,7 @@ 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] [Nontrivial A] + [CommRing A] [Algebra K A] (y : L) : Algebra.norm A (Algebra.TensorProduct.includeRight (R := K) (A := A) (B := L) y) = diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean index 52853307f8..13e8a52472 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -47,7 +47,7 @@ private theorem isCyclic_of_forall_mem_zpowers {G : Type} [Group G] (g : G) /-- 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 cyclic_H1_iso_HminusOne {k G : Type} [CommRing k] [Group G] +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 @@ -62,7 +62,7 @@ noncomputable def unitsH1IsoTateHminusOne (K L : Type) [Field K] [Field L] (hg : ∀ x : Gal(L / K), x ∈ Subgroup.zpowers g) : groupCohomology.H1 (Rep.ofAlgebraAutOnUnits K L) ≅ tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1) := - cyclic_H1_iso_HminusOne (Rep.ofAlgebraAutOnUnits K L) g hg + 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean index 74a4ce074e..1e4638bf29 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean @@ -95,7 +95,7 @@ omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] 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] [Finite X] (f : X →* Y) : + {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] @@ -120,7 +120,7 @@ omit [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] /-- 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] [Finite X] {H K : Subgroup X} (hHK : H ≤ K) : + {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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean index 26bf74b145..ba726587e0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean @@ -144,7 +144,9 @@ variable {ι : Type uι} (A : ι → Type uA) variable [∀ i, CommGroup (A i)] variable [∀ i, MulDistribMulAction G (A i)] -local instance : +/-- The componentwise multiplicative action on a dependent product distributes over +multiplication. -/ +local instance fixedPiMulDistribMulAction : MulDistribMulAction G (∀ i, A i) := piMulDistribMulAction G A diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean index 2bc0bc2b21..9c1502e9dd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean @@ -173,6 +173,11 @@ private def fixedCyclesAddEquiv : 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 : @@ -283,6 +288,10 @@ private def normKernelCyclesAddEquiv : 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 + private noncomputable def tateHMinusOneIsoHerbrandHMinusOne_of_commGroup {G A : Type} [CommGroup G] [Fintype G] [CommGroup A] [MulDistribMulAction G A] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean index eb4f903493..e9fd0cbb5a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -318,10 +318,13 @@ 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 (H : Subgroup G) (σ : G) +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' @@ -356,10 +359,13 @@ 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 (H : Subgroup G) (σ : G) +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 @@ -507,7 +513,6 @@ theorem inducedCoordinateProduct_apply (σ : G) /-- The first-coordinate section is a right inverse to the transversal product. -/ -@[simp] theorem inducedCoordinateProduct_section (σ : G) (hgen : ∀ x : G, x ∈ Subgroup.zpowers σ) (b : B) : inducedCoordinateProduct H σ hgen @@ -540,7 +545,8 @@ section InducedHerbrandH0 variable [CommGroup G] [Fintype G] [CommGroup B] variable (H : Subgroup G) [MulDistribMulAction H B] -local instance : Fintype H := Fintype.ofFinite H +/-- 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)`. -/ @@ -704,7 +710,8 @@ section InducedHerbrandHMinusOne variable [CommGroup G] [Fintype G] [CommGroup B] variable (H : Subgroup G) [MulDistribMulAction H B] -local instance : Fintype H := Fintype.ofFinite H +/-- A subgroup of a finite group is equipped with its finite enumeration. -/ +local instance inducedCoordinatesSubgroupFintype : Fintype H := Fintype.ofFinite H local instance : NeZero H.index := ⟨by rw [H.index_eq_card] @@ -1126,12 +1133,15 @@ theorem subgroupGeneratorOfGenerator_coe (σ : G) σ ^ H.index := rfl +omit [Fintype G] in /-- The derived element `σ^[G:H]` generates `H`. -/ -theorem subgroupGeneratorOfGenerator_generates (σ : G) +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τ : diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index 30bcde87f1..d0ca95fe86 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -343,7 +343,8 @@ theorem exists_chosenBaseUniformizerPowSubmodule_le_of_fg_of_field_span_eq_top 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 +/-- 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`. @@ -535,7 +536,8 @@ 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. -/ +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) @@ -690,7 +692,8 @@ 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 +`𝒪[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 @@ -985,7 +988,8 @@ theorem chosenBaseUniformizerPowSubmodule_add_le_chosenBaseUniformizerPowSubmodu 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 chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule +theorem + chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule {N : Submodule 𝒪[K] L} {b : Nat} (hb : chosenBaseUniformizerPowSubmodule K L b N ≤ integerRingFieldSubmodule K L) : chosenBaseUniformizerPowSubmodule K L (b + 1) N ≤ @@ -1034,7 +1038,8 @@ theorem exists_chosenBaseUniformizerPowSubmodule_le_maximalIdealFieldSubmodule_o (K := K) (L := L) hb⟩ /-- Some uniformizer-power normal-basis lattice lies inside the maximal-ideal field submodule. -/ -theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule +theorem + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule [TopologicalSpace L] [IsNonarchimedeanLocalField L] : ∃ n : Nat, chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) ≤ @@ -1044,7 +1049,8 @@ theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maxim /-- A sufficiently deep normal-basis lattice lies in the maximal ideal and is multiplicatively closed. -/ -theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_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) ≤ @@ -1055,7 +1061,8 @@ theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maxim y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) → x * y ∈ chosenBaseUniformizerPowSubmodule K L n (chosenNormalBasisIntegerLattice K L) := by - rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule (K := K) (L := L) with ⟨d, hd⟩ rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mul_mul_mem_self @@ -1157,7 +1164,8 @@ theorem exists_chosenNormalBasisPrincipalUnitSet_mul_closed_le_principalUnits_on 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 + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed (K := K) (L := L) with ⟨c, hc⟩ refine ⟨c, ?_⟩ @@ -1275,7 +1283,8 @@ theorem exists_chosenNormalBasisPrincipalUnitSet_neg_sub_one_pow_succ_tendsto_ze Tendsto (fun d : Nat => (-(((u : 𝒪[L]ˣ) : 𝒪[L]) - 1)) ^ (d + 1)) atTop (nhds (0 : 𝒪[L])) := by - rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule (K := K) (L := L) with ⟨c, hc⟩ refine ⟨c, ?_⟩ @@ -1389,7 +1398,8 @@ theorem exists_chosenNormalBasisPrincipalUnitSet_inverseCorrection_tendsto_inv_s inverseCorrectionPartialSum (L := L) ((((u : 𝒪[L]ˣ) : 𝒪[L]) - 1 : 𝒪[L]) : L) d) atTop (nhds (((((u⁻¹ : 𝒪[L]ˣ) : 𝒪[L]) : L) - 1))) := by - rcases exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdealFieldSubmodule (K := K) (L := L) with ⟨c, hc⟩ refine ⟨c, ?_⟩ @@ -1461,7 +1471,8 @@ theorem exists_chosenNormalBasisPrincipalUnitSet_inv_mem_of_closed (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 + rcases + exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_le_maximalIdeal_and_mul_closed (K := K) (L := L) with ⟨c, hc⟩ refine ⟨c, ?_⟩ @@ -1523,7 +1534,8 @@ theorem exists_chosenBaseUniformizerPow_chosenNormalBasisIntegerLattice_mem_nhds ∃ 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 + rcases + exists_chosenBaseUniformizerPow_integerRingFieldSubmodule_le_chosenNormalBasisIntegerLattice (K := K) (L := L) with ⟨a, ha⟩ refine ⟨a, ?_⟩ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean index 60009e8dec..871cebaf9f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean @@ -666,10 +666,11 @@ theorem permutationSublatticeBasis_permuted 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 +theorem exists_complete_permutationSublattice [Finite G] (ρ : G →* Equiv.Perm ι) (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] [IsZLattice ℝ L] @@ -684,6 +685,9 @@ theorem exists_complete_permutationSublattice 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, @@ -699,7 +703,8 @@ variable [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] omit [Fintype G] in -theorem basisEquivFunL_symm_coordinatePermutation +omit [DecidableEq ι] [Fintype ι] in +theorem basisEquivFunL_symm_coordinatePermutation [Finite ι] (b : Basis ι ℝ E) (ρ : G →* Equiv.Perm ι) (α : G →* (E ≃ₗ[ℝ] E)) @@ -709,6 +714,9 @@ theorem basisEquivFunL_symm_coordinatePermutation 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 = @@ -735,11 +743,12 @@ theorem basisEquivFunL_symm_coordinatePermutation 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 +theorem exists_complete_permutationSublattice_of_basis [Finite G] [Finite ι] (b : Basis ι ℝ E) (ρ : G →* Equiv.Perm ι) (α : G →* (E ≃ₗ[ℝ] E)) @@ -757,6 +766,10 @@ theorem exists_complete_permutationSublattice_of_basis ∀ (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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index e0c0edff8a..1f4a84ea1b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -62,9 +62,10 @@ 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 +theorem basisEquivFun_symm_intCoordinatePermutation [Finite ι] (b : Basis ι ℤ M) (ρ : G →* Equiv.Perm ι) (α : G →* (M ≃ₗ[ℤ] M)) @@ -74,6 +75,9 @@ theorem basisEquivFun_symm_intCoordinatePermutation 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 = @@ -276,7 +280,7 @@ permutation representation. -/ def completePermutationLatticeDistribMulAction (ρ : G →* Equiv.Perm ι) (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] - [IsZLattice ℝ L] + (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → permutationRepresentation ρ g x ∈ L) : DistribMulAction G L where diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean index 943dfdcc88..c9a51d3b9c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -858,9 +858,10 @@ theorem permutationFunctionOrbitEquiv_equivariant : 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 +theorem permutationFunctionHerbrandH0Finite [Finite ι] (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : @@ -869,6 +870,8 @@ theorem permutationFunctionHerbrandH0Finite permutationFunctionMulDistribMulAction Finite (HerbrandH0 G (ι → Multiplicative ℤ)) := by + classical + let := Fintype.ofFinite ι let functionAction : MulDistribMulAction G (ι → Multiplicative ℤ) := permutationFunctionMulDistribMulAction @@ -936,9 +939,10 @@ theorem permutationFunctionHerbrandH0Finite 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 +theorem permutationFunctionHerbrandHMinusOneFinite [Finite ι] (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : @@ -948,6 +952,8 @@ theorem permutationFunctionHerbrandHMinusOneFinite Finite (HerbrandHMinusOne G (ι → Multiplicative ℤ) σ) := by + classical + let := Fintype.ofFinite ι let functionAction : MulDistribMulAction G (ι → Multiplicative ℤ) := permutationFunctionMulDistribMulAction @@ -1015,10 +1021,12 @@ theorem permutationFunctionHerbrandHMinusOneFinite herbrandHMinusOneFinite_of_equivariantMulEquiv e.symm (mulEquiv_symm_commutes_smul e he) σ -/-- Canonical orbit form of the permutation-lattice Herbrand quotient formula: the Herbrand quotient of the +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 +theorem permutationFunction_herbrandQuotient_eq_stabilizerProduct [Finite ι] (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) : @@ -1047,6 +1055,8 @@ theorem permutationFunction_herbrandQuotient_eq_stabilizerProduct ∏ ω : MulAction.orbitRel.Quotient G ι, (Fintype.card (permutationOrbitStabilizer ω) : ℚ) := by + classical + let := Fintype.ofFinite ι let functionAction : MulDistribMulAction G (ι → Multiplicative ℤ) := permutationFunctionMulDistribMulAction @@ -1245,7 +1255,6 @@ def stableQuotientMulDistribMulAction (fun _ hx ↦ hstable g _ hx)) q r -@[simp] theorem stableQuotient_smul_mk (B : Subgroup A) (hstable : ∀ (g : G) (x : A), diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean index e1b8cde177..ff3c0f87c7 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean @@ -5,7 +5,8 @@ Authors: n-yamaguchi-0729 -/ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -/-! Provides the public declarations in the `CyclicCohomology.Herbrand.PrincipalUnits.QuotientReps` Lean module. -/ +/-! Provides the public declarations in the + `CyclicCohomology.Herbrand.PrincipalUnits.QuotientReps` Lean module. -/ namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean index c10ac7cc9a..e6fbe83b41 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDeg import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -/-! Provides the public declarations in the `CyclicCohomology.Herbrand.PrincipalUnits.QuotientTower` Lean module. -/ +/-! Provides the public declarations in the + `CyclicCohomology.Herbrand.PrincipalUnits.QuotientTower` Lean module. -/ namespace CyclicCohomology @@ -550,7 +551,7 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandQuotient_eq_one_of_isNonarc [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)) + [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) := diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean index b413abf909..9230684fce 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean @@ -29,7 +29,9 @@ variable (A : ι → Type uA) variable [∀ i, CommGroup (A i)] variable [∀ i, MulDistribMulAction G (A i)] -local instance : +/-- The componentwise multiplicative action on a dependent product distributes over +multiplication. -/ +local instance herbrandPiMulDistribMulAction : MulDistribMulAction G (∀ i, A i) := piMulDistribMulAction G A diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean index 8770ee999d..d7787df3a1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean @@ -15,8 +15,10 @@ 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. +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 @@ -75,12 +77,14 @@ def IsContinuousDiscreteRepresentation {G : Type} [Group G] [TopologicalSpace G] 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 +/-- **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 +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. -/ @@ -115,7 +119,8 @@ noncomputable def finiteCyclicH1IsoTateHMinusOne {G : Type} [Group G] [Fintype G (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 +/-- 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. -/ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean index aa72d56efb..f75eaf7b44 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -326,7 +326,6 @@ theorem linearization_single (g : G) (n : ℤ) : n • Additive.ofMul (Abelianization.of g) := by simp [linearization, coefficientToAbelianization] -@[simp] theorem linearization_deltaElement (g : G) : linearization G (deltaElement G g) = Additive.ofMul (Abelianization.of g) := by diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean index 7d607c7eb9..c66e7d9219 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean @@ -42,7 +42,6 @@ noncomputable def subgroupQuotientEquivQuotientOfSupEqTop rw [hSP] exact Subgroup.mem_top x) -@[simp] theorem subgroupQuotientEquivQuotientOfSupEqTop_mk (S P : Subgroup G) (hSP : S ⊔ P = ⊤) @@ -109,7 +108,6 @@ noncomputable def quotientSupCommutatorEquivMapAbelianization (QuotientGroup.quotientMulEquivOfEq hphiKer.symm).trans (QuotientGroup.quotientKerEquivOfSurjective phi hphiSurjective) -@[simp] theorem quotientSupCommutatorEquivMapAbelianization_mk (H : Subgroup Gamma) (g : Gamma) : H.quotientSupCommutatorEquivMapAbelianization diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean index 80406e950a..1627793cd3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -304,7 +304,6 @@ theorem transversalLinearization_single /-- On the embedded subgroup ideal, transversal linearization is the ordinary abelianization linearization. -/ -@[simp] theorem transversalLinearization_embeddedDelta (H : Subgroup G) (T : H.LeftTransversal) (h : H) : transversalLinearization H T (embeddedDelta H h) = @@ -589,7 +588,8 @@ theorem relativeDeltaAbelianizationEquiv_of Multiplicative.ofAdd (relativeDeltaClass H h) := rfl -/-- The lower horizontal map in the relative augmentation construction, obtained from transfer through +/-- 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] : @@ -622,7 +622,6 @@ theorem augmentationTransfer_deltaAbelianization ← deltaAbelianizationEquiv_apply G a, MulEquiv.symm_apply_apply] -@[simp] theorem augmentationTransfer_deltaClass (H : Subgroup G) [H.FiniteIndex] (g : G) : augmentationTransfer H diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 34c9bba8d5..47070f6d39 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -190,7 +190,7 @@ 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] [DecidableEq X] + {X : Type*} [Fintype X] (φ : FreeGroup X →* G) (w : FreeGroup X) : ∃ μ : X → IntegralGroupRing G, groupRingDelta (φ w) = @@ -199,6 +199,8 @@ theorem exists_rightFoxExpansion ∀ 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, ?_, ?_⟩ @@ -309,11 +311,13 @@ theorem presentationLinearMap_apply /-- Finite abelianization makes the relation lattice of a finite free presentation have full rank. -/ theorem presentationKernel_finrank_eq - {X : Type*} [Fintype X] + {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 φ @@ -992,7 +996,7 @@ end Presentation /-- The norm element of a finite group. -/ def groupNormElement - (Q : Type*) [Group Q] [Finite Q] : + (Q : Type*) [Finite Q] : IntegralGroupRing Q := letI := Fintype.ofFinite Q ∑ q : Q, MonoidAlgebra.single q 1 @@ -1025,12 +1029,14 @@ theorem abelianizationRingMap_transversalNormElement /-- 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] [Fintype Q] + {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 => @@ -1121,12 +1127,16 @@ theorem exists_unit_foxDeterminantLift_eq_smul_section_norm : rw [hu, map_zsmul] include hφ in -theorem generator_mul_section_norm_mem_mixed +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φ @@ -1171,12 +1181,16 @@ theorem generator_mul_section_norm_mem_mixed exact hmTwice include hφ in -theorem word_mul_section_norm_mem_mixed +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)) @@ -1208,21 +1222,29 @@ theorem word_mul_section_norm_mem_mixed hu include hφ in -theorem delta_mul_section_norm_mem_mixed +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 -theorem delta_mul_transversalNormElement_mem_mixed +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)) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean index 242c274d3f..39e3052373 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean @@ -38,7 +38,6 @@ theorem mem_extensionSubgroup_iff /-- The quotient action on an invariant subtype is the original ambient action after choosing a representative in `G_K`. -/ -@[simp] theorem extensionFixedRepresentation_quotient_mk_apply_val (A : Rep ℤ G) (K M : ClosedSubgroup G) (hMK : M.toSubgroup ≤ K.toSubgroup) @@ -103,7 +102,7 @@ theorem extensionFixedEndomorphism_fixed_val subgroups intersect in `G_L`. The generation conclusion is derived from the radicals' stabilizers; it is not an input. -/ theorem closedSetFixingSubgroup_range_extensionFixed_eq - [IsTopologicalGroup G] + (A : Rep ℤ G) (hcontinuous : IsContinuousDiscreteRepresentation A) (K L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.toSubgroup) {iota : Type*} diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean index fbb19936dd..96508ae155 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -13,7 +13,8 @@ namespace KummerTheory open CyclicCohomology /-! -# finite abelian Kummer theory, the finite abelian Kummer decomposition: cyclic factors of a finite abelian extension +# 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. diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean index e22ef897d2..ce3f61d5b2 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean @@ -13,7 +13,8 @@ namespace KummerTheory open CyclicCohomology /-! -# finite abelian Kummer theory, the finite abelian Kummer decomposition: the cyclic abstract-operator step +# 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 @@ -148,7 +149,8 @@ theorem cyclic_single_radical_of_tateHMinusOne_isZero subst q exact Subgroup.one_mem _ -/-- Finite-cyclic, single-radical frontier of finite abelian Kummer theory, the finite abelian Kummer decomposition, +/-- 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean index 5b8ce7f5e5..5adc49ca33 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean @@ -12,7 +12,8 @@ namespace KummerTheory open CyclicCohomology /-! -# finite abelian Kummer theory, the finite abelian Kummer decomposition: descending the global operator +# 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean index 57265c4633..a7e78ff204 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean @@ -151,7 +151,8 @@ def finiteKummerCharacterEquiv 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 + ⟨(chosenFiniteKummerRadicalDatum (K := K) (L := L) + n).quotientKummerCharacterWithoutSection_injective (nthRootsOfUnity_fixed (K := K) (L := L) n hmu), finiteKummerQuotientCharacter_surjective (K := K) (L := L) n hmu⟩ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean index 2ac8c8761b..61c21f075d 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean @@ -185,7 +185,7 @@ def FiniteSupportKummerQuotient /-- The commutative group structure on the named finite-support Kummer quotient. -/ -instance finiteSupportKummerQuotient_commGroupInstance +instance finiteSupportKummerQuotientCommGroupInstance (n : ℕ+) (Delta : KummerSubgroup K n) (T : Finset Omega) (hT : (T : Set Omega) ⊆ kummerRootSet (K := K) (Omega := Omega) n Delta.1) : diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean index 098b78d913..f99fe59abf 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean @@ -178,7 +178,7 @@ def infiniteKummerContinuousQuotientCharacter /-- Forgetting continuity recovers the previously constructed algebraic Kummer character on the same ambient-power quotient. -/ -@[simp] theorem infiniteKummerContinuousQuotientCharacter_toMonoidHom +theorem infiniteKummerContinuousQuotientCharacter_toMonoidHom (n : ℕ+) (hmu : NthRootsOfUnityInBase (K := K) (L := Ω) n) (q : (chosenFiniteKummerRadicalDatum (K := K) (L := Ω) n).RadicalQuotient) : (infiniteKummerContinuousQuotientCharacter n hmu q).toMonoidHom = diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean index 3726d38ab6..acfea7ebce 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean @@ -189,7 +189,7 @@ theorem kummerRadicalExtension_isGalois `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 - [IsSepClosure K Omega] + (n : ℕ+) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (Delta : Subgroup Kˣ) (sigma tau : Gal(kummerRadicalExtension (K := K) (Omega := Omega) n Delta/K)) @@ -256,7 +256,7 @@ theorem kummerRadicalExtension_isMulCommutative /-- On every radical generator, the `n`-th power of an automorphism is the identity. -/ theorem kummerRadicalExtension_generator_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)) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean index b3bb1a6502..d3d65252d8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean @@ -179,7 +179,7 @@ def RadicalQuotient : Type _ := /-- The commutative group structure transported to the named ambient radical quotient. -/ -instance radicalQuotient_commGroupInstance : CommGroup D.RadicalQuotient := by +instance radicalQuotientCommGroupInstance : CommGroup D.RadicalQuotient := by change CommGroup (D.carrier ⧸ D.ambientNthPowersSubgroup) infer_instance diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean index 121512a436..d0da4099b1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean @@ -51,7 +51,7 @@ def RestrictedRadicalQuotient /-- The commutative group structure on the named restricted radical quotient. -/ -instance restrictedRadicalQuotient_commGroupInstance +instance restrictedRadicalQuotientCommGroupInstance (n : ℕ+) (Delta : KummerSubgroup K n) : CommGroup (RestrictedRadicalQuotient n Delta) := by change CommGroup (Delta.1 ⧸ restrictedNthPowersSubgroup n Delta) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean index 3641a30ae7..946fd39f6e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean @@ -91,7 +91,7 @@ def rootQuotient (β : Lˣ) (σ : Gal(L/K)) : Lˣ := simp [rootQuotient] /-- Base-field units have trivial root-quotient. -/ -@[simp] theorem rootQuotient_algebraMap_unit (u : Kˣ) (σ : Gal(L/K)) : +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 @@ -220,7 +220,7 @@ theorem isMulCocycle₁_rootCocycle (a : D.carrier) : exact isMulCocycle₁_rootQuotient (K := K) (L := L) (D.root a) /-- Galois automorphisms fix units coming from the base field. -/ -@[simp] theorem smul_algebraMap_unit (σ : Gal(L/K)) (u : Kˣ) : +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean index 36b4369b8f..07ecaa3b23 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean @@ -13,15 +13,17 @@ import Mathlib.RingTheory.LocalRing.Module /-! # Prime-power kernel coordinates -Linear-algebraic coordinates for kernels of surjections between finite free modules over `ZMod (p ^ v)`. +Linear-algebraic coordinates for kernels of surjections between finite free modules over `ZMod + (p ^ v)`. -/ -open scoped Classical IsMulCommutative +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. -/ @@ -72,6 +74,7 @@ theorem zmodPrimePower_isLocalRing 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. -/ @@ -114,6 +117,7 @@ theorem free_ker_of_surjective_linearMap_of_isLocalRing 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 @@ -134,6 +138,7 @@ theorem card_eq_card_pow_card_chooseBasisIndex 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 @@ -150,6 +155,7 @@ noncomputable def additiveCoordinatesLinearEquiv 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] @@ -162,6 +168,7 @@ noncomputable def additiveZModModuleOfPowEqOne 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 @@ -178,6 +185,7 @@ noncomputable def additivePiLinearEquiv 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 @@ -214,6 +222,7 @@ noncomputable def monoidKerEquivMultiplicativeLinearKer 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. -/ @@ -301,6 +310,7 @@ theorem exists_kernelMulEquiv_pi_zmod_of_primePower (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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean index 7ac6e55b64..af6d82a175 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean @@ -23,6 +23,36 @@ 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 @@ -55,39 +85,8 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub have hchi : Function.Injective chi := by simpa only [chi, E] using chosenSimpleKummerRootCharacter_injective K n hnK hmu b - let indexMap : Q × Gal(E / K) → mu := fun p => - Quotient.out p.1 * chi p.2 - have indexMap_injective : Function.Injective indexMap := by - rintro ⟨q, sigma⟩ ⟨r, tau⟩ h - have hchi_sigma : chi sigma ∈ H := ⟨sigma, rfl⟩ - have hchi_tau : chi tau ∈ H := ⟨tau, rfl⟩ - have hq : q = r := by - have hm := congrArg - (fun z : mu => (QuotientGroup.mk z : Q)) h - rw [QuotientGroup.mk_mul_of_mem _ hchi_sigma, - QuotientGroup.mk_mul_of_mem _ hchi_tau] at hm - simpa only [Quotient.out_eq'] using hm - subst r - have hsigma : sigma = tau := by - apply hchi - exact mul_left_cancel h - subst tau - rfl - have indexMap_surjective : Function.Surjective indexMap := by - intro z - let q : Q := QuotientGroup.mk z - have hrel : (Quotient.out q) ⁻¹ * z ∈ H := by - apply QuotientGroup.leftRel_apply.mp - exact @Quotient.exact' mu (QuotientGroup.leftRel H) _ _ - (by simpa only [q] using Quotient.out_eq' q) - change (Quotient.out q) ⁻¹ * z ∈ chi.range at hrel - rcases hrel with ⟨sigma, hsigma⟩ - refine ⟨(q, sigma), ?_⟩ - change Quotient.out q * chi sigma = z - rw [hsigma] - simp let indexEquiv : Q × Gal(E / K) ≃ mu := - Equiv.ofBijective indexMap ⟨indexMap_injective, indexMap_surjective⟩ + quotientCharacterProductEquiv chi hchi have indexEquiv_apply (q : Q) (sigma : Gal(E / K)) : indexEquiv (q, sigma) = Quotient.out q * chi sigma := by rfl diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean index a086ebf447..abde8eec49 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean @@ -46,7 +46,8 @@ theorem topologicalClosure_torsion_zHatMul_prod ext x simp [Subgroup.mem_prod] -/-- Algebraic quotient form of the cyclotomic torsion decomposition: after a cyclotomic decomposition +/-- 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean index c5fa3ce5cf..c4ffc3058b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean @@ -125,7 +125,6 @@ theorem zHatReduction_surjective (n : ℕ) (hn : 0 < n) : Establishes the identity `zHatMulNat n ((Int.castRingHom ZHat) a) = (Int.castRingHom ZHat) ((n : ℤ) * a)`. -/ -@[simp] theorem zHatMulNat_int (n : ℕ) (a : ℤ) : zHatMulNat n ((Int.castRingHom ZHat) a) = (Int.castRingHom ZHat) ((n : ℤ) * a) := by @@ -249,7 +248,6 @@ noncomputable def zHatDivide (n : ℕ) (hn : 0 < n) : (zHatMulNatRangeEquiv n hn).symm /-- Establishes the identity `zHatMulNat n (zHatDivide n hn y) = y.1`. -/ -@[simp] theorem zHatMulNat_zHatDivide (n : ℕ) (hn : 0 < n) (y : (zHatMulNat n).toAddMonoidHom.range) : zHatMulNat n (zHatDivide n hn y) = y.1 := by @@ -258,7 +256,6 @@ theorem zHatMulNat_zHatDivide (n : ℕ) (hn : 0 < n) exact congrArg Subtype.val ((zHatMulNatRangeEquiv n hn).apply_symm_apply y) /-- Establishes the identity `zHatDivide n hn ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x`. -/ -@[simp] theorem zHatDivide_zHatMulNat (n : ℕ) (hn : 0 < n) (x : ZHat) : zHatDivide n hn ⟨zHatMulNat n x, ⟨x, rfl⟩⟩ = x := by diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean index 19ae48cd63..5217d6825c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean @@ -19,7 +19,7 @@ namespace QuotientGroup topological group is totally disconnected. -/ theorem totallyDisconnectedSpace_of_isClosed {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] - [CompactSpace G] [T2Space G] [TotallyDisconnectedSpace 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 @@ -167,7 +167,7 @@ topological group vanishes on the identity component. -/ theorem connectedComponentOfOne_le_ker {G H : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] - [Group H] [TopologicalSpace H] [IsTopologicalGroup H] + [Group H] [TopologicalSpace H] [TotallyDisconnectedSpace H] (f : G →ₜ* H) : Subgroup.connectedComponentOfOne G ≤ f.ker := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean index a3d825138a..97404beade 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean @@ -18,7 +18,8 @@ import Mathlib.Tactic 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, +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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean index 68159ffe81..d12d7e8543 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -49,7 +49,8 @@ theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled (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 + let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v have hMulSubring : Continuous (fun z : F.valuationSubring × F.valuationSubring => z.1 * z.2) := by @@ -88,7 +89,8 @@ theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled 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 + have : IsTopologicalGroup + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) := by infer_instance let φ := principalUnitLogSeriesHomOfWithZeroValuationScaled @@ -98,7 +100,8 @@ theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled rw [ContinuousAt] suffices hlog : Tendsto - (fun u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1 => + (fun u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 => principalUnitLogSeriesOfWithZeroValuation v u hnK) (𝓝 1) (𝓝 0) by rw [principalUnitLogSeries_one_ofWithZeroValuation v hnK] @@ -132,7 +135,8 @@ theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled 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 => + (fun u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 => principalUnitSubOneOfWithZeroValuation v u) := by unfold principalUnitSubOneOfWithZeroValuation fun_prop @@ -173,16 +177,19 @@ theorem continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled 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 | + {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 + (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 + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1)) hballOne exact ht refine Filter.mem_of_superset hpre ?_ intro u hu @@ -227,10 +234,12 @@ theorem uniformizerValueExponent_residueCharacteristic_ne_zero {π : (LocalField.ofWithZeroValuation v).valuationSubring} (hπ : (LocalField.ofWithZeroValuation v).toCompleteDVF.valuation.IsUniformizer (π : K)) : - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent (LocalField.ofWithZeroValuation v).toCompleteDVF) hπ + (_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 + (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) @@ -253,21 +262,24 @@ 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) + (φ : (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, + (hψprincipal : ∀ u : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1, ψ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u) (hψa : ψ a = 1) : ψ = fieldUnitLogHomWithUniformizerValue F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (uniformizerLogValueKilling F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ a) := by let d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let L := fieldUnitLogHomWithUniformizerValue F d φ (uniformizerLogValueKilling F d φ a) @@ -324,10 +336,12 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing · intro y exact LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq - (F := F) ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) + (F := F) + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) y - · exact (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + · exact + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ · intro u rw [hψprincipal u] simpa [L, d] using @@ -335,7 +349,8 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing F hπ φ (uniformizerLogValueKilling F d φ a) u).symm · exact hϖ -/-- The inverse of the uniformizer–residue–principal-unit decomposition field-unit decomposition is continuous +/-- 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. -/ @@ -345,15 +360,17 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZero [Finite (IsLocalRing.ResidueField v.valuationSubring)] {π : (completeDVFOfWithZeroValuation v).valuationSubring} (hπ : v.IsUniformizer (π : K)) : - let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + 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 - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm := by - let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v + 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) := @@ -397,12 +414,13 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZero (CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) (unitsTopology direct.toTopologicalSpace) (factorsTopology direct.toTopologicalSpace) - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm rw [hdom, hcod] exact hcontinuousRestricted -/-- The local-field structure theory, the field-unit logarithm theorem. For a mixed-characteristic local +/-- 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. -/ @@ -420,7 +438,8 @@ theorem existsUnique_continuous_log ∃! L : Kˣ →* Multiplicative K, Continuous L ∧ L pUnit = 1 ∧ - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1, Multiplicative.toAdd (L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = @@ -447,7 +466,8 @@ theorem existsUnique_continuous_log let : Fact p.Prime := by dsimp [p, F] infer_instance - let φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1 →* Multiplicative K := + let φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1 →* Multiplicative K := principalUnitLogSeriesHomOfWithZeroValuationScaled (v := v) (p := p) e hnK hnval hcomplete have hφ : @@ -459,13 +479,14 @@ theorem existsUnique_continuous_log all_goals rfl rcases F.exists_uniformizer with ⟨π, hπ⟩ let d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + CompleteDVF.higherPrincipalUnitGroup.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 + (_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 @@ -482,7 +503,9 @@ theorem existsUnique_continuous_log exact (continuous_fieldUnitDecompositionLogHomWithUniformizerValue F.toCompleteDVF φ c hφ).comp hd - have hLprincipal : ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1, + have hLprincipal : ∀ u : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1, Multiplicative.toAdd (L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = @@ -493,7 +516,7 @@ theorem existsUnique_continuous_log F.toCompleteDVF hπ φ c u rw [show L = fieldUnitLogHomWithUniformizerValue F.toCompleteDVF d φ c from rfl] rw [show d = - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F.toCompleteDVF hπ from rfl] rw [hu] exact diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean index 0b11ed91d0..2022d1317f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean @@ -60,7 +60,7 @@ characteristic `p`. -/ def ramificationIndexOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] - [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] : ℕ := + [Finite (IsLocalRing.ResidueField v.valuationSubring)] : ℕ := Int.toNat (-WithZero.log (v ((ofWithZeroValuation v).residueCharacteristic : K))) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean index 6a3db64c5c..d8e8462d28 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean @@ -27,12 +27,14 @@ 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 +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) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F →* Multiplicative A where toFun z := @@ -57,7 +59,8 @@ The defining evaluation formula for `fieldUnitDecompositionLogHomWithUniformizer @[simp] theorem fieldUnitDecompositionLogHomWithUniformizerValue_apply (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (c : 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) := @@ -67,10 +70,11 @@ The defining evaluation formula for `fieldUnitDecompositionLogHomWithUniformizer Establishes the identity `fieldUnitDecompositionLogHomWithUniformizerValue F φ c ((ζ, 1), (1 : Multiplicative ℤ)) = 1`. -/ -@[simp] theorem fieldUnitDecompositionLogHomWithUniformizerValue_root +theorem fieldUnitDecompositionLogHomWithUniformizerValue_root (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (c : A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) (ζ : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : fieldUnitDecompositionLogHomWithUniformizerValue F φ c ((ζ, 1), (1 : Multiplicative ℤ)) = 1 := by @@ -81,10 +85,11 @@ Establishes the identity `fieldUnitDecompositionLogHomWithUniformizerValue F φ CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = φ u`. -/ -@[simp] theorem fieldUnitDecompositionLogHomWithUniformizerValue_principal +theorem fieldUnitDecompositionLogHomWithUniformizerValue_principal (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (c : 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), @@ -97,24 +102,28 @@ CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), (1 : (CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = Multiplicative.ofAdd (m • c)`. -/ -@[simp] theorem fieldUnitDecompositionLogHomWithUniformizerValue_uniformizer +theorem fieldUnitDecompositionLogHomWithUniformizerValue_uniformizer (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (c : 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)), + (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 +/-- 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) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) : Kˣ →* Multiplicative A := (fieldUnitDecompositionLogHomWithUniformizerValue F φ c).comp d.symm.toMonoidHom @@ -128,7 +137,8 @@ The defining evaluation formula for `fieldUnitLogHomWithUniformizerValue` is (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ˣ) : + (φ : (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) := @@ -142,7 +152,8 @@ 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) + (φ : (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 = @@ -155,8 +166,10 @@ 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ˣ} + (φ : (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) : @@ -174,17 +187,18 @@ 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) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitLogHomWithUniformizerValue F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ c (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u := by apply fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition (F := F) (d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (c := c) (u := u) simp [CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] @@ -196,7 +210,8 @@ 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) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) (hφ : Continuous φ) : Continuous (fieldUnitDecompositionLogHomWithUniformizerValue F φ c) := by have hprincipal : @@ -225,7 +240,8 @@ theorem continuous_fieldUnitLogHomWithUniformizerValue {A : Type*} [AddCommGroup A] [TopologicalSpace A] [IsTopologicalAddGroup A] (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃ₜ* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (c : A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (c : A) (hφ : Continuous φ) : Continuous (fieldUnitLogHomWithUniformizerValue F d.toMulEquiv φ c) := by exact @@ -236,9 +252,10 @@ theorem continuous_fieldUnitLogHomWithUniformizerValue 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] [CharZero K] + (F : CompleteDVF K) [Finite F.residueField] (d : CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative K) (a : Kˣ) : 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)) @@ -248,7 +265,8 @@ 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ˣ) + (φ : (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean index 44b1470771..88111fdb6f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -267,7 +267,7 @@ theorem mvPowerSeriesMonomialValue_pair /-- 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 - [Algebra ℚ K] (q : ℕ) (d : Fin 2 →₀ ℕ) + (q : ℕ) (d : Fin 2 →₀ ℕ) (hcoeff : MvPowerSeries.coeff d ((formalLogOnePlusProductArgument K) ^ q) ≠ 0) : @@ -369,7 +369,8 @@ theorem valuation_formalLogOnePlusProductArgument_sigmaTerm_le_max 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 +theorem + summable_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_ofWithZeroValuation_scaled [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) @@ -483,7 +484,8 @@ theorem summable_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_of /-- The expanded product-argument Sigma-family has sum equal to the scaled logarithm of `x + y + xy`. -/ -theorem hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_ofWithZeroValuation_scaled +theorem + hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_ofWithZeroValuation_scaled [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) @@ -541,7 +543,8 @@ theorem hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigm /-- 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 +theorem + hasSum_formalLogOnePlusProductArgument_logSubst_monomialValue_pair_ofWithZeroValuation_scaled [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) @@ -666,7 +669,8 @@ theorem principalUnitLogSeries_mul_eq_add_ofWithZeroValuation_scaled (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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -703,7 +707,8 @@ noncomputable def principalUnitLogSeriesHomOfWithZeroValuationScaled (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1 →* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 →* Multiplicative K where toFun u := Multiplicative.ofAdd (principalUnitLogSeriesOfWithZeroValuation v u hnK) @@ -734,7 +739,8 @@ Establishes the identity `Multiplicative.toAdd (principalUnitLogSeriesHomOfWithZ (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : Multiplicative.toAdd (principalUnitLogSeriesHomOfWithZeroValuationScaled (v := v) (p := p) e hnK hnval hcomplete u) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean index 2bba84ce2e..a542b1f172 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Continuou # 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; +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. -/ @@ -27,7 +28,8 @@ open scoped Topology variable {K : Type u} [Field K] -/-- The endpoint exponential of the deep exponential–logarithm equivalence, as a homomorphism from the +/-- 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] @@ -48,7 +50,8 @@ noncomputable def principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuationS Multiplicative ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) →* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v) n := by + 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 @@ -109,7 +112,7 @@ a.toAdd`. 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 - [Algebra ℚ K] + (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] (e n : ℕ) @@ -134,14 +137,16 @@ theorem continuousAt_zero_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWith (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) : + 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 F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := + completeDVFOfWithZeroValuation v let E := principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -150,7 +155,8 @@ theorem continuousAt_zero_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWith (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) : + 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] @@ -233,19 +239,22 @@ theorem continuous_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroVal (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) : + 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 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) : + 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 @@ -279,7 +288,8 @@ theorem continuous_principalUnitExpSeries_maximalIdealPow_fieldVal_ofWithZeroVal ((((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 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 @@ -304,28 +314,33 @@ theorem continuous_principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuation (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 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 := + 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ˣ) : + 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) : + (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ˣ) : + (((H a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + n) : F.valuationSubringˣ) : F.valuationSubring)) := by apply Continuous.subtype_mk exact hField @@ -349,7 +364,8 @@ theorem continuous_principalUnitExpSeriesHomOfMaximalIdealPowOfWithZeroValuation exact hFieldInv have hUnits : Continuous (fun a : Multiplicative I => - ((H a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : F.valuationSubringˣ)) := by + ((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 @@ -385,14 +401,18 @@ theorem continuous_principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroVal 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 := + 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⟩ + 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 := + let L : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1 →* + Multiplicative K := principalUnitLogSeriesHomOfWithZeroValuationScaled (v := v) (p := p) e hnK hnval hcomplete have hL : Continuous L := by @@ -400,7 +420,8 @@ theorem continuous_principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroVal continuous_principalUnitLogSeriesHomOfWithZeroValuationScaled (v := v) (p := p) e hnK hnval hcomplete have hfield : Continuous - (fun u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n => (L (ι u)).toAdd) := + (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 => @@ -428,10 +449,11 @@ theorem continuous_principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroVal apply Continuous.subtype_mk exact hValEndpoint -/-- The deep exponential–logarithm equivalence as a topological group isomorphism, once the two exact +/-- 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 principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] @@ -466,7 +488,8 @@ noncomputable def principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuati hπval hn hlevel hnKexp hnvalExp hcomplete a) = a) (hexp_log : - ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v) n, + ∀ 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) @@ -481,13 +504,14 @@ noncomputable def principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuati Multiplicative ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ₜ* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v) n := by + 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 { __ := - principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKexp hnvalExp hnKlog hnvalLog hcomplete hlog_exp hexp_log continuous_toFun := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean index a3b423e3e9..1b23aaacb3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean @@ -684,7 +684,8 @@ theorem summable_expSeriesTermField_mul_prod_ofWithZeroValuation_of_lt_exp_neg_o /-- 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 +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)) @@ -814,7 +815,8 @@ theorem summable_expSeriesTermField_mul_prod_ofWithZeroValuation_scaled_of_thres /-- The antidiagonal Cauchy product of two local exponential series sums to the product of their values under the sharp ramified threshold. -/ -theorem hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_scaled_of_threshold +theorem + hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_scaled_of_threshold (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) (hnK : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean index 5c6a784183..d47ab4e430 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -921,7 +921,8 @@ Establishes the identity `MvPowerSeries.coeff e (formalLogOnePlusProductFormulaD PowerSeries.coeff q (PowerSeries.log A) • MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q)`. -/ -theorem formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_filter_coord_le +theorem + formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean index 8e9efcca63..268833d234 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -32,7 +32,8 @@ variable {K : Type u} [Field K] noncomputable def principalUnitLogPartialSumOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : K := logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v u) hnK N @@ -40,7 +41,8 @@ noncomputable def principalUnitLogPartialSumOfWithZeroValuation @[simp] theorem principalUnitLogPartialSum_zero_ofWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : principalUnitLogPartialSumOfWithZeroValuation v u hnK 0 = 0 := by simp [principalUnitLogPartialSumOfWithZeroValuation] @@ -52,7 +54,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : principalUnitLogPartialSumOfWithZeroValuation v u hnK 1 = principalUnitSubOneOfWithZeroValuation v u := by @@ -67,7 +70,8 @@ Establishes the identity `principalUnitLogSeriesOfWithZeroValuation v (1 : [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : principalUnitLogSeriesOfWithZeroValuation v - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) hnK = 0 := by simp [principalUnitLogSeriesOfWithZeroValuation] @@ -77,7 +81,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -109,7 +114,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -139,7 +145,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -170,7 +177,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -184,7 +192,8 @@ theorem principalUnitLogSeries_eq_zero_iff_eq_one_of_inv_sub_one_lt 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 + 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 @@ -196,7 +205,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -229,7 +239,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnKexp : ∀ n : ℕ, (((n.factorial : ℕ) : K) ≠ 0)) (hnvalExp : ∀ n : ℕ, v (((n.factorial : ℕ) : K)) = @@ -253,8 +264,10 @@ theorem principalUnitExpSeries_logSeries_eq_one_iff_eq_one_ofWithZeroValuation (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 + (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) @@ -392,7 +405,8 @@ theorem principalUnitLogSeries_expSeries_eq_zero_iff_ofWithZeroValuation have hExp : principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) (0 : K) hnKexp hnvalExp hvx hcomplete = - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) := + (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] @@ -402,7 +416,8 @@ theorem principalUnitLogSeries_expSeries_eq_zero_iff_ofWithZeroValuation 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : principalUnitLogSeriesOfWithZeroValuation v (u * w) hnK = logOnePlusSeriesFieldOfWithZeroValuation v @@ -418,7 +433,8 @@ theorem 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (N : ℕ) : principalUnitLogPartialSumOfWithZeroValuation v (u * w) hnK N = logOnePlusPartialSumField @@ -435,7 +451,8 @@ 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -476,7 +493,8 @@ 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -505,7 +523,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -535,7 +554,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -565,7 +585,8 @@ 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -593,7 +614,8 @@ theorem hasSum_principalUnitLogSeries_add_ofWithZeroValuation 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) + (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 = @@ -613,7 +635,8 @@ 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -643,7 +666,7 @@ 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] [ContinuousNeg K] + [TopologicalSpace K] [T2Space K] [ContinuousAdd K] {f g : ℕ → K} {a b : K} (hf : Tendsto f atTop (𝓝 a)) (hg : Tendsto g atTop (𝓝 b)) @@ -661,7 +684,8 @@ 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) + (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 + @@ -687,7 +711,8 @@ 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) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -726,7 +751,8 @@ theorem principalUnitLogSeries_mul_eq_add_of_tendsto_field_defect_ofWithZeroValu (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] - (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, v (((n + 1 : ℕ) : K)) = @@ -760,7 +786,7 @@ theorem principalUnitLogSeries_mul_eq_add_of_tendsto_field_defect_ofWithZeroValu /-- 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 principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation +noncomputable def principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] @@ -772,7 +798,8 @@ noncomputable def principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuat letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -786,7 +813,8 @@ noncomputable def principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuat logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1 →* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 →* Multiplicative K where toFun u := Multiplicative.ofAdd (principalUnitLogSeriesOfWithZeroValuation v u hnK) @@ -804,7 +832,7 @@ noncomputable def principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuat /-- Establishes the identity `Multiplicative.toAdd -(principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation (v := v) (p := p) hnK hnval +(principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect u) = principalUnitLogSeriesOfWithZeroValuation v u hnK`. -/ @[simp] theorem principalUnitLogSeriesHom_apply_toAdd_ofWithZeroValuation @@ -819,7 +847,8 @@ hcomplete hdefect u) = principalUnitLogSeriesOfWithZeroValuation v u hnK`. letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -833,20 +862,23 @@ hcomplete hdefect u) = principalUnitLogSeriesOfWithZeroValuation v u hnK`. logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : Multiplicative.toAdd - (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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. -/ +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) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F →* Multiplicative A where toFun z := φ z.1.2 @@ -862,7 +894,8 @@ The defining evaluation formula for `fieldUnitDecompositionLogHomOfPrincipalUnit @[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_apply (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ z = φ z.1.2 := rfl @@ -871,10 +904,11 @@ The defining evaluation formula for `fieldUnitDecompositionLogHomOfPrincipalUnit Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ ((ζ, 1), (1 : Multiplicative ℤ)) = 1`. -/ -@[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_root +theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_root (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ ((ζ, 1), (1 : Multiplicative ℤ)) = 1 := by @@ -888,10 +922,12 @@ u`. @[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_principal (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ - (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = φ u := by simp @@ -900,24 +936,29 @@ Establishes the identity `fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), (1 : (CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = 1`. -/ -@[simp] theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_uniformizer +theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_uniformizer (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (m : ℤ) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ - (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), + (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 +/-- 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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : Kˣ →* Multiplicative A := (fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ).comp e.symm.toMonoidHom @@ -930,7 +971,8 @@ The defining evaluation formula for `fieldUnitLogHomOfPrincipalUnitHom` is (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (x : Kˣ) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (x : Kˣ) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ ((e.symm x).1.2) := rfl @@ -940,7 +982,8 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) {x : Kˣ} (hx : e z = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ z.1.2 := by @@ -952,7 +995,8 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) {x : Kˣ} (hx : e ((ζ, 1), (1 : Multiplicative ℤ)) = x) : @@ -966,16 +1010,20 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x : Kˣ} + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x + : Kˣ} (hx : - e (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + e (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ u := by simpa using fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq (F := F) e φ - (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) hx /-- Establishes the identity `fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1`. -/ @@ -983,17 +1031,20 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) - (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (m : ℤ) {x : Kˣ} (hx : - e (((1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + e (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + (((1 : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) hx @@ -1003,18 +1054,19 @@ 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) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (ζ : F.valuationSubringˣ)) = 1 := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (ζ := ζ) simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] @@ -1025,18 +1077,19 @@ 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) + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (u := u) simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] @@ -1048,16 +1101,17 @@ 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) : + (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* + Multiplicative A) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (Units.mk0 (π : K) hπ.ne_zero) = 1 := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (m := 1) simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] @@ -1066,7 +1120,7 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer 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 fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation +noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] @@ -1082,7 +1136,8 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1099,14 +1154,15 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation Kˣ →* Multiplicative K := fieldUnitLogHomOfPrincipalUnitHom (F := completeDVFOfWithZeroValuation v) e - (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (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 `fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation`, +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 fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer +noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] @@ -1121,7 +1177,8 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationU letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1136,10 +1193,10 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationU (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) : Kˣ →* Multiplicative K := - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF (completeDVFOfWithZeroValuation v) hπ) hnK hnval hcomplete hdefect @@ -1160,7 +1217,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1174,18 +1232,19 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) : - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (u : _)) = - principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect u := by - simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using fieldUnitLogHomOfPrincipalUnitHom_eq_of_completeDVF_principal (F := completeDVFOfWithZeroValuation v) hπ - (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect) u /-- Additive-value form of the preceding principal-unit evaluation: on `U¹`, @@ -1205,7 +1264,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1219,9 +1279,10 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : Multiplicative.toAdd - (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (u : _))) = @@ -1247,7 +1308,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1264,15 +1326,15 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup (completeDVFOfWithZeroValuation v)) : - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (ζ : _)) = 1 := by - simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_root (F := completeDVFOfWithZeroValuation v) hπ - (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect) ζ /-- Additive-value form of the Teichmuller-root evaluation: root factors have @@ -1292,7 +1354,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1310,7 +1373,7 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup (completeDVFOfWithZeroValuation v)) : Multiplicative.toAdd - (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (ζ : _))) = 0 := by @@ -1335,7 +1398,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1349,14 +1413,14 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer logOnePlusPartialSumField (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) : - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (Units.mk0 (π : K) hπ.ne_zero) = 1 := by - simpa [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer, - fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation] using + simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, + fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer (F := completeDVFOfWithZeroValuation v) hπ - (principalUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuation + (principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect) /-- Additive-value form of the uniformizer evaluation: the selected @@ -1376,7 +1440,8 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) (hdefect : - ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1, + ∀ u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1, letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Tendsto (fun N : ℕ => @@ -1391,7 +1456,7 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) : Multiplicative.toAdd - (fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer + (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect (Units.mk0 (π : K) hπ.ne_zero)) = 0 := by rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_uniformizer diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean index 47a9b05283..6874d5d5ed 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -1128,7 +1128,8 @@ theorem logOnePlusSeries_expSeries_sub_self_mem_maximalIdeal_pow_succ_of_mem_max /-- 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 +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 : ℕ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean index 1b0a6ed214..57957420b0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean @@ -41,7 +41,8 @@ noncomputable def principalUnitExpSeriesOfWithZeroValuation (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1 := by + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 := by let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v have hlt : v (expSeriesFieldOfWithZeroValuation v x hnK - 1) < @@ -86,7 +87,8 @@ noncomputable def principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScal (a : ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring)) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n := by + (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 : @@ -185,7 +187,8 @@ field exponential series. 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) : + hnK hnval hcomplete a : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n) : F.valuationSubringˣ) : F.valuationSubring) : K) = expSeriesFieldOfWithZeroValuation v (((a : F.valuationSubring) : K)) hnK := by @@ -267,7 +270,8 @@ theorem principalUnitExpSeries_maximalIdealPow_add_eq_mul_ofWithZeroValuationSca noncomputable def principalUnitSubOneOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) : K := + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : K := (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) : K) - 1 @@ -425,7 +429,8 @@ series. 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ˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : F.valuationSubring) : K) = expSeriesFieldOfWithZeroValuation v x hnK := by simp [principalUnitExpSeriesOfWithZeroValuation] @@ -447,7 +452,8 @@ theorem principalUnitExpSeries_val_valuation_eq_one_ofWithZeroValuation 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ˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : F.valuationSubring) : K) = (1 : WithZero (Multiplicative ℤ)) := by have hval := @@ -474,7 +480,8 @@ theorem principalUnitExpSeries_val_valuation_eq_one_ofWithZeroValuation 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 + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by apply Subtype.ext apply Units.ext apply Subtype.ext @@ -496,7 +503,8 @@ theorem principalUnitExpSeries_eq_one_iff_ofWithZeroValuation CompleteSpace K) : principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) x hnK hnval hvx hcomplete = - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) ↔ + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) ↔ x = 0 := by constructor · intro h @@ -521,7 +529,7 @@ theorem principalUnitExpSeries_eq_one_iff_ofWithZeroValuation The underlying field value of the product of two exponential-series principal units is the product of their field exponential series. -/ -@[simp] theorem principalUnitExpSeries_mul_val_ofWithZeroValuation +theorem principalUnitExpSeries_mul_val_ofWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] (x y : K) @@ -539,7 +547,8 @@ of their field exponential series. (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ˣ) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + F.valuationSubringˣ) : F.valuationSubring) : K) = expSeriesFieldOfWithZeroValuation v x hnK * expSeriesFieldOfWithZeroValuation v y hnK := by @@ -597,7 +606,8 @@ theorem principalUnitExpSeries_neg_mul_self_eq_one_ofWithZeroValuation (by simpa using hvx) hcomplete) * (principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) x hnK hnval hvx hcomplete) = - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) := by + (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 @@ -624,7 +634,8 @@ theorem principalUnitExpSeries_mul_neg_self_eq_one_ofWithZeroValuation (principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) (-x) hnK hnval (by simpa using hvx) hcomplete) = - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) := by + (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) @@ -696,7 +707,8 @@ noncomputable def principalUnitExpSeriesHomOfWithZeroValuation letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) : Multiplicative (expConvergenceAddSubgroupOfWithZeroValuation v) →* - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1 where + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1 where toFun x := principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) (x.toAdd : K) hnK hnval x.toAdd.property @@ -861,7 +873,8 @@ v)) 1) = principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnva (v := v) (p := p) hnK hnval hcomplete x : (principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete).range) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete x := MonoidHom.ofInjective_apply @@ -875,7 +888,7 @@ p) hnK hnval hcomplete (Multiplicative.ofAdd x) : (principalUnitExpSeriesHomOfWi (completeDVFOfWithZeroValuation v)) 1) = principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) (x : K) hnK hnval x.property hcomplete`. -/ -@[simp] theorem principalUnitExpSeriesMulEquivRange_apply_ofAdd_coe +theorem principalUnitExpSeriesMulEquivRange_apply_ofAdd_coe [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] @@ -893,7 +906,8 @@ p) (x : K) hnK hnval x.property hcomplete`. (Multiplicative.ofAdd x) : (principalUnitExpSeriesHomOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete).range) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = principalUnitExpSeriesOfWithZeroValuation (v := v) (p := p) (x : K) hnK hnval x.property hcomplete := by simp @@ -933,7 +947,8 @@ 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) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : v (principalUnitSubOneOfWithZeroValuation v u) < (1 : WithZero (Multiplicative ℤ)) := by let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v @@ -960,7 +975,8 @@ 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) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v IsTopologicallyNilpotent (principalUnitSubOneOfWithZeroValuation v u) := by @@ -974,7 +990,8 @@ 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) : + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v MvPowerSeries.HasEval (fun i : Fin 2 => @@ -994,7 +1011,8 @@ Establishes the identity `principalUnitSubOneOfWithZeroValuation v (1 : (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] : principalUnitSubOneOfWithZeroValuation v - (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) = + (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) = 0 := by simp [principalUnitSubOneOfWithZeroValuation] @@ -1003,9 +1021,11 @@ 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) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : principalUnitSubOneOfWithZeroValuation v u = 0 ↔ - u = (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) 1) := by + u = (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) := by let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v constructor · intro h @@ -1024,7 +1044,8 @@ 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) : + (u w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) : principalUnitSubOneOfWithZeroValuation v (u * w) = principalUnitSubOneOfWithZeroValuation v u + principalUnitSubOneOfWithZeroValuation v w + diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean index ee838b07d8..1729e7dae9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -33,7 +33,8 @@ 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) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) 1) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) : K := logOnePlusSeriesFieldOfWithZeroValuation v (principalUnitSubOneOfWithZeroValuation v u) hnK @@ -56,7 +57,8 @@ noncomputable def principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValu (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (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 @@ -213,7 +215,8 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk (completeDVFOfWithZeroValuation v) n (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled @@ -229,12 +232,14 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u - let expLogu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n := + 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), + ∀ (w : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n) + (w0 : F.valuationSubring), w0 = ((w : F.valuationSubringˣ) : F.valuationSubring) - 1 → ∀ hw0 : w0 ∈ F.maximalIdeal ^ n, LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F n w = @@ -282,10 +287,12 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ F n hn b a hdiff -/-- The deep exponential–logarithm equivalence, additive finite-level defect: the evaluated composite +/-- 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 +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 : ℕ) @@ -392,7 +399,8 @@ theorem principalUnitLogSeries_expSeries_idealQuotient_succ_eq_self_ofWithZeroVa /-- 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_ofWithZeroValuationScaled +theorem + principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_ofWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] (e n : ℕ) @@ -412,14 +420,16 @@ theorem principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_ofWi (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (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) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) - (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : @@ -430,7 +440,8 @@ theorem principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_ofWi principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u - let expLogu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) n := + let expLogu : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + n := principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKexp hnvalExp hcomplete loga @@ -458,7 +469,8 @@ theorem principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_ofWi simp [a0, b0] simpa [F, expLogu] using hsub ▸ hdiff -/-- The deep exponential–logarithm equivalence, multiplicative finite quotient identity at level `n+1`: +/-- 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 @@ -481,7 +493,8 @@ theorem principalUnitExpSeries_logSeries_idealQuotient_succ_eq_self_ofWithZeroVa (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (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 @@ -489,7 +502,8 @@ theorem principalUnitExpSeries_logSeries_idealQuotient_succ_eq_self_ofWithZeroVa (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring)) = Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ (n + 1)) @@ -503,7 +517,8 @@ theorem principalUnitExpSeries_logSeries_idealQuotient_succ_eq_self_ofWithZeroVa (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) + (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 = @@ -569,7 +584,8 @@ theorem maximalIdealPowSubtype_eq_of_idealQuotient_eq_ge 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 +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 : ℕ} @@ -635,7 +651,8 @@ theorem higherPrincipalUnitGroup_eq_of_idealQuotient_eq_ge 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 +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 @@ -708,7 +725,8 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZe (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) (hquot : ∀ r : ℕ, n ≤ r → Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) @@ -718,7 +736,8 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_idealQuotient_eq_ge_ofWithZe (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) = Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) @@ -819,7 +838,8 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuati (hcomplete : letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v CompleteSpace K) - (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) + (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) (hmem : ∀ r : ℕ, n ≤ r → (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled @@ -828,7 +848,8 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuati (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) - (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : @@ -856,7 +877,8 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuati (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring)) (y := @@ -864,12 +886,13 @@ theorem principalUnitExpSeries_logSeries_eq_self_of_sub_mem_ge_ofWithZeroValuati (completeDVFOfWithZeroValuation v).valuationSubring)))).2 (hmem r hr) -/-- Endpoint package for the deep exponential–logarithm equivalence from the exact inverse equalities: +/-- 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 principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogEquivOfExactOfWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] (e n : ℕ) @@ -901,7 +924,8 @@ noncomputable def principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled hnKexp hnvalExp hcomplete a) = a) (hexp_log : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKexp hnvalExp hcomplete @@ -911,7 +935,8 @@ noncomputable def principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled u) : ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n where + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n where toFun a := principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -928,7 +953,7 @@ if the evaluated composites are identities, then the source and target groups ar 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 principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Algebra ℚ K] @@ -961,7 +986,8 @@ noncomputable def principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled hnKexp hnvalExp hcomplete a) = a) (hexp_log : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKexp hnvalExp hcomplete @@ -972,7 +998,8 @@ noncomputable def principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled Multiplicative ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n where + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n where toFun a := principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -993,11 +1020,12 @@ noncomputable def principalUnitExpLogMulEquivOfExact_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 +/-- 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 principalUnitExpLogEquivOfIdealQuotient_ge_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogEquivOfIdealQuotientGeOfWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] {p : ℕ} [Fact p.Prime] (e n : ℕ) @@ -1033,7 +1061,8 @@ noncomputable def principalUnitExpLogEquivOfIdealQuotient_ge_ofWithZeroValuation Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (a : (completeDVFOfWithZeroValuation v).valuationSubring)) (hexp_log_quot : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, ∀ r : ℕ, n ≤ r → Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled @@ -1042,7 +1071,8 @@ noncomputable def principalUnitExpLogEquivOfIdealQuotient_ge_ofWithZeroValuation (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) = Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) @@ -1050,8 +1080,9 @@ noncomputable def principalUnitExpLogEquivOfIdealQuotient_ge_ofWithZeroValuation (completeDVFOfWithZeroValuation v).valuationSubring))) : ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n := - principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled + (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 => @@ -1063,9 +1094,10 @@ noncomputable def principalUnitExpLogEquivOfIdealQuotient_ge_ofWithZeroValuation (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 +/-- Endpoint package for the deep exponential–logarithm equivalence as a multiplicative +equivalence, from finite quotient identities for both evaluated composites. -/ -noncomputable def principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogMulEquivOfIdealQuotientGeOfWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Algebra ℚ K] @@ -1102,7 +1134,8 @@ noncomputable def principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuat Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (a : (completeDVFOfWithZeroValuation v).valuationSubring)) (hexp_log_quot : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, ∀ r : ℕ, n ≤ r → Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled @@ -1111,7 +1144,8 @@ noncomputable def principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuat (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) = Ideal.Quotient.mk ((completeDVFOfWithZeroValuation v).maximalIdeal ^ r) @@ -1120,8 +1154,9 @@ noncomputable def principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuat Multiplicative ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n := - principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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 => @@ -1133,10 +1168,12 @@ noncomputable def principalUnitExpLogMulEquivOfIdealQuotient_ge_ofWithZeroValuat (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: +/-- 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 principalUnitExpLogEquivOfSubMem_ge_ofWithZeroValuationScaled +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 : ℕ) @@ -1171,7 +1208,8 @@ noncomputable def principalUnitExpLogEquivOfSubMem_ge_ofWithZeroValuationScaled (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (hexp_log_mem : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, ∀ r : ℕ, n ≤ r → (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -1179,7 +1217,8 @@ noncomputable def principalUnitExpLogEquivOfSubMem_ge_ofWithZeroValuationScaled (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) - (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : @@ -1187,8 +1226,9 @@ noncomputable def principalUnitExpLogEquivOfSubMem_ge_ofWithZeroValuationScaled (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) : ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n := - principalUnitExpLogEquivOfExact_ofWithZeroValuationScaled + (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 => @@ -1200,11 +1240,12 @@ noncomputable def principalUnitExpLogEquivOfSubMem_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 +/-- 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 principalUnitExpLogMulEquivOfSubMem_ge_ofWithZeroValuationScaled +noncomputable def principalUnitExpLogMulEquivOfSubMemGeOfWithZeroValuationScaled (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Algebra ℚ K] @@ -1240,7 +1281,8 @@ noncomputable def principalUnitExpLogMulEquivOfSubMem_ge_ofWithZeroValuationScal (a : (completeDVFOfWithZeroValuation v).valuationSubring) ∈ (completeDVFOfWithZeroValuation v).maximalIdeal ^ r) (hexp_log_mem : - ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n, + ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n, ∀ r : ℕ, n ≤ r → (((principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -1248,7 +1290,8 @@ noncomputable def principalUnitExpLogMulEquivOfSubMem_ge_ofWithZeroValuationScal (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (completeDVFOfWithZeroValuation v)) n) : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : (completeDVFOfWithZeroValuation v).valuationSubring) - (((u : (completeDVFOfWithZeroValuation v).valuationSubringˣ) : @@ -1257,8 +1300,9 @@ noncomputable def principalUnitExpLogMulEquivOfSubMem_ge_ofWithZeroValuationScal Multiplicative ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal (completeDVFOfWithZeroValuation v).valuationSubring) ≃* - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n := - principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled + (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 => diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean index 55fc597fac..e61e7b1270 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -838,7 +838,8 @@ theorem tendsto_zero_signed_log_term_ofWithZeroValuation_of_pos 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. -/ +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ˣ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean index 33441ada02..5145803d36 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean @@ -23,7 +23,8 @@ namespace MultiplicativeIntegerValuation variable {K : Type u} [Field K] -/-- The local-field structure theory, the deep exponential–logarithm equivalence. If the normalized valuation has +/-- 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). @@ -43,8 +44,10 @@ noncomputable def chosenExpLogContinuousMulEquiv 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 + 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 @@ -156,7 +159,7 @@ noncomputable def chosenExpLogContinuousMulEquiv principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled, F] using hexact exact - principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuationScaled + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπval hn hlevel' hnKexp hnvalExp hnKlog hnvalLog hcomplete hlog_exp hexp_log diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 4b12df3531..7a640c6681 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -28,7 +28,8 @@ 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 +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⁻¹]`. @@ -126,7 +127,8 @@ theorem uniformizer_hasEval_mrangeRestrict PowerSeries.HasEval (π : K) := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom - let : Valued K Γ := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) have : IsCyclic Γˣ := by simpa [Γ] using _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F @@ -134,9 +136,11 @@ theorem uniformizer_hasEval_mrangeRestrict _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 : Γ) + 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 + 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. -/ @@ -405,7 +409,7 @@ theorem laurentSeriesEvalHom_comp_powerSeries [Finite F.residueField] 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`. -/ -@[simp] theorem laurentSeriesEvalHom_algebraMap_C +theorem laurentSeriesEvalHom_algebraMap_C [Finite F.residueField] (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) @@ -434,7 +438,7 @@ F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) = coeffHom (F := 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)`. -/ -@[simp] theorem laurentSeriesEvalHom_algebraMap_X +theorem laurentSeriesEvalHom_algebraMap_X [Finite F.residueField] (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) @@ -642,7 +646,7 @@ noncomputable def adicLaurentSeriesEvalHom 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`. -/ -@[simp] theorem adicLaurentSeriesEvalHom_algebraMap_C +theorem adicLaurentSeriesEvalHom_algebraMap_C [Finite F.residueField] (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) @@ -673,7 +677,7 @@ F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) = coeffHom (F := Establishes the identity `adicLaurentSeriesEvalHom (F := F) p hcard π hπ (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.X : F.residueField⟦X⟧)) = (π : K)`. -/ -@[simp] theorem adicLaurentSeriesEvalHom_algebraMap_X +theorem adicLaurentSeriesEvalHom_algebraMap_X [Finite F.residueField] (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) @@ -809,7 +813,8 @@ variable {K : Type u} [Field K] variable (F : LocalField.{u, v} K) /-- 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. -/ +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 : ℕ)) @@ -849,7 +854,8 @@ theorem laurentImageSubfield_eq_top · intro _hx trivial · intro _hx - rcases _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_surjective + rcases + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_surjective (F := F.toCompleteDVF) p hcard π hπ x with ⟨y, hy⟩ exact (RingHom.mem_fieldRange).2 ⟨y, hy⟩ @@ -889,7 +895,7 @@ Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.C a)) : F.laurentImageSubfield p hcard π hπ) : K) = CompleteDVF.EqualCharacteristicLaurent.coeffHom (F := F.toCompleteDVF) p hcard a`. -/ -@[simp] theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_C +theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_C (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) (π : F.valuationSubring) @@ -910,7 +916,7 @@ Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π F.residueField⟦X⟧ F.residueField⸨X⸩ (PowerSeries.X : F.residueField⟦X⟧)) : F.laurentImageSubfield p hcard π hπ) : K) = (π : K)`. -/ -@[simp] theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_X +theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_X (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) (π : F.valuationSubring) @@ -927,30 +933,33 @@ p hcard π hπ) : K) = (π : K)`. /-- The image base field is nontrivially normed by the norm induced from the range-restricted valuation topology on `K`. -/ @[implicit_reducible] -noncomputable def laurentImageSubfield_nontriviallyNormedField +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)) + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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)) + 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.mrangeRestrict_rankOne + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let piSub : F.laurentImageSubfield p hcard π hπ := F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ @@ -967,9 +976,11 @@ noncomputable def laurentImageSubfield_nontriviallyNormedField rw [hpiSub_coe] at hzeroK exact hπ.ne_zero hzeroK · have hπ_lt_one : - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF (π : K) < 1 := by + _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 + 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 @@ -981,28 +992,31 @@ noncomputable def laurentImageSubfield_nontriviallyNormedField /-- The ambient local field is a normed algebra over the Laurent image base. -/ @[implicit_reducible] -noncomputable def laurentImageSubfield_normedAlgebra +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)) + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := - F.laurentImageSubfield_nontriviallyNormedField 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 : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := - F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ exact { (inferInstance : Algebra (F.laurentImageSubfield p hcard π hπ) K) with @@ -1019,27 +1033,30 @@ theorem finiteDimensional_over_laurentImageSubfield (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : letI : Valued K (MonoidHom.mrange F.toCompleteDVF.valuation.toMonoidWithZeroHom) := - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := - F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ letI : NormedAlgebra (F.laurentImageSubfield p hcard π hπ) K := - F.laurentImageSubfield_normedAlgebra p hcard π hπ + 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 : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := - F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ let : NormedAlgebra (F.laurentImageSubfield p hcard π hπ) K := - F.laurentImageSubfield_normedAlgebra p hcard π hπ + F.laurentImageSubfieldNormedAlgebra p hcard π hπ have htop : F.laurentImageSubfield p hcard π hπ = ⊤ := F.laurentImageSubfield_eq_top p hcard π hπ have hsurj : @@ -1099,15 +1116,17 @@ theorem finiteDimensional_over_laurentSeries 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 : Valued K Γ := + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF)) let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := - F.laurentImageSubfield_nontriviallyNormedField p hcard π hπ + F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ let : NormedAlgebra (F.laurentImageSubfield p hcard π hπ) K := - F.laurentImageSubfield_normedAlgebra p hcard π hπ + F.laurentImageSubfieldNormedAlgebra p hcard π hπ have : FiniteDimensional (F.laurentImageSubfield p hcard π hπ) K := F.finiteDimensional_over_laurentImageSubfield p hcard π hπ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean index 6d3a0aa26b..83ef4e58ab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean @@ -77,7 +77,7 @@ noncomputable def fieldNormUnitsQuotientKerEquivFieldNormSubgroup : Establishes the identity `fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' (MonoidHom.ker (normUnits K L)) z) = (normUnits K L).rangeRestrict z`. -/ -@[simp] theorem fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk +theorem fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk (z : Lˣ) : fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' @@ -89,7 +89,7 @@ Establishes the identity `fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (Q Establishes the identity `((fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' (MonoidHom.ker (normUnits K L)) z) : fieldNormSubgroup K L) : Kˣ) = normUnits K L z`. -/ -@[simp] theorem coe_fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk +theorem coe_fieldNormUnitsQuotientKerEquivFieldNormSubgroup_mk (z : Lˣ) : ((fieldNormUnitsQuotientKerEquivFieldNormSubgroup K L (QuotientGroup.mk' @@ -465,7 +465,7 @@ theorem fieldNormQuotient_norm_mul_mk_eq_mk (z : Lˣ) (x : Kˣ) : fieldNormQuotient_norm_mul_mk_eq K L z x] /-- Norm of an element coming from the base field. -/ -@[simp] theorem fieldNormUnits_algebraMap (u : Kˣ) : +theorem fieldNormUnits_algebraMap (u : Kˣ) : normUnits K L (Units.map (algebraMap K L).toMonoidHom u) = u ^ Module.finrank K L := by ext @@ -624,7 +624,7 @@ Establishes the identity `fieldNormQuotientEquivZMod K L vK vL residueDegree hfo hzero (QuotientGroup.mk' (fieldNormSubgroup K L) x) = Multiplicative.ofAdd ((vK.val x : ℤ) : ZMod residueDegree)`. -/ -@[simp] theorem fieldNormQuotientEquivZMod_mk +theorem fieldNormQuotientEquivZMod_mk (vK : MultiplicativeIntegerValuation Kˣ) (vL : MultiplicativeIntegerValuation Lˣ) (residueDegree : ℕ) @@ -658,7 +658,7 @@ residueDegree)`. `fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL hzero (QuotientGroup.mk' (fieldNormSubgroup K L) (ϖK ^ n)) = Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)`. -/ -@[simp] theorem fieldNormQuotientEquivZMod_uniformizer_zpow +theorem fieldNormQuotientEquivZMod_uniformizer_zpow (vK : MultiplicativeIntegerValuation Kˣ) (vL : MultiplicativeIntegerValuation Lˣ) (residueDegree : ℕ) @@ -682,7 +682,7 @@ residueDegree)`. `fieldNormQuotientEquivZMod K L vK vL residueDegree hformula hϖK hϖL hzero ((QuotientGroup.mk' (fieldNormSubgroup K L) ϖK) ^ n) = Multiplicative.ofAdd ((n : ℤ) : ZMod residueDegree)`. -/ -@[simp] theorem fieldNormQuotientEquivZMod_uniformizerClass_zpow +theorem fieldNormQuotientEquivZMod_uniformizerClass_zpow (vK : MultiplicativeIntegerValuation Kˣ) (vL : MultiplicativeIntegerValuation Lˣ) (residueDegree : ℕ) @@ -1836,7 +1836,7 @@ Establishes the identity `fieldNormFiltrationQuotientModuloPreimageClassEquivRan targetLevel hN n (QuotientGroup.mk' (fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n) q) = (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n).rangeRestrict q`. -/ -@[simp] theorem fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk +theorem fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) (targetLevel : ℕ → ℕ) (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) @@ -1859,7 +1859,7 @@ targetLevel n) q) : (fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n). UK.principalUnitSubgroup (targetLevel n)) = fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q`. -/ -@[simp] theorem coe_fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk +theorem coe_fieldNormFiltrationQuotientModuloPreimageClassEquivRange_mk (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) (targetLevel : ℕ → ℕ) (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) @@ -1904,7 +1904,7 @@ Establishes the identity `fieldNormFiltrationQuotientModuloPreimageClassEquivTar targetLevel hN n hSurj (QuotientGroup.mk' (fieldNormFiltrationPreimageClassInQuotient K L UK UL targetLevel n) q) = fieldNormFiltrationQuotientMap K L UK UL targetLevel hN n q`. -/ -@[simp] theorem fieldNormFiltrationQuotientModuloPreimageClassEquivTarget_mk +theorem fieldNormFiltrationQuotientModuloPreimageClassEquivTarget_mk (UK : AntitoneSubgroupFiltration Kˣ) (UL : AntitoneSubgroupFiltration Lˣ) (targetLevel : ℕ → ℕ) (hN : fieldNormMapsFiltrationLevels K L UK UL targetLevel) (n : ℕ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean index 7422c4e67f..2f38d8c697 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -77,7 +77,8 @@ 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 : ℤ) : + (p q : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + (m n : ℤ) : valuationSubringUnitFieldUnitHom F (ζ : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F @@ -106,7 +107,7 @@ theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_completeDVF /-- The uniformizer–residue–principal-unit decomposition, group-isomorphism form for a complete DVF with a fixed uniformizer: `K^* ≃ μ_{q-1} × U^1 × ℤ`. -/ -noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF +noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : fieldUnitDecompositionFactors F ≃* Kˣ := by @@ -121,12 +122,12 @@ noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF simpa [V] using (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ exact - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup (F := F) V hzero hπV /-- -The defining evaluation formula for `fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF` -is `fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ z = +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`. @@ -136,7 +137,7 @@ 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) : - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z = valuationSubringUnitFieldUnitHom F (z.1.1 : F.valuationSubringˣ) * @@ -160,20 +161,19 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq (F := F) V hzero y) hπV z - simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF, - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup] + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF, + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup] /-- Establishes the identity `((CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val -(fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ z) = Multiplicative.toAdd z.2`. +(fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2`. -/ -@[simp] theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (z : fieldUnitDecompositionFactors F) : ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val - (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2 := by let V : MultiplicativeIntegerValuation Kˣ := @@ -208,15 +208,14 @@ theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipa /-- Establishes the identity `(CompleteDVF.uniformizerValueExponent F) hπ -(fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ z) = Multiplicative.toAdd z.2`. +(fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2`. -/ -@[simp] theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (z : fieldUnitDecompositionFactors F) : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ - (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2 := multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipalUnitsUniformizer @@ -224,27 +223,27 @@ theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer /-- Establishes the identity `Multiplicative.toAdd -((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).2 = +((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = (CompleteDVF.uniformizerValueExponent F) hπ x`. -/ -@[simp] 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 - ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + x := by have h := uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer F hπ - ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x) simpa using h.symm /-- -Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F +Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = Multiplicative.ofAdd ((CompleteDVF.uniformizerValueExponent F) hπ x)`. -/ @[simp] @@ -252,28 +251,33 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : - ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = - Multiplicative.ofAdd ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := by + Multiplicative.ofAdd + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x) := by let E := - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ have h : Multiplicative.toAdd ((E.symm x).2) = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by - simp [E] + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := by + _ = Multiplicative.ofAdd + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x) := by rw [h] /-- `fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer` satisfies the integer-power formula `valuationSubringUnitFieldUnitHom F -(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.1 : +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F -(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.2 : +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) ^ (CompleteDVF.uniformizerValueExponent F) hπ x = x`. -/ @@ -282,26 +286,31 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformiz {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) * - (Units.mk0 (π : K) hπ.ne_zero) ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = + (Units.mk0 (π : K) hπ.ne_zero) ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x = x := by let E := - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ have hexp : Multiplicative.toAdd ((E.symm x).2) = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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) ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = + (Units.mk0 (π : K) hπ.ne_zero) ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x = valuationSubringUnitFieldUnitHom F (((E.symm x).1.1 : F.valuationSubringˣ)) * valuationSubringUnitFieldUnitHom F @@ -315,9 +324,9 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformiz /-- `fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_uniformizer_zpow` satisfies the negation formula `valuationSubringUnitFieldUnitHom F -(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.1 : +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F -(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.2 : +(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ (-((CompleteDVF.uniformizerValueExponent F) hπ x))`. -/ @@ -326,32 +335,38 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_unifo {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) := by + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x)) := by let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero let u : Kˣ := valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) have hux : - u * ϖ ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = x := by + u * ϖ ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 * (ϖ ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x * + _ = u * (ϖ ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := by rw [← zpow_add, add_neg_cancel, zpow_zero] - _ = x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) := by + _ = x * ϖ ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x)) := by rw [← mul_assoc, hux] /-- @@ -363,7 +378,8 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) ∈ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x)) ∈ F.valuation.valuationSubring.unitGroup := by let V : MultiplicativeIntegerValuation Kˣ := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ @@ -391,7 +407,8 @@ noncomputable def fieldUnitUniformizerUnitPart (x : Kˣ) : F.valuationSubringˣ := F.valuation.valuationSubring.unitGroupMulEquiv ⟨x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)), + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x)), fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup F hπ x⟩ @@ -407,23 +424,24 @@ theorem valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart valuationSubringUnitFieldUnitHom F (fieldUnitUniformizerUnitPart F hπ x) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) := by + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ x)) := by apply Units.ext simp [valuationSubringUnitFieldUnitHom, fieldUnitUniformizerUnitPart] /-- -Establishes the identity `(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F +Establishes the identity `(((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * -(((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F hπ).symm x).1.2 : +(((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ˣ) : - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.1 : F.valuationSubringˣ) * - (((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) = fieldUnitUniformizerUnitPart F hπ x := by apply valuationSubringUnitFieldUnitHom_injective @@ -432,7 +450,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitSubringUnit_eq rw [valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart] /-- -Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF F +Establishes the identity `((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1 = (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm (fieldUnitUniformizerUnitPart F hπ x)`. -/ @@ -440,7 +458,7 @@ 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ˣ) : - ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1 = (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm @@ -459,20 +477,27 @@ theorem uniformizerValueExponent_eq_of_mrangeRestrict_eq {π : 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)) : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (y : K) = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (x : K)) : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + apply + ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj + F) hπ).1 calc - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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π ^ (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + _ = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + x := by rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] /-- The uniformizer exponent is locally constant for the range-restricted @@ -486,10 +511,12 @@ theorem eventually_uniformizerValueExponent_eq_mrangeRestrict (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) ∀ᶠ y : Kˣ in 𝓝 x, (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := by + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom - let : Valued K Γ := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + 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) @@ -528,22 +555,29 @@ theorem continuous_uniformizerValueExponent_mrangeRestrict letI : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) - Continuous (fun x : Kˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := by + Continuous (fun x : Kˣ => + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + x) := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom - let : Valued K Γ := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) rw [continuous_iff_continuousAt] intro x rw [continuousAt_def] intro s hs - have hxmem : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x ∈ s := + have hxmem : + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y ∈ s + change + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + F) hπ y ∈ s rw [hy] exact hxmem) @@ -555,13 +589,15 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd_mrange (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) Continuous (fun x : Kˣ => - ((fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + ((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ˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := + Continuous (fun x : Kˣ => + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x) := continuous_uniformizerValueExponent_mrangeRestrict F hπ have hofAdd : @@ -586,7 +622,9 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero have hval : - Continuous (fun x : Kˣ => (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x) := + Continuous (fun x : Kˣ => + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ x) := continuous_uniformizerValueExponent_mrangeRestrict F hπ have hpow : @@ -594,13 +632,15 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict continuous_of_discreteTopology have hfield : Continuous (fun x : Kˣ => - x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := + x * ϖ ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := continuous_id.mul (hpow.comp hval) rw [Units.continuous_iff] constructor · have hfieldK : Continuous (fun x : Kˣ => - ((x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ) : K)) := + ((x * ϖ ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ) : K)) := Units.continuous_val.comp hfield have hcoerced : Continuous (fun x : Kˣ => @@ -622,7 +662,8 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict F.valuationSubring).2 · have hfieldInvK : Continuous (fun x : Kˣ => - (((x * ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ)⁻¹ : + (((x * ϖ ^ + (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ)⁻¹ : Kˣ) : K)) := Units.continuous_val.comp hfield.inv have hcoercedInv : @@ -654,10 +695,12 @@ theorem isOpen_higherPrincipalUnitGroup_one_mrangeRestrict 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 + 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) + let : Valued K Γ := + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) rw [isOpen_iff_mem_nhds] intro u hu have hu_lt : @@ -1133,7 +1176,7 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_ (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) Continuous (fun z : fieldUnitDecompositionFactors F => - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) := by let : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := @@ -1153,13 +1196,13 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRest (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) Continuous (fun x : Kˣ => - (fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x) := by let : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) let E := - fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ have hfstComp : Continuous (fun x : Kˣ => @@ -1206,7 +1249,8 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRest /-- The uniformizer–residue–principal-unit decomposition, topological group-isomorphism form for the range-restricted valuation topology. -/ -noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict +noncomputable def + fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : letI : Valued K @@ -1217,7 +1261,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_ (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) exact - { fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + { fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ with continuous_toFun := continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict @@ -1286,7 +1330,8 @@ theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_withZeroValuation change Finite (IsLocalRing.ResidueField v.valuationSubring) infer_instance ∀ (ζ η : residueRootsOfUnityGroup F) - (p q : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) (m n : ℤ), + (p q : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + (m n : ℤ), valuationSubringUnitFieldUnitHom F (ζ : F.valuationSubringˣ) * valuationSubringUnitFieldUnitHom F diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean index 7d7360bcd7..4584d82a81 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean @@ -86,7 +86,8 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZMod (zmodCyclicMulEquiv (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm - haveI : Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + haveI : Finite + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv exact @@ -103,19 +104,22 @@ noncomputable def fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformiz 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 + 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1))) (ContinuousMulEquiv.refl (Multiplicative ℤ))).trans - (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict F hπ) -/-- The uniformizer–residue–principal-unit decomposition in the topology carried directly by a standard +/-- 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 @@ -151,7 +155,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi let E := letI : Valued K (MonoidHom.mrange v.toMonoidWithZeroHom) := restricted - fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizer_of_completeDVF_mrangeRestrict + fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfCompleteDVFMrangeRestrict F hπ have htop : direct.toTopologicalSpace = restricted.toTopologicalSpace := by exact congrArg (fun U : UniformSpace K => U.toTopologicalSpace) huniform @@ -239,7 +243,8 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation (zmodCyclicMulEquiv (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm - haveI : Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + haveI : Finite + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv exact @@ -249,7 +254,8 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation /-- The field-unit structure theorem with the principal-unit factor left visible, now in the direct standard valuation topology. -/ -noncomputable def fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformizerOfWithZeroValuation +noncomputable def + fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformizerOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] @@ -262,7 +268,8 @@ noncomputable def fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformiz 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 + 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 @@ -273,7 +280,8 @@ noncomputable def fieldUnitsContinuousMulEquivCyclicRootsPrincipalUnitsUniformiz (continuousMulEquivProdCongr (continuousMulEquivProdCongr (residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation v) - (ContinuousMulEquiv.refl (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1))) + (ContinuousMulEquiv.refl + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1))) (ContinuousMulEquiv.refl (Multiplicative ℤ))).trans (fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWithZeroValuation v hπ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean index 88dbebd05d..a3ff3bdc2f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean @@ -53,7 +53,8 @@ theorem fieldIndex_eq_mul_unitIndex ((MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubringˣ ⧸ (powMonoidHom n : (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubringˣ →* - (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubringˣ).range)] : + (MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation + v).valuationSubringˣ).range)] : let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v Nat.card (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) = @@ -109,7 +110,7 @@ theorem mixed_fieldIndex WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure @@ -156,7 +157,7 @@ theorem mixed_unitIndex WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_fieldKernel @@ -187,7 +188,7 @@ theorem mixed_unitIndex_of_coprime let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let d := Module.finrank ℚ_[F.residueCharacteristic] K obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv let U := CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF 1 @@ -250,7 +251,7 @@ theorem mixed_fieldIndex_rationalFormula WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula @@ -295,7 +296,7 @@ theorem mixed_unitIndex_rationalFormula WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormula @@ -326,7 +327,7 @@ theorem equal_fieldIndex let π := Classical.choose hex have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - let e := chosenFirstPrincipalUnitStructure_equalCharacteristic v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v exact card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct (p := F.residueCharacteristic) (F := F.toCompleteDVF) @@ -358,7 +359,7 @@ theorem equal_unitIndex let π := Classical.choose hex have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - let e := chosenFirstPrincipalUnitStructure_equalCharacteristic v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v exact card_units_nthPowerQuotient_of_equalPrincipalUnitProduct (p := F.residueCharacteristic) (F := F.toCompleteDVF) @@ -391,7 +392,7 @@ theorem equal_fieldIndex_rationalFormula let π := Classical.choose hex have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - let e := chosenFirstPrincipalUnitStructure_equalCharacteristic v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v exact card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula (p := F.residueCharacteristic) (F := F.toCompleteDVF) @@ -423,7 +424,7 @@ theorem equal_unitIndex_rationalFormula let π := Classical.choose hex have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - let e := chosenFirstPrincipalUnitStructure_equalCharacteristic v + let e := chosenFirstPrincipalUnitStructureEqualCharacteristic v exact card_units_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula (p := F.residueCharacteristic) (F := F.toCompleteDVF) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean index fe9fe1767d..c7e7c89c8b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -27,11 +27,12 @@ namespace LocalField variable {K : Type u} [Field K] -/-- The local-field structure theory, the mixed-characteristic field-unit structure theorem. In mixed characteristic the +/-- 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 chosenFieldUnitsStructure_mixedCharacteristic +noncomputable def chosenFieldUnitsStructureMixedCharacteristic (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -62,7 +63,7 @@ noncomputable def chosenFieldUnitsStructure_mixedCharacteristic WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one v (π : K) hπval obtain ⟨a, e⟩ := - chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact ⟨a, CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation @@ -71,9 +72,10 @@ noncomputable def chosenFieldUnitsStructure_mixedCharacteristic (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic]))) e⟩ -/-- The exact principal-unit factor in the equal-characteristic field-unit structure theorem, reindexed from +/-- 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 chosenFirstPrincipalUnitStructure_equalCharacteristic +noncomputable def chosenFirstPrincipalUnitStructureEqualCharacteristic (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] @@ -110,11 +112,12 @@ noncomputable def chosenFirstPrincipalUnitStructure_equalCharacteristic I.symm.trans E exact LocalFieldTheory.DiscreteValuationField.continuousMulEquivOfAdditiveTarget eAdd -/-- The local-field structure theory, the equal-characteristic field-unit structure theorem. In equal characteristic the +/-- 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 chosenFieldUnitsStructure_equalCharacteristic +noncomputable def chosenFieldUnitsStructureEqualCharacteristic (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] @@ -130,7 +133,7 @@ noncomputable def chosenFieldUnitsStructure_equalCharacteristic let π := Classical.choose hex have hπ : v.IsUniformizer (π : K) := Classical.choose_spec hex let ePrincipal := - chosenFirstPrincipalUnitStructure_equalCharacteristic v + chosenFirstPrincipalUnitStructureEqualCharacteristic v exact CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation v hπ (Multiplicative (ℕ → ℤ_[F.residueCharacteristic])) ePrincipal diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean index 269d795d94..959ed1dcaf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean @@ -16,7 +16,8 @@ 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 +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))`. -/ @@ -197,7 +198,6 @@ theorem zmodLaurentCoeffMap_coeff (f : (ZMod p)⸨X⸩) (n : ℤ) : Establishes the identity `zmodLaurentCoeffMap p k (HahnSeries.C (Γ := ℤ) a : (ZMod p)⸨X⸩) = (HahnSeries.C (Γ := ℤ) ((ZMod.castHom (m := p) dvd_rfl k) a) : k⸨X⸩)`. -/ -@[simp] 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) : @@ -237,7 +237,6 @@ theorem zmodLaurentCoeffMap_comp_powerSeries : 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⟧)`. -/ -@[simp] theorem zmodLaurentCoeffMap_powerSeries_X : zmodLaurentCoeffMap p k ((algebraMap (ZMod p)⟦X⟧ (ZMod p)⸨X⸩) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean index 470aa2a12e..321012037d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -22,7 +22,8 @@ and packages the resulting topological additive equivalence. /-! # Finite-level Iwasawa generators for principal units -This file develops an explicit topological product decomposition of principal units. In equal characteristic, choose +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 @@ -112,7 +113,8 @@ noncomputable def iwasawaSeedAtLevel {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup F.toCompleteDVF hn (iwasawaSeedIdeal F hpi n i) (iwasawaSeedIdeal F hpi n i).property @@ -129,7 +131,8 @@ F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : (((iwasawaSeedAtLevel F hpi n hn i : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubring) = 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n := by @@ -145,9 +148,11 @@ noncomputable def iwasawaSeed {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 := ⟨(iwasawaSeedAtLevel F hpi n hn i : F.valuationSubringˣ), - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hn + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hn (iwasawaSeedAtLevel F hpi n hn i).property⟩ /-- @@ -161,7 +166,9 @@ i) * pi ^ n`. {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - (((iwasawaSeed F hpi n hn i : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : + (((iwasawaSeed F hpi n hn i : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubring) = 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n := by @@ -203,7 +210,8 @@ noncomputable def iwasawaLeadingLayerAddEquiv (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) : (Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic) ≃+ - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuot + Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuot F.toCompleteDVF n) := (iwasawaResidueBasis F).equivFun.symm.toAddEquiv.trans (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer @@ -280,11 +288,16 @@ higher-unit level. -/ noncomputable def principalUnitPadicSmulAtLevel (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) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r := + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) r) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) r := ⟨(Additive.toMul (a • Additive.ofMul x) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1), + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -293,8 +306,11 @@ 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) - (hx : (x : F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r) : + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) r) : principalUnitSuccQuotMk F.toCompleteDVF r (principalUnitPadicSmulAtLevel F r hr a x hx) = principalUnitSuccQuotMk F.toCompleteDVF r @@ -305,8 +321,10 @@ theorem principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val ((principalUnitPadicSmulAtLevel F r hr a x hx / principalUnitPadicSmulAtLevel F r hr ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) x hx : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) r) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) obtain ⟨b, hb⟩ := exists_padicInt_sub_toZMod_val_eq_residueCharacteristic_mul F a have hdeep := @@ -315,12 +333,17 @@ theorem principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val rw [← hb] at hdeep change (((Additive.toMul (a • Additive.ofMul x) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) / + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) / (Additive.toMul (((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) • - Additive.ofMul x) : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) + Additive.ofMul x) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) have hsub := sub_smul a ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) (Additive.ofMul x) @@ -333,7 +356,8 @@ noncomputable def principalUnitLeadingCoefficientAddHom {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) (hr : 1 ≤ r) : - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) r) →+ F.residueField := + Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) r) →+ F.residueField := (principalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi r hr).toAddMonoidHom.comp { toFun := fun x => Additive.ofMul @@ -363,10 +387,13 @@ 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + (n : ℕ) (hn : 1 ≤ n) (x : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = 0 ↔ ((x : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := by let e := principalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn let q := principalUnitSuccQuotMk F.toCompleteDVF n x @@ -448,7 +475,8 @@ noncomputable def principalUnitOneAddUniformizerPowAtLevel {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n := principalUnitOneAddOfMemPowSubgroup F.toCompleteDVF hn (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r) (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r).property @@ -464,7 +492,8 @@ F.valuationSubring) = 1 + r * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : (((principalUnitOneAddUniformizerPowAtLevel F hpi n hn r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubring) = 1 + r * pi ^ n := by rw [principalUnitOneAddUniformizerPowAtLevel, principalUnitOneAddOfMemPowSubgroup_val, @@ -499,18 +528,24 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] {n : ℕ} (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) - (hx : (x : F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) + (hx : (x : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : (((x ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff + F.toCompleteDVF n (x : F.valuationSubringˣ)).1 hx have hapow : ((((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ^ @@ -520,7 +555,8 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul simpa [pow_mul] using h have heq : ((((x ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubring) - 1) = (((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ^ (F.residueCharacteristic ^ s) := by @@ -541,10 +577,13 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul /-- Inclusion `U^n -> U^1`. -/ def higherUnitToFirst (F : LocalField.{u, v} K) (n : ℕ) (hn : 1 ≤ n) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 := + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 := ⟨(x : F.valuationSubringˣ), - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hn x.property⟩ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hn x.property⟩ /-- Proves the bound `1 ≤ n * F.residueCharacteristic ^ s`. -/ theorem one_le_mul_residueCharacteristic_pow @@ -560,10 +599,13 @@ noncomputable def principalUnitFrobeniusAtLevel (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := ⟨((higherUnitToFirst F n hn x) ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1), + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1), pow_residueCharacteristic_pow_mem_higher_mul F s (higherUnitToFirst F n hn x) x.property⟩ @@ -599,7 +641,8 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -617,7 +660,8 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) let r : F.valuationSubring := residueTeichmullerLift F.toCompleteDVF lead - let y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + let y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n := principalUnitOneAddUniformizerPowAtLevel F hpi n hn r have hyLead : principalUnitLeadingCoefficientAddHom F hpi n hn @@ -634,11 +678,16 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul y) exact hyLead.symm have hxyDeep : - (((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := + (((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF n x y).1 hxyQuot - let d : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := - ⟨((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ), hxyDeep⟩ + let d : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1) := + ⟨((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -649,9 +698,13 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius have hdPow' : ((((higherUnitToFirst F (n + 1) (Nat.succ_le_succ (Nat.zero_le n)) d) ^ q : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hlevel (by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hlevel (by simpa [q] using hdPow) have hpowQuot : principalUnitSuccQuotMk F.toCompleteDVF m @@ -662,8 +715,11 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius change (((principalUnitFrobeniusAtLevel F n hn s x / principalUnitFrobeniusAtLevel F n hn s y : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) m) : F.valuationSubringˣ) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) m) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) simpa [principalUnitFrobeniusAtLevel, higherUnitToFirst, d, q, m, div_pow] using hdPow' have hleadEq : @@ -729,7 +785,8 @@ theorem principalUnitLeadingCoefficientAddHom_padicSmul_iwasawaSeed have hxk : xk = (iwasawaSeedAtLevel F hpi r hr i) ^ k := by apply Subtype.ext exact congrArg - (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) + (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) (principalUnitPadic_nsmul_eq_pow F k (iwasawaSeed F hpi r hr i)) change @@ -764,7 +821,8 @@ noncomputable def iwasawaGn (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) : (Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) →ₗ[ℤ_[F.residueCharacteristic]] - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) := + Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) := Fintype.linearCombination ℤ_[F.residueCharacteristic] (fun i => Additive.ofMul (iwasawaSeed F hpi n hn i)) @@ -793,8 +851,10 @@ theorem iwasawaGn_mem_higher (n : ℕ) (hn : 1 ≤ n) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : ((Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n := by classical rw [iwasawaGn_apply] induction (Finset.univ : Finset (Fin (iwasawaResidueRank F))) @@ -805,13 +865,18 @@ theorem iwasawaGn_mem_higher change ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) * + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) * ((Additive.toMul (∑ j ∈ s, a j • Additive.ofMul (iwasawaSeed F hpi n hn j)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n - apply (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n).mul_mem - · exact LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n + apply (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n).mul_mem + · exact + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher F hn (a i) (iwasawaSeed F hpi n hn i) (iwasawaSeedAtLevel F hpi n hn i).property · exact ih @@ -823,9 +888,11 @@ noncomputable def iwasawaGnAtLevel (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n := ⟨(Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1), + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1), iwasawaGn_mem_higher F hpi n hn a⟩ /-- @@ -848,24 +915,28 @@ theorem additive_iwasawaGnAtLevel_eq_sum apply Subtype.ext change ((Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) := by intro s induction s using Finset.induction_on with | empty => rfl @@ -874,19 +945,23 @@ theorem additive_iwasawaGnAtLevel_eq_sum change ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) * _ = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) * _ = ((principalUnitPadicSmulAtLevel F n hn (a i) (iwasawaSeed F hpi n hn i) (iwasawaSeedAtLevel F hpi n hn i).property : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) * _ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) * _ have hfirst : ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = ((principalUnitPadicSmulAtLevel F n hn (a i) (iwasawaSeed F hpi n hn i) (iwasawaSeedAtLevel F hpi n hn i).property : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) := rfl + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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))) @@ -953,7 +1028,8 @@ noncomputable def iwasawaGnScaledAtLevel (iwasawaGn F hpi n hn ((F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • a)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1), by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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)) @@ -975,7 +1051,8 @@ theorem iwasawaGnScaledAtLevel_eq_frobenius (iwasawaGnAtLevel F hpi n hn a) := by apply Subtype.ext exact congrArg - (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) + (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) (iwasawaGn_residueCharacteristic_pow_smul_eq_pow F hpi n hn s a) /-- The coefficient congruence: @@ -1007,15 +1084,18 @@ theorem exists_iwasawaGnScaled_mul_mem_succ {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : ∃ a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic], (((x / iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -1049,8 +1129,10 @@ theorem exists_iwasawaGnScaled_mul_mem_succ rw [principalUnitLeadingCoefficientAddHom_iwasawaGnScaledAtLevel, hcoord, hbeta] change (x / iwasawaGnScaledAtLevel F hpi n hn s a) ∈ - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) m) + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) m) apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF m _).1 rw [map_div] have hquot : @@ -1079,10 +1161,12 @@ theorem iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul (n : ℕ) (hn : 1 ≤ n) (s : ℕ) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : (((iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s + 1) ↔ ∃ b : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic], @@ -1139,10 +1223,12 @@ theorem iwasawa_formula_two ℤ_[F.residueCharacteristic], a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • b) ↔ ¬ (((iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s + 1) := by exact (not_congr (iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul @@ -1179,11 +1265,14 @@ theorem padicInt_eq_zero_of_forall_exists_eq_pow_mul theorem principalUnit_residueCharacteristic_smul_eq_zero (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] - (x : Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1)) + (x : Additive + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1)) (hx : (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • x = 0) : x = 0 := by - let u : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 := Additive.toMul x + let u : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -1194,7 +1283,8 @@ theorem principalUnit_residueCharacteristic_smul_eq_zero let z : K := (((u : F.valuationSubringˣ) : F.valuationSubring) : K) have hpowK : z ^ F.residueCharacteristic = 1 := by simpa [z] using congrArg - (fun w : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + (fun w : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 @@ -1235,10 +1325,12 @@ theorem forall_exists_iwasawaGn_eq_pow_smul_of_eq_zero obtain ⟨b, hab, hb⟩ := ih have hscaledMem : (((iwasawaGnScaledAtLevel F hpi n hn 0 b : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ 0)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ 0 + 1) := by simp [iwasawaGnScaledAtLevel, hb] obtain ⟨c, hbc⟩ := @@ -1375,12 +1467,16 @@ theorem exists_iwasawaGn_mul_mem_succ {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : ∃ a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic], (((x / iwasawaGnAtLevel F hpi n hn a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 := @@ -1404,8 +1500,10 @@ theorem exists_iwasawaGn_mul_mem_succ simp_rw [hcmod] simp [c, lead] change (x / iwasawaGnAtLevel F hpi n hn a) ∈ - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (n + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n) + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n) apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF n _).1 rw [map_div] have hquot : @@ -1625,7 +1723,8 @@ noncomputable def iwasawaDegreeTerm {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (n : ℕ) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 := if hn : 1 ≤ n ∧ Nat.Coprime n F.residueCharacteristic then Additive.toMul (iwasawaGn F hpi n hn.1 @@ -1646,9 +1745,11 @@ theorem iwasawaDegreeTerm_eq_iwasawaGnScaled (F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • b) : ((iwasawaDegreeTerm F hpi a d.1 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) = ((iwasawaGnScaledAtLevel F hpi d.1 d.property.1 s b : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (d.1 * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) := by classical rw [iwasawaDegreeTerm] @@ -1676,14 +1777,19 @@ theorem iwasawaDegreeTerm_mem_higher {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (n : ℕ) : - ((iwasawaDegreeTerm F hpi a n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n := by + ((iwasawaDegreeTerm F hpi a n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) n).one_mem + · exact (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) n).one_mem /-- Establishes the identity `iwasawaDegreeTerm F hpi (0 : iwasawaDomain F) n = 1`. -/ @[simp] theorem iwasawaDegreeTerm_zero @@ -1731,7 +1837,8 @@ noncomputable def iwasawaPartialProduct {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (r : ℕ) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 := + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 := ∏ n ∈ Finset.range (r + 1), iwasawaDegreeTerm F hpi a n /-- A single-block domain element contributes precisely its one `g_n` @@ -1857,12 +1964,16 @@ theorem exists_iwasawaPartialProduct_div_mem_higher [CharP K F.residueCharacteristic] {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) (r : ℕ) : + (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) (r : ℕ) : ∃ a : iwasawaDomain F, (∀ j, r < j.1.1 → a j = 0) ∧ (((x / iwasawaPartialProduct F hpi a r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : - F.valuationSubringˣ) ∈ ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1) := by classical induction r with | zero => @@ -1886,10 +1997,12 @@ theorem exists_iwasawaPartialProduct_div_mem_higher rw [← hdepth] exact Nat.le_mul_of_pos_right n (pow_pos F.residueCharacteristic_prime.pos s) - let z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + let z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := ⟨((x / iwasawaPartialProduct F hpi a r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ), by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ), by simpa [hdepth] using haDeep⟩ obtain ⟨beta, hbeta⟩ := exists_iwasawaGnScaled_mul_mem_succ F hpi n hn s z @@ -1927,20 +2040,24 @@ theorem exists_iwasawaPartialProduct_div_mem_higher rw [hpartial] have hbeta' : (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1 + 1) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) = (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) := by change @@ -1953,7 +2070,8 @@ theorem exists_iwasawaPartialProduct_div_mem_higher (iwasawaPartialProduct F hpi a r : F.valuationSubringˣ) / ((Additive.toMul (iwasawaGn F hpi n hn b) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) exact div_mul_eq_div_div _ _ _ rw [hunitEq] exact hbeta' @@ -1997,9 +2115,13 @@ theorem Internal.principalUnitQuotientCarrier_mk_iwasawaPartialProduct_eq_of_le (N := N) (iwasawaDegreeTerm F hpi a (r + 1))).2 change ((iwasawaDegreeTerm F hpi a (r + 1) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) - exact LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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] @@ -2052,8 +2174,10 @@ theorem Internal.surjective_iwasawaGlobalInverseLimitCarrier_coordinate (iwasawaGlobalInverseLimitCarrier F hpi a).1 r) := by intro q obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1)) q + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1)) q obtain ⟨a, _haSupport, ha⟩ := exists_iwasawaPartialProduct_div_mem_higher F hpi x r refine ⟨a, ?_⟩ @@ -2062,7 +2186,8 @@ theorem Internal.surjective_iwasawaGlobalInverseLimitCarrier_coordinate Internal.principalUnitQuotientCarrier F.toCompleteDVF r) = QuotientGroup.mk x symm - let U := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF + let U := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF exact (U.principalUnitSubquotient_mk_eq_iff_div_mem x (iwasawaPartialProduct F hpi a r)).2 ha @@ -2222,14 +2347,20 @@ theorem Internal.continuous_iwasawaGlobalInverseLimitCarrier let E := Internal.principalUnitHomeomorphInverseLimitCarrier F.toCompleteDVF exact Continuous.subtype_mk (continuous_pi fun r => by - have hcoord : Continuous fun x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + have hcoord : Continuous fun x : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (E x).1 r := ((continuous_apply r).comp continuous_subtype_val).comp E.continuous - change Continuous fun x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + change Continuous fun x : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 => Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF r (Internal.principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF x) at hcoord - have hquot : Continuous fun x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1 => + have hquot : Continuous fun x : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1 => (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk 1 (r + 1) x := by simpa only [principalUnitMulEquivInverseLimitCarrier_apply] using hcoord @@ -2272,8 +2403,10 @@ noncomputable def Internal.iwasawaGlobalInverseLimitCarrierAddHom rw [iwasawaPartialProduct_add] exact map_mul (QuotientGroup.mk' - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1))) _ _ + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (r + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1))) _ _ /-- The Iwasawa compatible family valued in its type-level prodiscrete model. For a local field all coordinate quotients are finite. -/ @@ -2349,7 +2482,8 @@ noncomputable def Internal.iwasawaGlobalAddHom {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : iwasawaDomain F →+ - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) := + Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) := (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm.toAddMonoidHom.comp (iwasawaGlobalInverseLimitCarrierAddHom F hpi) @@ -2402,8 +2536,10 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal (hk : 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic) (hkd : k ≠ d.1) : ((iwasawaDegreeTerm F hpi a k : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) := by classical let e : IwasawaDegree F.residueCharacteristic := ⟨k, hk⟩ by_cases he0 : iwasawaBlock F a e = 0 @@ -2418,7 +2554,8 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal rw [heq, he0] rfl rw [hterm] - exact (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).one_mem + exact (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).one_mem · obtain ⟨t, c, hec, hc⟩ := exists_pow_smul_iwasawaPrimitive_of_ne_zero F (iwasawaBlock F a e) he0 @@ -2437,18 +2574,23 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal Nat.succ_le_of_lt (lt_of_le_of_ne hle hne) have hscaled : (((iwasawaGnScaledAtLevel F hpi e.1 e.property.1 t c : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (e.1 * F.residueCharacteristic ^ t)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hlevel + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1) rw [hterm] exact hscaled @@ -2468,8 +2610,10 @@ theorem iwasawaDegreeTerm_not_mem_succ_of_primitive (hb : IwasawaPrimitive F b) (hm : m = d.1 * F.residueCharacteristic ^ s) : ¬ (((iwasawaDegreeTerm F hpi a d.1 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)) := by + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)) := by have hnotScaled := (iwasawa_formula_two F hpi d.1 d.property.1 s b).1 hb intro htermMem @@ -2506,8 +2650,10 @@ theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero QuotientGroup.mk (iwasawaDegreeTerm F hpi a d.1) := by change (QuotientGroup.mk' - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1))) + ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1))) (∏ k ∈ Finset.range (m + 1), iwasawaDegreeTerm F hpi a k) = QuotientGroup.mk (iwasawaDegreeTerm F hpi a d.1) @@ -2517,13 +2663,17 @@ theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero by_cases hvalid : 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic · apply (QuotientGroup.eq_one_iff - (N := (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1)) + (N := (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) (m + 1)).subgroupOf + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1)) (iwasawaDegreeTerm F hpi a k)).2 change ((iwasawaDegreeTerm F hpi a k : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean index 90f5e9329d..db1910397b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -25,7 +25,8 @@ 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 +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. -/ @@ -80,7 +81,8 @@ subfield. theorem qpadicClosureSubfield_coe (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF (F.qpadicClosureSubfield : Set K) = closure (F.ratSubfield : Set K) := by let : Valued K F.mrangeValueGroup := @@ -106,7 +108,8 @@ theorem ratCast_mem_qpadicClosureSubfield theorem qpadicClosureSubfield_isClosed (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _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 @@ -117,7 +120,8 @@ theorem qpadicClosureSubfield_isClosed theorem ratSubfield_denseRange_in_qpadicClosureSubfield (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF DenseRange (Set.inclusion (show (F.ratSubfield : Set K) ⊆ @@ -137,7 +141,8 @@ 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF IsClosed (E : Set K)) (hRat : F.ratSubfield ≤ E) : F.qpadicClosureSubfield ≤ E := by @@ -150,14 +155,15 @@ theorem qpadicClosureSubfield_le_of_ratSubfield_le theorem qpadicClosureSubfield_completeSpace (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF CompleteSpace F.qpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace K := F.mrangeRestrict_completeSpace exact @@ -211,7 +217,8 @@ theorem ratCastWithValToQpadicClosureSubfield_apply 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 ↔ + _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 @@ -221,11 +228,13 @@ theorem mrangeRestrict_valuation_ratCast_le_one_iff_padicValuation_le_one 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) = + (_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 ↔ + 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 @@ -234,13 +243,16 @@ theorem ratCast_preimage_mrangeRestrict_valuationSubring_eq_padicValuationSubrin 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 + ((_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₁ := (_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 ↔ + 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 @@ -254,25 +266,29 @@ theorem mrangeRestrict_exists_residueCharacteristic_pow_lt_unit _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 + 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)) + (_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) < + _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 + _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⁻¹ := @@ -294,7 +310,8 @@ theorem mrangeRestrict_exists_residueCharacteristic_pow_lt_unit theorem ratCastWithValToK_uniformContinuous (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF UniformContinuous ((Rat.castHom K).comp (WithVal.equiv @@ -354,8 +371,10 @@ theorem ratCastWithValToK_uniformContinuous 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 + _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 := @@ -381,7 +400,8 @@ 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF IsUniformInducing ((Rat.castHom K).comp (WithVal.equiv @@ -429,7 +449,8 @@ theorem ratCastWithValToK_isUniformInducing 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 + _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' @@ -448,8 +469,10 @@ theorem ratCastWithValToK_isUniformInducing 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 + _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 @@ -473,7 +496,8 @@ 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF UniformContinuous F.ratCastWithValToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -488,7 +512,8 @@ 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF IsUniformInducing F.ratCastWithValToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -508,7 +533,8 @@ theorem ratCastWithValToQpadicClosureSubfield_isUniformInducing theorem ratCastWithValToQpadicClosureSubfield_denseRange (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF DenseRange F.ratCastWithValToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -549,7 +575,8 @@ candidate. -/ theorem ratCastToQpadicClosureSubfield_denseRange (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF DenseRange F.ratCastToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -568,7 +595,7 @@ noncomputable def qpadicCompletionToQpadicClosureSubfield letI : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF haveI : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace exact @@ -588,7 +615,7 @@ theorem qpadicCompletionToQpadicClosureSubfield_coe let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace exact @@ -601,14 +628,15 @@ theorem qpadicCompletionToQpadicClosureSubfield_coe theorem qpadicCompletionToQpadicClosureSubfield_isUniformInducing (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsUniformInducing F.qpadicCompletionToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace simpa [qpadicCompletionToQpadicClosureSubfield, @@ -622,14 +650,15 @@ candidate. -/ theorem qpadicCompletionToQpadicClosureSubfield_denseRange (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF DenseRange F.qpadicCompletionToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF apply DenseRange.of_comp (g := fun q : WithVal (Rat.padicValuation F.residueCharacteristic) => (q : (Rat.padicValuation F.residueCharacteristic).Completion)) @@ -701,14 +730,15 @@ map. -/ theorem qpadicNumbersToQpadicClosureSubfield_isUniformInducing (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsUniformInducing F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hcomp : IsUniformInducing (F.qpadicCompletionToQpadicClosureSubfield ∘ @@ -740,14 +770,15 @@ theorem qpadicNumbersToQpadicClosureSubfield_isUniformInducing theorem qpadicNumbersToQpadicClosureSubfield_isClosed_range (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsClosed (Set.range F.qpadicNumbersToQpadicClosureSubfield) := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hEmbedding : IsUniformEmbedding F.qpadicNumbersToQpadicClosureSubfield := ⟨F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing, @@ -758,14 +789,15 @@ theorem qpadicNumbersToQpadicClosureSubfield_isClosed_range theorem qpadicNumbersToQpadicClosureSubfield_denseRange (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF DenseRange F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF apply DenseRange.of_comp (g := ((↑) : ℚ → ℚ_[F.residueCharacteristic])) have hfun : @@ -782,14 +814,15 @@ surjective. -/ theorem qpadicNumbersToQpadicClosureSubfield_surjective (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF Function.Surjective F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF rw [← Set.range_eq_univ] have hdense := F.qpadicNumbersToQpadicClosureSubfield_denseRange have hclosed := F.qpadicNumbersToQpadicClosureSubfield_isClosed_range @@ -829,12 +862,13 @@ theorem qpadicNumbersEquivQpadicClosureSubfield_ratCast /-- The closed `Qp` candidate has the induced nontrivial normed-field structure. The residue characteristic itself has norm different from one. -/ @[implicit_reducible] -noncomputable def qpadicClosureSubfield_nontriviallyNormedField +noncomputable def qpadicClosureSubfieldNontriviallyNormedField (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF NontriviallyNormedField F.qpadicClosureSubfield := by letI : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -844,10 +878,10 @@ noncomputable def qpadicClosureSubfield_nontriviallyNormedField (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F.toCompleteDVF).RankOne exact - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_rankOne + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let pSub : F.qpadicClosureSubfield := F.ratCastToQpadicClosureSubfield (F.residueCharacteristic : ℚ) have hpSub_coe : @@ -879,21 +913,22 @@ noncomputable def qpadicClosureSubfield_nontriviallyNormedField /-- The ambient local field is a normed algebra over the closed `Qp` candidate, using the induced subfield norm. -/ @[implicit_reducible] -noncomputable def qpadicClosureSubfield_normedAlgebra +noncomputable def qpadicClosureSubfieldNormedAlgebra (F : LocalField.{u, v} K) [CharZero K] : letI : Valued K F.mrangeValueGroup := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField F.qpadicClosureSubfield := - F.qpadicClosureSubfield_nontriviallyNormedField + F.qpadicClosureSubfieldNontriviallyNormedField NormedAlgebra F.qpadicClosureSubfield K := by letI : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField F.qpadicClosureSubfield := - F.qpadicClosureSubfield_nontriviallyNormedField + F.qpadicClosureSubfieldNontriviallyNormedField exact { (inferInstance : Algebra F.qpadicClosureSubfield K) with norm_smul_le := fun a x => by @@ -905,22 +940,23 @@ 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 + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField F.qpadicClosureSubfield := - F.qpadicClosureSubfield_nontriviallyNormedField + F.qpadicClosureSubfieldNontriviallyNormedField letI : NormedAlgebra F.qpadicClosureSubfield K := - F.qpadicClosureSubfield_normedAlgebra + F.qpadicClosureSubfieldNormedAlgebra FiniteDimensional F.qpadicClosureSubfield K := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField F.qpadicClosureSubfield := - F.qpadicClosureSubfield_nontriviallyNormedField + F.qpadicClosureSubfieldNontriviallyNormedField let : NormedAlgebra F.qpadicClosureSubfield K := - F.qpadicClosureSubfield_normedAlgebra + F.qpadicClosureSubfieldNormedAlgebra have : ProperSpace K := F.mrangeRestrict_properSpace have : CompleteSpace F.qpadicClosureSubfield := @@ -980,11 +1016,11 @@ theorem finiteDimensional_over_qpadicNumbers let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField F.qpadicClosureSubfield := - F.qpadicClosureSubfield_nontriviallyNormedField + F.qpadicClosureSubfieldNontriviallyNormedField let : NormedAlgebra F.qpadicClosureSubfield K := - F.qpadicClosureSubfield_normedAlgebra + F.qpadicClosureSubfieldNormedAlgebra have : FiniteDimensional F.qpadicClosureSubfield K := F.finiteDimensional_over_qpadicClosureSubfield have hcompat : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index 93842b93ad..1c030ce2c5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -86,7 +86,8 @@ structure FiniteRankTorsionData 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 +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 @@ -164,7 +165,7 @@ theorem finite_rank_and_torsion_projection_of_surjective /-- Consume a finite quotient setup and forget the concrete quotient map from the result type. -/ -noncomputable def finite_rank_torsion_data_of_setup +noncomputable def finiteRankTorsionDataOfSetup {R M Q : Type*} [CommRing R] [IsDomain R] [IsPrincipalIdealRing R] [AddCommGroup M] [AddCommGroup Q] [Module R M] [Module R Q] @@ -270,7 +271,9 @@ theorem mixed_principalUnitSuccKernelData 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedQPadicContext F := mixedQPadicContext F letI : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -280,7 +283,9 @@ theorem mixed_principalUnitSuccKernelData 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) let : MixedQPadicContext F := mixedQPadicContext F let : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -293,13 +298,14 @@ theorem mixed_principalUnitSuccKernelData 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)) + (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) := - mixed_deepPrincipalUnitLinearEquivPi + mixedDeepPrincipalUnitLinearEquivPi v hv (n + 1) hlevelSucc let higher := F.principalUnitSuccPadicSubmodule n let eHigher : deep ≃ₗ[R] higher := @@ -319,9 +325,10 @@ theorem mixed_principalUnitSuccKernelData moduleFree := hHigherFree finrank := hrankHigher } -/-- The finite quotient map in the mixed-characteristic field-unit structure theorem, with the deep logarithmic +/-- 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 mixed_firstPrincipalUnitFiniteQuotientSetup +noncomputable def mixedFirstPrincipalUnitFiniteQuotientSetup (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -334,7 +341,9 @@ noncomputable def mixed_firstPrincipalUnitFiniteQuotientSetup 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedQPadicContext F := mixedQPadicContext F letI : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -348,7 +357,9 @@ noncomputable def mixed_firstPrincipalUnitFiniteQuotientSetup 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedQPadicContext F := mixedQPadicContext F letI : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -364,7 +375,8 @@ noncomputable def mixed_firstPrincipalUnitFiniteQuotientSetup letI : Finite q := inferInstance letI : Module.Finite R q := Module.Finite.of_finite let projection : M →ₗ[R] q := F.principalUnitQuotientProjectionLinear n - let U := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration + let U := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF let quotientKernel := (U.principalUnitSubgroup (n + 1)).subgroupOf (U.principalUnitSubgroup 1) @@ -400,10 +412,11 @@ noncomputable def mixed_firstPrincipalUnitFiniteQuotientSetup kernelFinrank := hrankN quotientTorsion := hqTorsion } -/-- Algebraic data for the first principal units in the mixed-characteristic field-unit structure theorem. +/-- 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 chosenMixed_firstPrincipalUnitAlgebraicData +noncomputable def chosenMixedFirstPrincipalUnitAlgebraicData (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -416,7 +429,9 @@ noncomputable def chosenMixed_firstPrincipalUnitAlgebraicData 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedQPadicContext F := mixedQPadicContext F letI : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -425,7 +440,9 @@ noncomputable def chosenMixed_firstPrincipalUnitAlgebraicData 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 M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedQPadicContext F := mixedQPadicContext F letI : Module R M := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadicModule F @@ -438,10 +455,10 @@ noncomputable def chosenMixed_firstPrincipalUnitAlgebraicData letI : Finite q := inferInstance letI : Module.Finite R q := Module.Finite.of_finite let setup := - mixed_firstPrincipalUnitFiniteQuotientSetup + mixedFirstPrincipalUnitFiniteQuotientSetup v hv n hlevel let exactData : FiniteRankTorsionData R M q d := - finite_rank_torsion_data_of_setup d setup + finiteRankTorsionDataOfSetup d setup letI : Module.Finite R M := exactData.moduleFinite let T := Submodule.torsion R M letI hTAddCommGroup : AddCommGroup T := Submodule.addCommGroup T @@ -449,9 +466,11 @@ noncomputable def chosenMixed_firstPrincipalUnitAlgebraicData letI hTModule : Module R T := Submodule.module T letI : Finite T := exactData.finiteTorsion letI hqAddGroup : AddGroup q := inferInstance - let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 + let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 let valuationUnitsToFieldUnits := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + F.toCompleteDVF let principalToField : U1 →* K := (Units.coeHom K).comp (valuationUnitsToFieldUnits.comp U1.subtype) @@ -486,10 +505,11 @@ noncomputable def chosenMixed_firstPrincipalUnitAlgebraicData cardTorsion := hcard finrankFree := exactData.finrankFree } -/-- The mixed-characteristic field-unit structure theorem, principal-unit factor in its literal algebraic and +/-- 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 mixed_firstPrincipalUnitStructure +noncomputable def mixedFirstPrincipalUnitStructure (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -508,11 +528,14 @@ noncomputable def mixed_firstPrincipalUnitStructure Multiplicative (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 := by + 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) + let M := Additive + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) letI : MixedWithZeroValuationContext v := mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v @@ -521,7 +544,7 @@ noncomputable def mixed_firstPrincipalUnitStructure letI : AddCommGroup T := Submodule.addCommGroup T letI : Module R T := Submodule.module T let data := - chosenMixed_firstPrincipalUnitAlgebraicData + chosenMixedFirstPrincipalUnitAlgebraicData v hv n hlevel letI : Module.Finite R M := data.moduleFinite letI : Finite T := data.finiteTorsion @@ -537,10 +560,11 @@ noncomputable def mixed_firstPrincipalUnitStructure 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 +/-- 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 chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation +noncomputable def chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -554,14 +578,15 @@ noncomputable def chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation Multiplicative (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 := by + 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 mixed_firstPrincipalUnitStructure + exact mixedFirstPrincipalUnitStructure v hv n (by simpa [F] using hn) end LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean index 56c5ece10a..dac41d545e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -66,7 +66,8 @@ instance mixedWithZeroValuationContextIntegralAlgebra MixedIntegralAlgebraContext (ofWithZeroValuation v) := ctx.integralAlgebra -/-! ### Continuity for the normalized valuation used by the deep exponential–logarithm equivalence -/ +/-! ### 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`. -/ @@ -92,7 +93,7 @@ theorem continuous_qpadicNumbersAlgebra_ofWithZeroValuation (algebraMap ℚ_[p] K) := by let : Valued K F.mrangeValueGroup := restricted let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF change Continuous (fun x : ℚ_[p] => ((F.qpadicNumbersEquivQpadicClosureSubfield x : @@ -193,13 +194,14 @@ 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)] [CharZero K] : + [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 + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := by let F : LocalField.{u, 0} K := ofWithZeroValuation v let : MixedWithZeroValuationContext v := mixedWithZeroValuationContext v @@ -220,19 +222,23 @@ theorem continuousSMul_padicInt_higherPrincipalUnit_ofWithZeroValuation mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr ContinuousSMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := by + (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)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr let : ContinuousSMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := continuousSMul_padicInt_firstPrincipalUnit_ofWithZeroValuation v have hinc : Continuous (F.higherPrincipalUnitAddToFirst hr) := by apply Continuous.subtype_mk @@ -258,7 +264,7 @@ theorem continuousSMul_padicInt_higherPrincipalUnit_ofWithZeroValuation /-- The integral-basis coordinates on a maximal-ideal power are a homeomorphism for the direct normalized valuation topology. -/ -noncomputable def mixed_maximalIdealPowHomeomorphPi_ofWithZeroValuation +noncomputable def mixedMaximalIdealPowHomeomorphPiOfWithZeroValuation (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -346,7 +352,7 @@ theorem mixed_one_le_of_log_level /-- The logarithm direction of the deep exponential–logarithm equivalence, written as a topological additive equivalence `U^n ≃ₜ+ m^n`. -/ -noncomputable def mixed_deepLogContinuousAddEquiv +noncomputable def mixedDeepLogContinuousAddEquiv (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -360,7 +366,8 @@ noncomputable def mixed_deepLogContinuousAddEquiv letI : MixedWithZeroValuationContext v := mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n) ≃ₜ+ + 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 @@ -385,20 +392,22 @@ theorem mixed_deepLog_map_natCast_smul (n : ℚ)) (m : ℕ) (x : Additive - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup ((ofWithZeroValuation v).toCompleteDVF) n)) : + (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)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn - mixed_deepLogContinuousAddEquiv + mixedDeepLogContinuousAddEquiv v hv n hlevel ((m : ℤ_[F.residueCharacteristic]) • x) = (m : ℤ_[F.residueCharacteristic]) • - mixed_deepLogContinuousAddEquiv + 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 @@ -406,22 +415,23 @@ theorem mixed_deepLog_map_natCast_smul mixedWithZeroValuationContext v let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (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 - (mixed_deepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom (m • x) = m • - (mixed_deepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom x + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom x exact - (mixed_deepLogContinuousAddEquiv v hv n hlevel).toAddEquiv.toAddMonoidHom.map_nsmul + (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 mixed_deepLogLinearEquiv +noncomputable def mixedDeepLogLinearEquiv (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -437,9 +447,11 @@ noncomputable def mixed_deepLogLinearEquiv mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n) ≃ₗ[ + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₗ[ ℤ_[F.residueCharacteristic]] ((F.toCompleteDVF.maximalIdeal ^ n : Ideal F.toCompleteDVF.valuationSubring)) := by @@ -449,16 +461,18 @@ noncomputable def mixed_deepLogLinearEquiv mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn letI : ContinuousSMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (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 := mixed_deepLogContinuousAddEquiv + let e := mixedDeepLogContinuousAddEquiv v hv n hlevel exact padicLinearEquivOfContinuousAddEquiv e.toAddEquiv e.continuous @@ -480,28 +494,32 @@ theorem mixed_deepPrincipalUnit_moduleFinite mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn Module.Finite ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := by + (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)) := + (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 - (mixed_deepLogLinearEquiv + (mixedDeepLogLinearEquiv v hv n hlevel).symm -/-- Integral-basis coordinates after logarithm give the algebraic coordinate isomorphism `U^n ≃ Z_p^d`. -/ -noncomputable def mixed_deepPrincipalUnitLinearEquivPi +/-- 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] @@ -517,9 +535,11 @@ noncomputable def mixed_deepPrincipalUnitLinearEquivPi mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n) ≃ₗ[ + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n) ≃ₗ[ ℤ_[F.residueCharacteristic]] (Fin (Module.finrank ℚ_[F.residueCharacteristic] K) → ℤ_[F.residueCharacteristic]) := by @@ -529,16 +549,17 @@ noncomputable def mixed_deepPrincipalUnitLinearEquivPi mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) n)) := F.higherPrincipalUnitPadicModule hn exact - (mixed_deepLogLinearEquiv + (mixedDeepLogLinearEquiv v hv n hlevel).trans - (F.mixed_maximalIdealPowLinearEquivPi n) + (F.mixedMaximalIdealPowLinearEquivPi n) /-- The same coordinate identification is a homeomorphism, as asserted explicitly in the mixed-characteristic field-unit structure theorem. -/ -noncomputable def mixed_deepPrincipalUnitHomeomorphPi +noncomputable def mixedDeepPrincipalUnitHomeomorphPi (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) [ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete v] [Finite (IsLocalRing.ResidueField v.valuationSubring)] [CharZero K] @@ -552,7 +573,8 @@ noncomputable def mixed_deepPrincipalUnitHomeomorphPi letI : MixedWithZeroValuationContext v := mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) n) ≃ₜ + 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 @@ -560,9 +582,9 @@ noncomputable def mixed_deepPrincipalUnitHomeomorphPi mixedWithZeroValuationContext v letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v exact - (mixed_deepLogContinuousAddEquiv + (mixedDeepLogContinuousAddEquiv v hv n hlevel).toHomeomorph.trans - (mixed_maximalIdealPowHomeomorphPi_ofWithZeroValuation + (mixedMaximalIdealPowHomeomorphPiOfWithZeroValuation v n) end LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean index 43d414d938..73be4f370a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -20,7 +20,8 @@ import Mathlib.Topology.Algebra.Module.Compact 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` +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. -/ @@ -110,7 +111,7 @@ theorem qpadicInt_algebraMap_mem_valuationSubring let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hcontinuous : Continuous (algebraMap ℚ_[p] K) := by change Continuous (fun x : ℚ_[p] => @@ -123,7 +124,8 @@ theorem qpadicInt_algebraMap_mem_valuationSubring _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 + {x : K | _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F.toCompleteDVF x ≤ 1} := by have hset : {x : K | _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict @@ -155,7 +157,8 @@ theorem qpadicInt_algebraMap_mem_valuationSubring 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' + 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 @@ -269,7 +272,8 @@ instance mixedQPadicContextValuationSubringTower 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. -/ +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 @@ -279,7 +283,8 @@ theorem valuationSubring_isIntegralClosure_over_qpadicIntegers let p : ℕ := F.residueCharacteristic let : MixedQPadicContext F := mixedQPadicContext F let : Algebra.IsSeparable ℚ_[p] K := by infer_instance - exact _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_isIntegralClosure_of_finite_separable + exact + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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 @@ -293,7 +298,8 @@ theorem valuationSubring_moduleFinite_over_qpadicIntegers let p : ℕ := F.residueCharacteristic let : MixedQPadicContext F := mixedQPadicContext F let : Algebra.IsSeparable ℚ_[p] K := by infer_instance - exact _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + exact + _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.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. -/ @@ -523,7 +529,8 @@ theorem valuationSubring_isIntegralClosure_over_padicInt 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 +/-- 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] : @@ -616,7 +623,7 @@ noncomputable instance mixedIntegralLatticeContextModuleFree F.mixed_valuationSubring_moduleFree /-- A concrete integral basis indexed by the field degree `d = [K:Q_p]`. -/ -noncomputable def mixed_integralBasis +noncomputable def mixedIntegralBasis (F : LocalField.{u, v} K) [CharZero K] : letI : MixedIntegralLatticeContext F := mixedIntegralLatticeContext F @@ -630,7 +637,7 @@ noncomputable def mixed_integralBasis /-- Coordinate form of the integral basis used in the free factor of the mixed-characteristic field-unit structure theorem. -/ -noncomputable def mixed_valuationSubringLinearEquivPi +noncomputable def mixedValuationSubringLinearEquivPi (F : LocalField.{u, v} K) [CharZero K] : letI : MixedIntegralLatticeContext F := mixedIntegralLatticeContext F @@ -640,7 +647,7 @@ noncomputable def mixed_valuationSubringLinearEquivPi let p : ℕ := F.residueCharacteristic letI : MixedIntegralLatticeContext F := mixedIntegralLatticeContext F - exact F.mixed_integralBasis.equivFun + exact F.mixedIntegralBasis.equivFun /-- Every power of the maximal ideal is a finite `Z_p`-module. -/ theorem mixed_maximalIdealPow_moduleFinite @@ -765,7 +772,7 @@ theorem mixed_maximalIdealPow_finrank Ideal F.toCompleteDVF.valuationSubring)) = Module.finrank ℤ_[p] F.toCompleteDVF.valuationSubring := by exact Ideal.finrank_eq_finrank - F.mixed_integralBasis + F.mixedIntegralBasis (F.toCompleteDVF.maximalIdeal ^ n) (pow_ne_zero n F.toCompleteDVF.maximalIdeal_ne_bot) _ = Module.finrank ℚ_[p] K := @@ -773,7 +780,7 @@ theorem mixed_maximalIdealPow_finrank /-- Coordinate form for a deep additive ideal, the source side of the deep exponential–logarithm equivalence. -/ -noncomputable def mixed_maximalIdealPowLinearEquivPi +noncomputable def mixedMaximalIdealPowLinearEquivPi (F : LocalField.{u, v} K) [CharZero K] (n : ℕ) : letI : MixedIntegralLatticeContext F := mixedIntegralLatticeContext F @@ -800,10 +807,13 @@ noncomputable def mixed_maximalIdealPowLinearEquivPi /-- 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 + 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⟩ + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone + F.toCompleteDVF hr x.property⟩ map_one' := rfl map_mul' _ _ := rfl @@ -814,14 +824,17 @@ theorem higherPrincipalUnitToFirst_injective intro x y hxy apply Subtype.ext exact congrArg - (fun z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 => + (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) := + 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)`. -/ @@ -839,11 +852,14 @@ subgroup `U^r`. -/ noncomputable def higherPrincipalUnitPadicSMul (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : SMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) where + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) where smul a x := by - let x1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 := + let x1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1 := F.higherPrincipalUnitToFirst hr (Additive.toMul x) - let y1 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1 := + 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 @@ -854,9 +870,11 @@ noncomputable def higherPrincipalUnitPadicSMul theorem higherPrincipalUnitAddToFirst_smul (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) (a : ℤ_[F.residueCharacteristic]) - (x : Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) : + (x : Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) : letI : SMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicSMul hr F.higherPrincipalUnitAddToFirst hr (a • x) = a • F.higherPrincipalUnitAddToFirst hr x := by @@ -867,9 +885,11 @@ theorem higherPrincipalUnitAddToFirst_smul noncomputable def higherPrincipalUnitPadicModule (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := by + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := by letI : SMul ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicSMul hr exact Module.ofMinimalAxioms (fun a x y => by @@ -877,15 +897,18 @@ noncomputable def higherPrincipalUnitPadicModule simp only [map_add, F.higherPrincipalUnitAddToFirst_smul] exact smul_add a (F.higherPrincipalUnitAddToFirst hr x : - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1)) + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) (F.higherPrincipalUnitAddToFirst hr y : - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1))) + 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))) + 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]) @@ -896,14 +919,17 @@ noncomputable def higherPrincipalUnitPadicModule /-- 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) : + (m : ℕ) (x : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) : letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (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)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr apply F.higherPrincipalUnitAddToFirst_injective hr rw [F.higherPrincipalUnitAddToFirst_smul] @@ -916,13 +942,17 @@ theorem higherPrincipalUnitPadic_natCast_smul noncomputable def higherPrincipalUnitLinearToFirst (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r) →ₗ[ + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r) →ₗ[ ℤ_[F.residueCharacteristic]] - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) := by + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) := by letI : Module ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr exact { F.higherPrincipalUnitAddToFirst hr with @@ -932,23 +962,30 @@ noncomputable def higherPrincipalUnitLinearToFirst noncomputable def higherPrincipalUnitPadicSubmodule (F : LocalField.{u, v} K) {r : ℕ} (hr : 1 ≤ r) : Submodule ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1)) where + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) where carrier := {x | ((Additive.toMul x : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ) ∈ - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r} + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r} zero_mem' := by change (1 : F.toCompleteDVF.valuationSubringˣ) ∈ - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r + 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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ) * ((Additive.toMul y : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ)) ∈ - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r exact Subgroup.mul_mem _ hx hy smul_mem' a x hx := CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher @@ -960,19 +997,23 @@ 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)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := F.higherPrincipalUnitPadicModule hr - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) r) ≃ₗ[ + 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)) := + (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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ), x.2⟩ left_inv := fun x => by apply Additive.toMul.injective @@ -994,7 +1035,8 @@ noncomputable def higherPrincipalUnitLinearEquivPadicSubmodule `Z_p`-linear map. -/ noncomputable def principalUnitQuotientProjectionLinear (F : LocalField.{u, v} K) (n : ℕ) : - Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) →ₗ[ + Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) →ₗ[ ℤ_[F.residueCharacteristic]] CompleteDVF.higherPrincipalUnitGroup.DiscretePrincipalUnitQuotient F.toCompleteDVF n := @@ -1007,7 +1049,8 @@ noncomputable def principalUnitQuotientProjectionLinear noncomputable def principalUnitSuccPadicSubmodule (F : LocalField.{u, v} K) (n : ℕ) : Submodule ℤ_[F.residueCharacteristic] - (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1)) := + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1)) := F.higherPrincipalUnitPadicSubmodule (Nat.succ_le_succ (Nat.zero_le n)) @@ -1023,9 +1066,12 @@ theorem principalUnitQuotientProjectionLinear_ker ext x rw [LinearMap.mem_ker] change (F.principalUnitQuotientProjectionLinear n) x = 0 ↔ - ((Additive.toMul x : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) : + ((Additive.toMul x : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ) ∈ - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) (n + 1) + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) (n + 1) constructor · intro hx have hxq : @@ -1048,9 +1094,11 @@ theorem principalUnitQuotientProjectionLinear_ker have hxtomul := congrArg Additive.toMul hxadd simpa using hxtomul have hxmem : ((Additive.toMul x : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) 1) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) 1) : F.toCompleteDVF.valuationSubringˣ) ∈ - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (F.toCompleteDVF) (n + 1) := by + 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)) @@ -1118,15 +1166,18 @@ 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)) _ _ + (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)) := + (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 + (Additive (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (F.toCompleteDVF) r)) := hfinite exact Module.Finite.equiv (F.higherPrincipalUnitLinearEquivPadicSubmodule hr) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean index e08faf70dc..02fd81ed27 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean @@ -272,7 +272,7 @@ noncomputable def quotientZeroSubgroupEquivValueSubgroup : Establishes the identity `V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) = V.valuationHom.rangeRestrict x`. -/ -@[simp] theorem quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : +theorem quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) = V.valuationHom.rangeRestrict x := @@ -282,7 +282,7 @@ V.zeroSubgroup x) = V.valuationHom.rangeRestrict x`. Establishes the identity `((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAdd (V.val x)`. -/ -@[simp] theorem coe_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : +theorem coe_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : ((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ) = @@ -294,7 +294,7 @@ V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAd Establishes the identity `Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : Multiplicative ℤ)) = V.val x`. -/ -@[simp] theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_mk (x : G) : Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup x) : V.valueSubgroup) : @@ -306,7 +306,7 @@ Establishes the identity `Multiplicative.toAdd (((V.quotientZeroSubgroupEquivVal (QuotientGroup.mk' V.zeroSubgroup (x / y)) : V.valueSubgroup) : Multiplicative ℤ)) = V.val x - V.val y`. -/ -@[simp] theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_div_mk +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_div_mk (x y : G) : Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup @@ -414,13 +414,13 @@ theorem exists_uniformizer_of_surjective (hV : Function.Surjective V.val) : V.hasUniformizer_of_surjective hV /-- `val_uniformizer` satisfies the integer-power formula `V.val (ϖ ^ n) = n`. -/ -@[simp] theorem val_uniformizer_zpow {ϖ : G} (hϖ : V.IsUniformizer ϖ) +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 : ℤ)`. -/ -@[simp] theorem val_uniformizer_pow {ϖ : G} (hϖ : V.IsUniformizer ϖ) +theorem val_uniformizer_pow {ϖ : G} (hϖ : V.IsUniformizer ϖ) (n : ℕ) : V.val (ϖ ^ n) = (n : ℤ) := by simpa using V.val_uniformizer_zpow hϖ (n : ℤ) @@ -472,7 +472,7 @@ noncomputable def quotientZeroSubgroupEquivMultiplicativeIntOfUniformizer `((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAdd n`. -/ -@[simp] theorem coe_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow +theorem coe_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow {ϖ : G} (hϖ : V.IsUniformizer ϖ) (n : ℤ) : ((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : @@ -485,7 +485,7 @@ V.valueSubgroup) : Multiplicative ℤ) = Multiplicative.ofAdd n`. `Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' V.zeroSubgroup (ϖ ^ n)) : V.valueSubgroup) : Multiplicative ℤ)) = n`. -/ -@[simp] theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_uniformizer_zpow {ϖ : G} (hϖ : V.IsUniformizer ϖ) (n : ℤ) : Multiplicative.toAdd (((V.quotientZeroSubgroupEquivValueSubgroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean index c197fc3654..2a8b3267b9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -42,7 +42,7 @@ vH.val x`. `valuation_apply` satisfies the division formula `vG.val (N.toHom (x / y)) = (N.residueDegree : ℤ) * (vH.val x - vH.val y)`. -/ -@[simp] theorem valuation_apply_div (x y : H) : +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] @@ -51,7 +51,7 @@ vH.val x`. `valuation_apply_uniformizer` satisfies the integer-power formula `vG.val (N.toHom (ϖH ^ n)) = (N.residueDegree : ℤ) * n`. -/ -@[simp] theorem valuation_apply_uniformizer_zpow {ϖH : H} +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] @@ -60,7 +60,7 @@ vH.val x`. `valuation_apply_uniformizer` satisfies the natural-power formula `vG.val (N.toHom (ϖH ^ n)) = (N.residueDegree : ℤ) * (n : ℤ)`. -/ -@[simp] theorem valuation_apply_uniformizer_pow {ϖH : H} +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] @@ -69,7 +69,7 @@ vH.val x`. `valuation_apply_zeroSubgroup_mul_uniformizer` satisfies the integer-power formula `vG.val (N.toHom (u * ϖH ^ n)) = (N.residueDegree : ℤ) * n`. -/ -@[simp] theorem valuation_apply_zeroSubgroup_mul_uniformizer_zpow +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 @@ -79,7 +79,7 @@ vH.val x`. `valuation_apply_zeroSubgroup_mul_uniformizer` satisfies the natural-power formula `vG.val (N.toHom (u * ϖH ^ n)) = (N.residueDegree : ℤ) * (n : ℤ)`. -/ -@[simp] theorem valuation_apply_zeroSubgroup_mul_uniformizer_pow +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)) = @@ -92,7 +92,7 @@ vH.val x`. Establishes the identity `vG.valuationHom (N.toHom x) = vH.valuationHom x ^ (N.residueDegree : ℤ)`. -/ -@[simp] theorem valuationHom_apply_norm (x : H) : +theorem valuationHom_apply_norm (x : H) : vG.valuationHom (N.toHom x) = vH.valuationHom x ^ (N.residueDegree : ℤ) := by rw [MultiplicativeIntegerValuation.valuationHom_apply, @@ -105,7 +105,7 @@ Establishes the identity `vG.valuationHom (N.toHom x) = vH.valuationHom x ^ (N.r Establishes the identity `Multiplicative.toAdd (vG.valuationHom (N.toHom x)) = (N.residueDegree : ℤ) * Multiplicative.toAdd (vH.valuationHom x)`. -/ -@[simp] theorem toAdd_valuationHom_apply_norm (x : H) : +theorem toAdd_valuationHom_apply_norm (x : H) : Multiplicative.toAdd (vG.valuationHom (N.toHom x)) = (N.residueDegree : ℤ) * Multiplicative.toAdd (vH.valuationHom x) := by @@ -117,7 +117,7 @@ Establishes the identity `Multiplicative.toAdd (vG.valuationHom (N.toHom x)) = ( `valuationHom_apply_norm` satisfies the division formula `vG.valuationHom (N.toHom (x / y)) = vH.valuationHom (x / y) ^ (N.residueDegree : ℤ)`. -/ -@[simp] theorem valuationHom_apply_norm_div (x y : H) : +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) @@ -191,7 +191,7 @@ Establishes the identity `((vG.quotientZeroSubgroupEquivValueSubgroup (QuotientG vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : Multiplicative ℤ) = vH.valuationHom x ^ (N.residueDegree : ℤ)`. -/ -@[simp] theorem coe_quotientZeroSubgroupEquivValueSubgroup_norm_mk +theorem coe_quotientZeroSubgroupEquivValueSubgroup_norm_mk (x : H) : ((vG.quotientZeroSubgroupEquivValueSubgroup (QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : @@ -205,7 +205,7 @@ Establishes the identity `Multiplicative.toAdd (((vG.quotientZeroSubgroupEquivVa (QuotientGroup.mk' vG.zeroSubgroup (N.toHom x)) : vG.valueSubgroup) : Multiplicative ℤ)) = (N.residueDegree : ℤ) * vH.val x`. -/ -@[simp] theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_norm_mk +theorem toAdd_quotientZeroSubgroupEquivValueSubgroup_norm_mk (x : H) : Multiplicative.toAdd (((vG.quotientZeroSubgroupEquivValueSubgroup @@ -467,7 +467,7 @@ Establishes the identity `N.zeroSubgroupQuotientToValueModResidueDegree (Quotien vG.zeroSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (vG.valuationHom x)`. -/ -@[simp] theorem zeroSubgroupQuotientToValueModResidueDegree_mk (x : G) : +theorem zeroSubgroupQuotientToValueModResidueDegree_mk (x : G) : N.zeroSubgroupQuotientToValueModResidueDegree (QuotientGroup.mk' vG.zeroSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) @@ -688,7 +688,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivValueModRes (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = N.zeroSubgroupQuotientToValueModResidueDegree q`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (q : G ⧸ vG.zeroSubgroup) : N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG @@ -707,7 +707,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivValueModRes QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val x))`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_mk_mk {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG (QuotientGroup.mk' N.residueDegreeClassSubgroup @@ -723,7 +723,7 @@ hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (vG.val x))) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_val +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_val {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (x : G) : (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) @@ -753,7 +753,7 @@ hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) n)) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup (ϖG ^ n))`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : (N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG).symm (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) @@ -1073,7 +1073,7 @@ integer-power formula `N.zeroQuotientModuloResidueDegreeClassEquivValueModResidu ((QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_uniformizerClass_zpow +theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_uniformizerClass_zpow {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : N.zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree hϖG ((QuotientGroup.mk' N.residueDegreeClassSubgroup @@ -1094,7 +1094,6 @@ satisfies the integer-power formula (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass_zpow {ϖG : G} (hϖG : vG.IsUniformizer ϖG) (n : ℤ) : @@ -1180,7 +1179,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormClass h (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) @@ -1195,7 +1194,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormClass h (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)) = QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_mk_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : @@ -1211,7 +1210,7 @@ Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q) = QuotientGroup.mk' N.residueDegreeClassSubgroup q`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) @@ -1237,7 +1236,7 @@ Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_mk_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : @@ -1254,7 +1253,7 @@ formula `N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖH hzero ((Quoti N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_uniformizerClass_zpow +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1279,7 +1278,7 @@ integer-power formula `(N.zeroQuotientModuloResidueDegreeClassEquivNormClass hϖ ((QuotientGroup.mk' N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_uniformizerClass_zpow +theorem zeroQuotientModuloResidueDegreeClassEquivNormClass_symm_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1311,7 +1310,7 @@ def zeroSubgroupQuotientToNormQuotient [(N.normSubgroup).Normal] Establishes the identity `N.zeroSubgroupQuotientToNormQuotient hzero (QuotientGroup.mk' vG.zeroSubgroup x) = QuotientGroup.mk' N.normSubgroup x`. -/ -@[simp] theorem zeroSubgroupQuotientToNormQuotient_mk +theorem zeroSubgroupQuotientToNormQuotient_mk [(N.normSubgroup).Normal] (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : N.zeroSubgroupQuotientToNormQuotient hzero @@ -1458,7 +1457,7 @@ noncomputable def zeroQuotientModuloNormClassEquivNormQuotient Establishes the identity `N.zeroQuotientModuloNormClassEquivNormQuotient hzero (QuotientGroup.mk' N.normSubgroupClassInZeroQuotient q) = N.zeroSubgroupQuotientToNormQuotient hzero q`. -/ -@[simp] theorem zeroQuotientModuloNormClassEquivNormQuotient_mk +theorem zeroQuotientModuloNormClassEquivNormQuotient_mk [(N.normSubgroup).Normal] (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (q : G ⧸ vG.zeroSubgroup) : @@ -1478,7 +1477,7 @@ Establishes the identity `N.zeroQuotientModuloNormClassEquivNormQuotient hzero ( N.normSubgroupClassInZeroQuotient (QuotientGroup.mk' vG.zeroSubgroup x)) = QuotientGroup.mk' N.normSubgroup x`. -/ -@[simp] theorem zeroQuotientModuloNormClassEquivNormQuotient_mk_mk +theorem zeroQuotientModuloNormClassEquivNormQuotient_mk_mk [(N.normSubgroup).Normal] (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : N.zeroQuotientModuloNormClassEquivNormQuotient hzero @@ -1504,7 +1503,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotien (QuotientGroup.mk' N.residueDegreeClassSubgroup q) = N.zeroSubgroupQuotientToNormQuotient hzero q`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) @@ -1527,7 +1526,7 @@ Establishes the identity `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotien (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)) = QuotientGroup.mk' N.normSubgroup x`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : @@ -1543,7 +1542,7 @@ Establishes the identity `(N.zeroQuotientModuloResidueDegreeClassEquivNormQuotie (QuotientGroup.mk' N.normSubgroup x) = QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x)`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_mk +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_mk [(N.normSubgroup).Normal] {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) (x : G) : @@ -1572,7 +1571,7 @@ integer-power formula `N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient h ((QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n) = (QuotientGroup.mk' N.normSubgroup ϖG) ^ n`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_uniformizerClass_zpow +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1595,7 +1594,7 @@ integer-power formula `(N.zeroQuotientModuloResidueDegreeClassEquivNormQuotient ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = (QuotientGroup.mk' N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup ϖG)) ^ n`. -/ -@[simp] theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_uniformizerClass_zpow +theorem zeroQuotientModuloResidueDegreeClassEquivNormQuotient_symm_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1770,7 +1769,7 @@ Establishes the identity `N.normQuotientEquivValueModResidueDegree hϖG hϖH hze (QuotientGroup.mk' N.normSubgroup x) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (vG.valuationHom x)`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_mk +theorem normQuotientEquivValueModResidueDegree_mk [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1808,7 +1807,7 @@ theorem normQuotientEquivValueModResidueDegree_mk_ofAdd `N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup (ϖG ^ n)) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_uniformizer_zpow +theorem normQuotientEquivValueModResidueDegree_uniformizer_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1826,7 +1825,7 @@ Establishes the identity `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hz (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val x))) = QuotientGroup.mk' N.normSubgroup x`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_symm_mk_val +theorem normQuotientEquivValueModResidueDegree_symm_mk_val [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1856,7 +1855,7 @@ Establishes the identity `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hz (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = QuotientGroup.mk' N.normSubgroup (ϖG ^ n)`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd +theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1872,7 +1871,7 @@ QuotientGroup.mk' N.normSubgroup (ϖG ^ n)`. /-- Compatibility of the natural map `G/G⁰ → G/N` with the value-modulo residue-degree map. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_zeroSubgroupQuotientToNormQuotient_mk +theorem normQuotientEquivValueModResidueDegree_zeroSubgroupQuotientToNormQuotient_mk [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -1889,7 +1888,6 @@ residue-degree map. -/ /-- 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. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk [(N.normSubgroup).Normal] @@ -1922,7 +1920,6 @@ Establishes the identity `N.normQuotientEquivValueModResidueDegree hϖG hϖH hze N.residueDegreeClassSubgroup (QuotientGroup.mk' vG.zeroSubgroup x))) = QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd (vG.val x))`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_zeroQuotientModuloResidueDegreeClassEquivNormQuotient_mk_mk [(N.normSubgroup).Normal] @@ -2269,7 +2266,7 @@ theorem normQuotient_closure_uniformizerClass_eq_top /-- 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. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_uniformizerClass_zpow +theorem normQuotientEquivValueModResidueDegree_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -2288,7 +2285,7 @@ integer-power formula `(N.normQuotientEquivValueModResidueDegree hϖG hϖH hzero (QuotientGroup.mk' (integerMultipleSubgroup (N.residueDegree : ℤ)) (Multiplicative.ofAdd n)) = (QuotientGroup.mk' N.normSubgroup ϖG) ^ n`. -/ -@[simp] theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass_zpow +theorem normQuotientEquivValueModResidueDegree_symm_mk_ofAdd_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -2317,7 +2314,7 @@ noncomputable def normQuotientEquivZMod Establishes the identity `N.normQuotientEquivZMod hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup x) = Multiplicative.ofAdd ((vG.val x : ℤ) : ZMod N.residueDegree)`. -/ -@[simp] theorem normQuotientEquivZMod_mk +theorem normQuotientEquivZMod_mk [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -2334,7 +2331,7 @@ x) = Multiplicative.ofAdd ((vG.val x : ℤ) : ZMod N.residueDegree)`. hϖG hϖH hzero (QuotientGroup.mk' N.normSubgroup (ϖG ^ n)) = Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree)`. -/ -@[simp] theorem normQuotientEquivZMod_uniformizer_zpow +theorem normQuotientEquivZMod_uniformizer_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -2350,7 +2347,7 @@ N.residueDegree)`. `N.normQuotientEquivZMod hϖG hϖH hzero ((QuotientGroup.mk' N.normSubgroup ϖG) ^ n) = Multiplicative.ofAdd ((n : ℤ) : ZMod N.residueDegree)`. -/ -@[simp] theorem normQuotientEquivZMod_uniformizerClass_zpow +theorem normQuotientEquivZMod_uniformizerClass_zpow [(N.normSubgroup).Normal] {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) @@ -2384,8 +2381,8 @@ theorem card_normQuotient_eq_residueDegree {ϖG : G} (hϖG : vG.IsUniformizer ϖG) {ϖH : H} (hϖH : vH.IsUniformizer ϖH) (hzero : vG.zeroSubgroup ≤ N.normSubgroup) - [NeZero N.residueDegree] - [Finite (G ⧸ N.normSubgroup)] : + + : Nat.card (G ⧸ N.normSubgroup) = N.residueDegree := by calc Nat.card (G ⧸ N.normSubgroup) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean index 622ea25d87..0be6cccd50 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean @@ -560,7 +560,7 @@ Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivRange UG U (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) = (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict q`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivRange_mk +theorem quotientModuloFiltrationPreimageClassEquivRange_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] @@ -578,7 +578,7 @@ Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivRange UG U (UH.principalUnitSubgroup n) x)) = (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestrict (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivRange_mk_mk +theorem quotientModuloFiltrationPreimageClassEquivRange_mk_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : @@ -597,7 +597,7 @@ 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`. -/ -@[simp] theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk +theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] @@ -620,7 +620,7 @@ n (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) ( n).range) : G ⧸ UG.principalUnitSubgroup (targetLevel n)) = QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) (N.toHom x)`. -/ -@[simp] theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk_mk +theorem coe_quotientModuloFiltrationPreimageClassEquivRange_mk_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : @@ -680,7 +680,7 @@ n).symm ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n).rangeRestr (N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivRange_symm_rangeRestrict_mk +theorem quotientModuloFiltrationPreimageClassEquivRange_symm_rangeRestrict_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] (x : H) : @@ -715,7 +715,7 @@ Establishes the identity `N.quotientModuloFiltrationPreimageClassEquivTargetOfSu targetLevel hN n hSurj (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) q) = quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n q`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] @@ -743,7 +743,7 @@ targetLevel hN n hSurj (QuotientGroup.mk' (N.filtrationPreimageClassInQuotient U n) (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)) = QuotientGroup.mk' (UG.principalUnitSubgroup (targetLevel n)) (N.toHom x)`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk_mk +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_mk_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] @@ -837,7 +837,7 @@ targetLevel hN n hSurj).symm (QuotientGroup.mk' (UG.principalUnitSubgroup (targe (N.toHom x)) = QuotientGroup.mk' (N.filtrationPreimageClassInQuotient UG UH targetLevel n) (QuotientGroup.mk' (UH.principalUnitSubgroup n) x)`. -/ -@[simp] theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_symm_mk +theorem quotientModuloFiltrationPreimageClassEquivTargetOfSurjective_symm_mk (hN : MapsFiltrationLevels N UG UH targetLevel) (n : ℕ) [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] @@ -1004,7 +1004,7 @@ theorem quotientMapOfMapsFiltrationLevels_comp_targetLevelChange [(UH.principalUnitSubgroup n).Normal] [(UG.principalUnitSubgroup (targetLevel n)).Normal] [(UG.principalUnitSubgroup (targetLevel' n)).Normal] : - (UG.quotient_principalUnitSubgroup_mapOfLe (hle n)).comp + (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 @@ -1024,8 +1024,8 @@ theorem quotientMapOfMapsFiltrationLevels_sourceLevelChange [(UG.principalUnitSubgroup (targetLevel n)).Normal] [(UG.principalUnitSubgroup (targetLevel m)).Normal] : (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).comp - (UH.quotient_principalUnitSubgroup_mapOfLe hmn) = - (UG.quotient_principalUnitSubgroup_mapOfLe htarget).comp + (UH.quotientPrincipalUnitSubgroupMapOfLe hmn) = + (UG.quotientPrincipalUnitSubgroupMapOfLe htarget).comp (quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN n) := by apply MonoidHom.ext intro q @@ -1092,10 +1092,10 @@ theorem quotientMapOfMapsFiltrationLevels_surjective_of_sourceLevelChange rcases UG.quotient_principalUnitSubgroup_mapOfLe_surjective htarget z with ⟨y, hy⟩ rcases hSurj y with ⟨x, hx⟩ - refine ⟨UH.quotient_principalUnitSubgroup_mapOfLe hmn x, ?_⟩ + refine ⟨UH.quotientPrincipalUnitSubgroupMapOfLe hmn x, ?_⟩ change ((quotientMapOfMapsFiltrationLevels N UG UH targetLevel hN m).comp - (UH.quotient_principalUnitSubgroup_mapOfLe hmn)) x = z + (UH.quotientPrincipalUnitSubgroupMapOfLe hmn)) x = z rw [N.quotientMapOfMapsFiltrationLevels_sourceLevelChange UG UH targetLevel hN hmn htarget] simp [MonoidHom.comp_apply, hx, hy] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean index ac02329cec..89760dc51a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -251,7 +251,8 @@ theorem padicCompleteDVF_residueField_card 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: +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean index 405d9e8406..d8674035db 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean @@ -13,7 +13,8 @@ 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 +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`. @@ -39,7 +40,7 @@ noncomputable def chosenPadicModuleContinuousAddEquivZModProdFinPi (p : ℕ) [Fact p.Prime] (M : Type u) [TopologicalSpace M] [AddCommGroup M] [Module ℤ_[p] M] [ContinuousAdd M] [ContinuousSMul ℤ_[p] M] - [CompactSpace M] [T2Space M] [Module.Finite ℤ_[p] M] + [T2Space M] [Module.Finite ℤ_[p] M] (a d : ℕ) [Finite (Submodule.torsion ℤ_[p] M)] (hcyclic : IsAddCyclic (Submodule.torsion ℤ_[p] M)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean index be9dd96efa..2114fe5224 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean @@ -10,7 +10,8 @@ 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. +This is the free p-adic factor in the local-field structure theory, the local-field power-index + formula. -/ noncomputable section @@ -311,13 +312,15 @@ 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 + 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 + _ = Nat.card ((powMonoidHom n : (Multiplicative A × Multiplicative B) →* (Multiplicative A × + Multiplicative B)).ker) := by rw [Nat.card_congr (LocalFieldTheory.nthPowerKernelEquivOfMulEquiv (Multiplicative (A × B)) @@ -326,7 +329,8 @@ theorem card_nsmulAddKernel_product (n : ℕ) _ = 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 + _ = 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] @@ -376,7 +380,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure [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)] + (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) = @@ -397,7 +404,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_mixedPrincipalUnitStructure_rational [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)] + (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) : ℚ) = @@ -425,7 +435,10 @@ theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure (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)] + (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ˣ ⧸ @@ -446,7 +459,10 @@ theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_fieldKernel (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)] + (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ˣ ⧸ @@ -467,7 +483,10 @@ theorem card_units_nthPowerQuotient_of_mixedPrincipalUnitStructure_rationalFormu (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)] + (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ˣ ⧸ @@ -498,7 +517,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitStructure [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)] + (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) = @@ -523,7 +545,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitStructure_rational [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)] + (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) : ℚ) = @@ -540,7 +565,10 @@ theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure {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)] + (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ˣ ⧸ @@ -564,7 +592,10 @@ theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure_fieldKernel {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)] + (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ˣ ⧸ @@ -583,7 +614,10 @@ theorem card_units_nthPowerQuotient_of_equalPrincipalUnitStructure_rationalFormu {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)] + (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ˣ ⧸ @@ -606,7 +640,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct [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)] + (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) = @@ -627,7 +664,10 @@ theorem card_units_nthPowerQuotient_of_equalPrincipalUnitProduct {ι : 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)] + (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ˣ ⧸ @@ -657,7 +697,10 @@ theorem card_fieldUnits_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFo [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)] + (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) : ℚ) = @@ -674,7 +717,10 @@ theorem card_units_nthPowerQuotient_of_equalPrincipalUnitProduct_rationalFormula {ι : 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)] + (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ˣ ⧸ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean index 5b37bfe014..4366f72001 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -56,7 +56,10 @@ noncomputable instance finite_valuationSubringUnits_nthPowerKernel 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 + ((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 @@ -70,8 +73,12 @@ 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 + (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ˣ ≃* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -94,12 +101,15 @@ theorem finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits (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)] : + (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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -122,14 +132,15 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_unit_nthPowerQuotient {π : 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)] : + [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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -152,15 +163,23 @@ 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)] : + (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 (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ - (powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) * + (powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1) →* + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) := by let e : F.valuationSubringˣ ≃* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -179,9 +198,11 @@ theorem card_residueRoots_nthPowerQuotient_eq_nthPowerKernel (F : CompleteDVF.{u, v} K) [Finite F.residueField] (n : ℕ) : Nat.card (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ - (powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) = + (powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) = Nat.card - ((powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) := by + ((powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) := by classical let e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ≃* @@ -189,7 +210,8 @@ theorem card_residueRoots_nthPowerQuotient_eq_nthPowerKernel LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F have : - Finite (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + Finite + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ e.symm.toEquiv exact LocalFieldTheory.card_nthPowerQuotient_eq_nthPowerKernel @@ -202,9 +224,13 @@ theorem card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) = Nat.card - ((powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + ((powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * Nat.card - ((powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).ker) := by + ((powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).ker) := by let e : F.valuationSubringˣ ≃* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -229,7 +255,7 @@ theorem card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel let eField : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × @@ -255,9 +281,13 @@ theorem card_fieldUnits_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel (n : ℕ) [NeZero n] : Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) = Nat.card - ((powMonoidHom n : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + ((powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * Nat.card - ((powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).ker) := by + ((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 @@ -270,14 +300,22 @@ theorem card_unit_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuot (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)] : + (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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + ((powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (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] @@ -290,13 +328,23 @@ theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_of_principalUnit_index {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)] + (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) = + (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) : + ((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 @@ -313,13 +361,23 @@ theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_residue_pow {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)] + (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) = + (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) * + ((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) = @@ -337,13 +395,23 @@ theorem card_unit_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_index {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)] + (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) = + (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) : + ((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 @@ -360,13 +428,23 @@ theorem card_unit_nthPowerQuotient_eq_mul_fieldKernel_residue_pow {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)] + (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) = + (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) * + ((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) = @@ -385,14 +463,22 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPow [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)] : + (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 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + ((powMonoidHom n : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + (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 @@ -403,18 +489,23 @@ 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 - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ - (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range)] [Finite ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) : + (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) = + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = Nat.card ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient 1 m) := by @@ -430,7 +521,10 @@ theorem card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq calc Nat.card ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ - (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range) = + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = Nat.card (U.principalUnitSubgroup 1 ⧸ (U.principalUnitSubgroup m).subgroupOf @@ -450,13 +544,24 @@ theorem card_principalUnit_nthPowerQuotient_eq_residue_pow_of_image_eq {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)] + (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)) : + (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) = + (powMonoidHom n : + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) + →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) + 1)).range) = Nat.card F.residueField ^ (m - 1) := by let : Finite ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient @@ -479,15 +584,23 @@ theorem card_principalUnit_nthPowerQuotient_eq_additive_nsmulQuotient_of_logEqui (n : ℕ) [Finite ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ - (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range)] + (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) : + (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) = + (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 + (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 @@ -497,11 +610,15 @@ theorem card_principalUnit_nthPowerKernel_eq_additive_nsmulKernel_of_logEquiv (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) = + (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 + (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 @@ -512,15 +629,22 @@ theorem card_principalUnit_nthPowerQuotient_eq_additive_quotient_of_logEquiv_nsm (n : ℕ) [Finite ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ - (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range)] + (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) + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) (B : AddSubgroup A) - [Finite (A ⧸ B)] + (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) = + (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] @@ -536,17 +660,27 @@ theorem card_principalUnit_nthPowerQuotient_eq_mul_kernel_of_logEquiv (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)] + (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) + (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 + (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] @@ -558,22 +692,31 @@ the local-field power-index formula: after a logarithm identifies `U¹` with 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) [Finite F.residueField] + (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)] + (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) + (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) * + (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 @@ -585,22 +728,38 @@ is trivial. The remaining input is the analytic image calculation 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 : ℕ} [NeZero n] + {n a : ℕ} [Finite ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ - (powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range)] + (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) + ((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 + (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) = + (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) * + ((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 @@ -616,13 +775,23 @@ theorem PowerIndex.unitQuotient_residuePow_of_principalImage {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)] + (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) + ((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 + (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) = @@ -642,10 +811,14 @@ theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_of_logEquiv {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)] + (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) + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) (hadd : Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = Nat.card (LocalFieldTheory.nsmulAddKernel A n) * c) : @@ -666,10 +839,14 @@ theorem card_unit_nthPowerQuotient_eq_mul_unitKernel_residue_pow_of_logEquiv {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)] + (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) + (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) : @@ -691,13 +868,23 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_principalUnit_ind [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)] + (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) = + (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) : + ((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 @@ -717,10 +904,14 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_of_logEquiv [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)] + (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) + (e : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* + Multiplicative A) (hadd : Nat.card (A ⧸ LocalFieldTheory.nsmulAddSubgroup A n) = Nat.card (LocalFieldTheory.nsmulAddKernel A n) * c) : @@ -743,13 +934,23 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_residue_pow [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)] + (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) = + (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) * + ((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 * @@ -769,10 +970,14 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_fieldKernel_residue_pow_of_logEq [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)] + (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) + (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) : @@ -793,13 +998,23 @@ theorem PowerIndex.fieldQuotient_residuePow_of_principalImage [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)] + (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) + ((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 + (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 * diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean index f6267f81fd..7d5f6edd1c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean @@ -8,7 +8,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationF /-! # 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. +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 @@ -83,7 +84,8 @@ theorem Internal.surjective_principalUnitInverseLimitCarrier_of_surjective_coord /-- 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. -/ +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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean index 4ab7e83e5e..e594a3623c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean @@ -39,7 +39,8 @@ 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 + (Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) where smul a x := (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm (a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x) @@ -51,7 +52,8 @@ Establishes the identity `a • x = (principalUnitAddEquivInverseLimitCarrier F. @[simp] theorem principalUnitPadic_smul_def (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) - (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1)) : + (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) : a • x = (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm (a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x) := @@ -62,11 +64,13 @@ local field. -/ noncomputable instance principalUnitPadicModule (F : LocalField.{u, v} K) : Module ℤ_[F.residueCharacteristic] - (Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1)) := + (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 + ((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] @@ -75,7 +79,8 @@ noncomputable instance principalUnitPadicModule (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF y)) (fun (a b : ℤ_[F.residueCharacteristic]) (x : Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1)) => by + ((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] @@ -83,13 +88,15 @@ noncomputable instance principalUnitPadicModule (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x)) (fun (a b : ℤ_[F.residueCharacteristic]) (x : Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1)) => by + ((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 + ((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 @@ -137,10 +144,11 @@ noncomputable def AdicPrincipalUnits.linearEquivUnderlying Establishes the identity `principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF (a • x) = a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x`. -/ -@[simp] theorem Internal.principalUnitAddEquivInverseLimitCarrier_map_smul +theorem Internal.principalUnitAddEquivInverseLimitCarrier_map_smul (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) - (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1)) : + (x : Additive ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1)) : principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF (a • x) = a • principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x := by change @@ -155,10 +163,11 @@ principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF x`. /-- 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`. -/ -@[simp] theorem Internal.principalUnitPadic_smul_carrier_coordinate +theorem Internal.principalUnitPadic_smul_carrier_coordinate (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) - (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) (n : ℕ) : + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) (n : ℕ) : Additive.ofMul ((principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF (Additive.toMul (a • Additive.ofMul x))).1 n) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean index 649c939472..e7020c4240 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean @@ -118,7 +118,6 @@ Establishes the identity `PrincipalUnitProdiscreteLimit.addEquiv F (adicPrincipalUnitsHomeomorphProdiscreteLimit F x) = principalUnitAddEquivInverseLimitCarrier F (AdicPrincipalUnits.addEquiv F x)`. -/ -@[simp] theorem adicPrincipalUnitsHomeomorphProdiscreteLimit_to_addEquiv (F : CompleteDVF.{u, v} K) (x : AdicPrincipalUnits F) : PrincipalUnitProdiscreteLimit.addEquiv F diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean index 81d7d804d8..39512a7e0c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean @@ -38,9 +38,10 @@ variable {K : Type u} [Field K] open Internal /-- Natural p-adic scalars act by the ordinary group powers. -/ -@[simp] theorem principalUnitPadic_natCast_smul +theorem principalUnitPadic_natCast_smul (F : LocalField.{u, v} K) (n : ℕ) - (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) : + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : (n : ℤ_[F.residueCharacteristic]) • Additive.ofMul x = Additive.ofMul (x ^ n) := by calc @@ -51,9 +52,10 @@ open Internal /-- Equivalent multiplicative reading of `principalUnitPadic_natCast_smul`. -/ -@[simp] theorem principalUnitPadic_nsmul_eq_pow +theorem principalUnitPadic_nsmul_eq_pow (F : LocalField.{u, v} K) (n : ℕ) - (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) : + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : Additive.toMul ((n : ℤ_[F.residueCharacteristic]) • Additive.ofMul x) = x ^ n := by exact congrArg Additive.toMul @@ -64,19 +66,25 @@ 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) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) (hx : (x : F.valuationSubringˣ) ∈ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) r) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) r) : ((Additive.toMul (a • Additive.ofMul x) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : F.valuationSubringˣ) ∈ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) r := by + (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 := + let y : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1 := Additive.toMul (a • Additive.ofMul x) have hxq : - (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (n + 1) x = 1 := by exact ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotient_mk_eq_one_iff x).2 @@ -103,15 +111,18 @@ theorem principalUnitPadic_smul_mem_higher F a (Additive.ofMul x)) exact h have hyq : - (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (n + 1) y = 1 := by apply Additive.ofMul.injective calc Additive.ofMul - ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (n + 1) y) = a • Additive.ofMul - ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F.toCompleteDVF).principalUnitSubquotientMk 1 (n + 1) x) := by simpa only [principalUnitMulEquivInverseLimitCarrier_apply] using hcoord _ = a • Additive.ofMul (1 : @@ -133,15 +144,19 @@ 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) + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) (hx : (x : F.valuationSubringˣ) ∈ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) r) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) r) : ((Additive.toMul (((F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b) • Additive.ofMul x) : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) : F.valuationSubringˣ) ∈ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) (r + 1) := by + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) (r + 1) := by have hscalar : ((F.residueCharacteristic : ℤ_[F.residueCharacteristic]) * b) • Additive.ofMul x = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean index 59d5a50cce..d5622aac5d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean @@ -84,7 +84,8 @@ instance Internal.principalUnitQuotientCarrier_finite Finite (Internal.principalUnitQuotientCarrier F.toCompleteDVF n) := by have : Finite (F.valuationSubringˣ ⧸ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) (n + 1)) := + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) (n + 1)) := higherPrincipalUnitGroup.finite_unitsModHigherPrincipalUnitGroup_of_finite_residue F.toCompleteDVF (n + 1) exact Finite.of_injective @@ -250,7 +251,6 @@ noncomputable instance discretePrincipalUnitQuotientPadicModule Establishes the identity `DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n (a • x) = a • DiscretePrincipalUnitQuotient.addEquiv F.toCompleteDVF n x`. -/ -@[simp] theorem DiscretePrincipalUnitQuotient.addEquiv_map_smul (F : LocalField.{u, v} K) (n : ℕ) (a : ℤ_[F.residueCharacteristic]) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean index 9d1820ef17..99960b0097 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean @@ -83,9 +83,11 @@ theorem higherUnitSubgroup_chosenPrincipalUnitPadicUniformizer /-- 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).quotient_principalUnitSubgroup_mapOfLe + 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)`. -/ @@ -93,7 +95,8 @@ abbrev Internal.higherUnitInverseLimitCarrier (F : CompleteDVF.{u, v} K) : Type u := compatibleGroupFamilies (fun n : ℕ => - F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) (fun {_ _} hmn => Internal.higherUnitQuotientTransition F hmn) open Internal @@ -104,7 +107,8 @@ 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) := + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) := QuotientGroup.quotientMulEquivOfEq (higherUnitSubgroup_chosenPrincipalUnitPadicUniformizer F (n + 1)) @@ -132,7 +136,8 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitEquiv F.valuationSubringˣ ⧸ higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) (fun n : ℕ => - F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) (fun {_ _} hmn => dvrHigherUnitQuotientTransition (chosenPrincipalUnitPadicUniformizer F) hmn) @@ -183,7 +188,7 @@ theorem Internal.unitsEquivHigherUnitQuotientInverseLimit_apply exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation change uniformizerHigherUnitQuotientEquiv F n - (dvrHigherUnitQuotientInverseLimit_eval pi n + (dvrHigherUnitQuotientInverseLimitEval pi n (dvrUnitsEquivHigherUnitQuotientInverseLimit hpi x)) = QuotientGroup.mk x rw [dvrUnitsEquivHigherUnitQuotientInverseLimit_apply, @@ -199,7 +204,9 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) := fun _ => ⊥ letI : (n : ℕ) → TopologicalSpace - (F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := fun _ => ⊥ dvrHigherUnitQuotientInverseLimit (chosenPrincipalUnitPadicUniformizer F) ≃ₜ @@ -209,14 +216,16 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic higherUnitSubgroup (chosenPrincipalUnitPadicUniformizer F) (n + 1)) := fun _ => ⊥ letI : (n : ℕ) → TopologicalSpace - (F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + (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)) := + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := fun _ => ⟨rfl⟩ let e := uniformizerHigherUnitInverseLimitEquiv F refine @@ -233,12 +242,12 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic dvrHigherUnitQuotientInverseLimit (chosenPrincipalUnitPadicUniformizer F) => uniformizerHigherUnitQuotientEquiv F n - (dvrHigherUnitQuotientInverseLimit_eval + (dvrHigherUnitQuotientInverseLimitEval (chosenPrincipalUnitPadicUniformizer F) n x) have heval : Continuous fun x : dvrHigherUnitQuotientInverseLimit (chosenPrincipalUnitPadicUniformizer F) => - dvrHigherUnitQuotientInverseLimit_eval + dvrHigherUnitQuotientInverseLimitEval (chosenPrincipalUnitPadicUniformizer F) n x := (DiscreteHigherUnitQuotient.homeomorph (chosenPrincipalUnitPadicUniformizer F) (n + 1)).continuous.comp @@ -250,10 +259,10 @@ noncomputable def Internal.uniformizerHigherUnitInverseLimitHomeomorphIntrinsic intro i j hij change higherUnitQuotientTransition F hij (uniformizerHigherUnitQuotientEquiv F j - (dvrHigherUnitQuotientInverseLimit_eval + (dvrHigherUnitQuotientInverseLimitEval (chosenPrincipalUnitPadicUniformizer F) j x)) = uniformizerHigherUnitQuotientEquiv F i - (dvrHigherUnitQuotientInverseLimit_eval + (dvrHigherUnitQuotientInverseLimitEval (chosenPrincipalUnitPadicUniformizer F) i x) exact (e x).2 hij) · change Continuous fun x => e.symm x @@ -276,14 +285,17 @@ noncomputable def Internal.unitsHomeomorphHigherUnitQuotientInverseLimit letI : TopologicalSpace F.valuationSubring := (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology letI : (n : ℕ) → TopologicalSpace - (F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + (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)) := + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := fun _ => ⊥ letI : (n : ℕ) → TopologicalSpace (F.valuationSubringˣ ⧸ higherUnitSubgroup pi (n + 1)) := @@ -312,7 +324,9 @@ theorem Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply letI : TopologicalSpace F.valuationSubring := (uniformizerPowerIdeal (chosenPrincipalUnitPadicUniformizer F) 1).adicTopology letI : (n : ℕ) → TopologicalSpace - (F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := fun _ => ⊥ (Internal.unitsHomeomorphHigherUnitQuotientInverseLimit F x).1 n = QuotientGroup.mk x := by @@ -320,7 +334,8 @@ theorem Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply let : TopologicalSpace F.valuationSubring := (uniformizerPowerIdeal pi 1).adicTopology let : (n : ℕ) → TopologicalSpace - (F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := + (F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) := fun _ => ⊥ let : (n : ℕ) → TopologicalSpace (F.valuationSubringˣ ⧸ higherUnitSubgroup pi (n + 1)) := @@ -334,7 +349,7 @@ theorem Internal.unitsHomeomorphHigherUnitQuotientInverseLimit_apply rw [hmax] exact ValuationTheory.DiscreteValuationField.Valuation.isAdicComplete F.valuation change uniformizerHigherUnitQuotientEquiv F n - (dvrHigherUnitQuotientInverseLimit_eval pi n + (dvrHigherUnitQuotientInverseLimitEval pi n (unitsEquivHigherUnitQuotientInverseLimitHomeomorph hpi (WithTopology.toTopology (adicUnitsTopology (uniformizerPowerIdeal pi 1)) x))) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean index 6432449d4e..fccf7291ee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean @@ -36,10 +36,12 @@ open Internal noncomputable def Internal.principalUnitQuotientCarrierToFull (F : CompleteDVF.{u, v} K) (n : ℕ) : Internal.principalUnitQuotientCarrier F n →* - F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) := + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1) := ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient 1 (n + 1)).subtype.comp - ((higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientEquivClassInQuotientOfLe + ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubquotientEquivClassInQuotientOfLe (Nat.le_add_left 1 n)).toMonoidHom /-- @@ -55,9 +57,12 @@ Establishes the identity `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 + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) := by exact - (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk (Nat.le_add_left 1 n) x /-- @@ -67,7 +72,8 @@ 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 + ((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 @@ -79,7 +85,8 @@ def Internal.principalUnitToClassInFullQuotient 1 (n + 1) where toFun x := ⟨QuotientGroup.mk (x : F.valuationSubringˣ), - (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubgroupClassInQuotient_mk_mem + (higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).principalUnitSubgroupClassInQuotient_mk_mem x.property⟩ map_one' := by ext; rfl map_mul' x y := by ext; rfl @@ -93,16 +100,19 @@ 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 + ((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 + 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 + exact ((higherPrincipalUnitGroup.toPrincipalUnitFiltration + F).coe_principalUnitSubquotientEquivClassInQuotientOfLe_mk (Nat.le_add_left 1 n) x).symm /-- @@ -171,7 +181,8 @@ Establishes the identity `principalUnitInverseLimitCarrierToFull F F.valuationSubringˣ)`. -/ theorem Internal.principalUnitInverseLimitCarrierToFull_to - (F : CompleteDVF.{u, v} K) (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : + (F : CompleteDVF.{u, v} K) (x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : principalUnitInverseLimitCarrierToFull F (principalUnitToInverseLimitCarrier F x) = unitsEquivHigherUnitQuotientInverseLimit F @@ -206,7 +217,8 @@ noncomputable def Internal.principalUnitInverseLimitCarrierInv rw [← QuotientGroup.eq_one_iff] calc (QuotientGroup.mk (e.symm qfull) : - F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) = + 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] @@ -254,7 +266,9 @@ noncomputable def Internal.principalUnitMulEquivInverseLimitCarrier calc (QuotientGroup.mk (principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ) : - F.valuationSubringˣ ⧸ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + 1)) = + F.valuationSubringˣ ⧸ + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) (n + + 1)) = (unitsEquivHigherUnitQuotientInverseLimit F (principalUnitInverseLimitCarrierInv F q : F.valuationSubringˣ)).1 n := @@ -265,7 +279,8 @@ noncomputable def Internal.principalUnitMulEquivInverseLimitCarrier 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 +/-- 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 @@ -309,15 +324,18 @@ noncomputable def Internal.principalUnitHomeomorphInverseLimitCarrier · 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 => + 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 => + 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 => + 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 := @@ -338,7 +356,8 @@ noncomputable def Internal.principalUnitHomeomorphInverseLimitCarrier Function.invFun f have hdecode : Continuous decode := continuous_of_discreteTopology - have hstage : Continuous fun x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => + have hstage : Continuous fun x : + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => decode (QuotientGroup.mk (x : F.valuationSubringˣ) : F.valuationSubringˣ ⧸ @@ -358,7 +377,8 @@ noncomputable def Internal.principalUnitHomeomorphInverseLimitCarrier rw [← principalUnitQuotientCarrierToFull_mk F n x] exact Function.leftInverse_invFun (principalUnitQuotientCarrierToFull_injective F n) _) - (fun x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 => by + (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 => @@ -419,9 +439,10 @@ The defining evaluation formula for `Internal.principalUnitMulEquivInverseLimitC `principalUnitInverseLimitCarrierEval F n (principalUnitMulEquivInverseLimitCarrier F x) = (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk 1 (n + 1) x`. -/ -@[simp] theorem Internal.principalUnitMulEquivInverseLimitCarrier_apply +theorem Internal.principalUnitMulEquivInverseLimitCarrier_apply (F : CompleteDVF.{u, v} K) - (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) (n : ℕ) : + (x : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) (n + : ℕ) : principalUnitInverseLimitCarrierEval F n (principalUnitMulEquivInverseLimitCarrier F x) = (higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotientMk diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean index 17d0a166a1..e64a5ee03a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean @@ -64,7 +64,7 @@ The defining evaluation formula for `Internal.principalUnitInverseLimitCarrierPa (a • x))) = a • Additive.ofMul (Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF n (Additive.toMul x))`. -/ -@[simp] theorem Internal.principalUnitInverseLimitCarrierPadic_smul_apply +theorem Internal.principalUnitInverseLimitCarrierPadic_smul_apply (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) (x : Additive (Internal.principalUnitInverseLimitCarrier F.toCompleteDVF)) @@ -168,7 +168,6 @@ noncomputable instance principalUnitProdiscreteLimitPadicModule Establishes the identity `PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF (a • x) = a • PrincipalUnitProdiscreteLimit.addEquiv F.toCompleteDVF x`. -/ -@[simp] theorem PrincipalUnitProdiscreteLimit.addEquiv_map_smul (F : LocalField.{u, v} K) (a : ℤ_[F.residueCharacteristic]) (x : PrincipalUnitProdiscreteLimit F.toCompleteDVF) : @@ -180,7 +179,7 @@ theorem PrincipalUnitProdiscreteLimit.addEquiv_map_smul Establishes the identity `PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n (a • x) = a • PrincipalUnitProdiscreteLimit.coordinate F.toCompleteDVF n x`. -/ -@[simp] theorem PrincipalUnitProdiscreteLimit.coordinate_smul +theorem PrincipalUnitProdiscreteLimit.coordinate_smul (F : LocalField.{u, v} K) (n : ℕ) (a : ℤ_[F.residueCharacteristic]) (x : PrincipalUnitProdiscreteLimit F.toCompleteDVF) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean index b290392aa0..2bc3d26ba6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean @@ -44,7 +44,8 @@ noncomputable def adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuat letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v AdicPrincipalUnits F.toCompleteDVF ≃ₜ+ Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) := by + ((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 @@ -180,7 +181,8 @@ theorem principalUnitPadicContinuousSMulOfWithZeroValuation 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 + (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 := @@ -188,7 +190,8 @@ theorem principalUnitPadicContinuousSMulOfWithZeroValuation refine ⟨?_⟩ have hpair : Continuous fun z : ℤ_[F.residueCharacteristic] × Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) => + ((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) @@ -203,7 +206,8 @@ theorem principalUnitPadicContinuousAddOfWithZeroValuation 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 + ((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 := @@ -211,9 +215,11 @@ theorem principalUnitPadicContinuousAddOfWithZeroValuation refine ⟨?_⟩ have hpair : Continuous fun z : Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) × + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + F.toCompleteDVF) 1) × Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1) => + ((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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean index 54b20362ae..9b17719ca0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean @@ -230,7 +230,7 @@ Establishes the identity `unitsModPrincipalUnitEquivOfPreserves F e hmem n (Quot (higherPrincipalUnitGroup F n) u) = QuotientGroup.mk' (higherPrincipalUnitGroup F n) (valuationSubringUnitEquivOfPreserves F e hmem u)`. -/ -@[simp] theorem unitsModPrincipalUnitEquivOfPreserves_mk +theorem unitsModPrincipalUnitEquivOfPreserves_mk (e : K ≃+* K) (hmem : ∀ x : K, diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean index d117f8ac0e..e29eb42a93 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -324,7 +324,7 @@ noncomputable instance unitsModHigherPrincipalUnitGroupFinite finite residue field. The finite instances are derived from the residue field before either natural cardinal is formed. -/ theorem card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits - [Finite F.residueField] (n : ℕ) (hn : 1 ≤ n) : + (n : ℕ) (hn : 1 ≤ n) : Nat.card (F.valuationSubringˣ ⧸ higherPrincipalUnitGroup F n) = Nat.card ((F.valuationSubring ⧸ F.maximalIdeal ^ n)ˣ) := by exact Nat.card_congr @@ -1137,7 +1137,7 @@ noncomputable def principalUnitSuccQuotAddEquivResidueOfUniformizer /-- Cardinality form of the associated-graded identification `U^n/U^(n+1) ≃ k` for `n ≥ 1`. -/ theorem card_principalUnitSuccQuot_eq_residue_of_uniformizer - [Finite F.residueField] + {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) : Nat.card (higherPrincipalUnitGroup.principalUnitSuccQuot F n) = @@ -1231,7 +1231,7 @@ by the principal unit `1 + r * pi^n`. -/ /-- The equivalence `U^n/U^(n+1) ≃ k` sends the coordinate class `[1 + r * pi^n]` to the residue of `r`. -/ -@[simp] theorem principalUnitSuccQuotAddEquivResidueOfUniformizer_coord +theorem principalUnitSuccQuotAddEquivResidueOfUniformizer_coord {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean index 792f705136..a6f5e35db8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean @@ -60,7 +60,7 @@ Establishes the identity `higherPrincipalUnitGroup.unitsModOneEquivResidueFieldU (QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u) = higherPrincipalUnitGroup.residueUnitHom F u`. -/ -@[simp] theorem unitsModOneEquivResidueFieldUnits_mk +theorem unitsModOneEquivResidueFieldUnits_mk (u : F.valuationSubringˣ) : higherPrincipalUnitGroup.unitsModOneEquivResidueFieldUnits F (QuotientGroup.mk' (higherPrincipalUnitGroup F 1) u) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean index c9d4844d6b..f8f84c7b4b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean @@ -40,7 +40,7 @@ variable (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) /-- The `(q - 1)`-st roots of unity in the valuation ring, where `q = #κ`. -/ -abbrev residueRootsOfUnityGroup [Finite F.residueField] : +abbrev residueRootsOfUnityGroup : Subgroup F.valuationSubringˣ := rootsOfUnity (Nat.card F.residueField - 1) F.valuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean index 34088f0246..85237f1d24 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean @@ -558,7 +558,7 @@ Multiplicative.toAdd z.2`. /-- Group-isomorphism form under the standard subgroup equality hypothesis `V.zeroSubgroup = O^*`. -/ -noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_zeroSubgroup_eq_unitGroup +noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup [Finite F.residueField] (V : MultiplicativeIntegerValuation Kˣ) (hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean index 1ee8689be4..e0204242f0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -194,7 +194,7 @@ theorem quotient_principalUnitSubgroup_mk_eq_iff_inv_mul_mem /-- 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 quotient_principalUnitSubgroup_mapOfLe {m n : ℕ} (hmn : m ≤ n) +def quotientPrincipalUnitSubgroupMapOfLe {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] : G ⧸ U.principalUnitSubgroup n →* @@ -205,26 +205,26 @@ def quotient_principalUnitSubgroup_mapOfLe {m n : ℕ} (hmn : m ≤ n) exact U.mem_of_mem_of_le hmn hx) /-- -The defining evaluation formula for `quotient_principalUnitSubgroup_mapOfLe` is -`U.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = QuotientGroup.mk x`. +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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk x) = QuotientGroup.mk x := rfl /-- -Establishes the identity `U.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk' +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.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = QuotientGroup.mk' (U.principalUnitSubgroup m) x := rfl @@ -441,7 +441,7 @@ noncomputable instance principalUnitGradedPieceFinite piece wrapper. -/ theorem card_principalUnitSubquotient_succ_eq_gradedPiece (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] - [Finite (U.principalUnitSubquotient n (n + 1))] : + : Nat.card (U.principalUnitSubquotient n (n + 1)) = Nat.card (U.principalUnitGradedPiece n) := Nat.card_congr (U.principalUnitGradedPieceEquivSubquotient n).symm.toEquiv @@ -596,7 +596,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_mk_eq_one_iff {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (x : G) : - U.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = 1 ↔ + 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 @@ -607,8 +607,8 @@ 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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = - U.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk y) ↔ + 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] @@ -622,8 +622,8 @@ 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.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk x) = - U.quotient_principalUnitSubgroup_mapOfLe hmn (QuotientGroup.mk y) ↔ + 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] @@ -633,7 +633,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_surjective {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] : - Function.Surjective (U.quotient_principalUnitSubgroup_mapOfLe hmn) := by + Function.Surjective (U.quotientPrincipalUnitSubgroupMapOfLe hmn) := by intro q refine QuotientGroup.induction_on q ?_ intro x @@ -645,7 +645,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_range_eq_top {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] : - (U.quotient_principalUnitSubgroup_mapOfLe hmn).range = ⊤ := by + (U.quotientPrincipalUnitSubgroupMapOfLe hmn).range = ⊤ := by rw [MonoidHom.range_eq_top] exact U.quotient_principalUnitSubgroup_mapOfLe_surjective hmn @@ -655,7 +655,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] : - (U.quotient_principalUnitSubgroup_mapOfLe hmn).ker = + (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker = U.principalUnitSubgroupClassInQuotient m n := by exact (QuotientGroup.ker_map (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) (MonoidHom.id G) (by @@ -672,7 +672,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_mem_classInQuotient [(U.principalUnitSubgroup m).Normal] {q : G ⧸ U.principalUnitSubgroup n} (hq : q ∈ U.principalUnitSubgroupClassInQuotient l n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q ∈ + U.quotientPrincipalUnitSubgroupMapOfLe hmn q ∈ U.principalUnitSubgroupClassInQuotient l m := by rcases (U.mem_principalUnitSubgroupClassInQuotient_iff l n q).1 hq with ⟨x, hx, hxq⟩ @@ -686,7 +686,7 @@ def principalUnitClassMapOfLe {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) [(U.principalUnitSubgroup m).Normal] : U.principalUnitSubgroupClassInQuotient l n →* U.principalUnitSubgroupClassInQuotient l m := - ((U.quotient_principalUnitSubgroup_mapOfLe hmn).domRestrict + ((U.quotientPrincipalUnitSubgroupMapOfLe hmn).domRestrict (U.principalUnitSubgroupClassInQuotient l n)).codRestrict (U.principalUnitSubgroupClassInQuotient l m) (by @@ -697,7 +697,7 @@ def principalUnitClassMapOfLe {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) /-- The defining evaluation formula for `principalUnitClassMapOfLe` is `((U.principalUnitClassMapOfLe hlm hmn q : U.principalUnitSubgroupClassInQuotient l m) : G ⧸ U.principalUnitSubgroup m) = -U.quotient_principalUnitSubgroup_mapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n)`. +U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n)`. -/ @[simp] theorem principalUnitClassMapOfLe_apply {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) @@ -707,7 +707,7 @@ U.quotient_principalUnitSubgroup_mapOfLe hmn (q : G ⧸ U.principalUnitSubgroup ((U.principalUnitClassMapOfLe hlm hmn q : U.principalUnitSubgroupClassInQuotient l m) : G ⧸ U.principalUnitSubgroup m) = - U.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n) := rfl @@ -725,7 +725,7 @@ theorem principalUnitClassMapOfLe_ker_eq {l m n : ℕ} · intro hq have hq' := congrArg Subtype.val hq change - U.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n) = 1 at hq' rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn, MonoidHom.mem_ker] @@ -733,7 +733,7 @@ theorem principalUnitClassMapOfLe_ker_eq {l m n : ℕ} · intro hq apply Subtype.ext change - U.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n) = 1 rw [← MonoidHom.mem_ker, U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] @@ -774,7 +774,7 @@ noncomputable def principalUnitClassQuotientKerEquivClassOfLe {l m n : ℕ} Establishes the identity `U.principalUnitClassQuotientKerEquivClassOfLe hlm hmn (QuotientGroup.mk' (U.principalUnitClassMapOfLe hlm hmn).ker q) = U.principalUnitClassMapOfLe hlm hmn q`. -/ -@[simp] theorem principalUnitClassQuotientKerEquivClassOfLe_mk' +theorem principalUnitClassQuotientKerEquivClassOfLe_mk' {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] @@ -858,7 +858,7 @@ theorem card_principalUnitClassInQuotient_eq_mul_of_le {l m n : ℕ} /-- Cardinality form of the class/subquotient identification. -/ theorem card_principalUnitSubquotient_eq_classInQuotient_of_le {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] - [Finite (U.principalUnitSubquotient m n)] + [Finite (U.principalUnitSubgroupClassInQuotient m n)] : Nat.card (U.principalUnitSubquotient m n) = Nat.card (U.principalUnitSubgroupClassInQuotient m n) := by @@ -867,8 +867,8 @@ theorem card_principalUnitSubquotient_eq_classInQuotient_of_le /-- The degenerate subquotient `U^n/U^n` has cardinality one. -/ theorem card_principalUnitSubquotient_self - (n : ℕ) [(U.principalUnitSubgroup n).Normal] - [Finite (U.principalUnitSubquotient n n)] : + (n : ℕ) + : Nat.card (U.principalUnitSubquotient n n) = 1 := by have htop : (U.principalUnitSubgroup n).subgroupOf @@ -952,7 +952,7 @@ theorem card_principalUnitSubquotient_eq_prod_gradedPiece rw [Nat.mul_comm] /-- -Characterizes `q ∈ (U.quotient_principalUnitSubgroup_mapOfLe hmn).ker` by the equivalent condition +Characterizes `q ∈ (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker` by the equivalent condition `q ∈ U.principalUnitSubgroupClassInQuotient m n`. -/ theorem mem_quotient_principalUnitSubgroup_mapOfLe_ker_iff @@ -960,7 +960,7 @@ theorem mem_quotient_principalUnitSubgroup_mapOfLe_ker_iff [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q : G ⧸ U.principalUnitSubgroup n) : - q ∈ (U.quotient_principalUnitSubgroup_mapOfLe hmn).ker ↔ + q ∈ (U.quotientPrincipalUnitSubgroupMapOfLe hmn).ker ↔ q ∈ U.principalUnitSubgroupClassInQuotient m n := by rw [U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] @@ -971,7 +971,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_one_iff_mem_classInQuotient [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = 1 ↔ + U.quotientPrincipalUnitSubgroupMapOfLe hmn q = 1 ↔ q ∈ U.principalUnitSubgroupClassInQuotient m n := by rw [← MonoidHom.mem_ker, U.mem_quotient_principalUnitSubgroup_mapOfLe_ker_iff hmn q] @@ -983,7 +983,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_one_iff_exists_mem_repr [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = 1 ↔ + 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 @@ -997,8 +997,8 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_div_mem_classInQuotient [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q r : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = - U.quotient_principalUnitSubgroup_mapOfLe hmn r ↔ + 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] @@ -1011,8 +1011,8 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_exists_mem_div_repr [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q r : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = - U.quotient_principalUnitSubgroup_mapOfLe hmn r ↔ + 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 @@ -1026,8 +1026,8 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_inv_mul_mem_classInQuotien [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q r : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = - U.quotient_principalUnitSubgroup_mapOfLe hmn r ↔ + 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] @@ -1044,8 +1044,8 @@ theorem quotient_principalUnitSubgroup_mapOfLe_eq_iff_exists_mem_inv_mul_repr [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (q r : G ⧸ U.principalUnitSubgroup n) : - U.quotient_principalUnitSubgroup_mapOfLe hmn q = - U.quotient_principalUnitSubgroup_mapOfLe hmn r ↔ + 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 @@ -1066,7 +1066,7 @@ theorem quotient_principalUnitSubgroup_mk_mem_classInQuotient_iff x ∈ U.principalUnitSubgroup m := by rw [← U.quotient_principalUnitSubgroup_mapOfLe_ker_eq_classInQuotient hmn] change - U.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hmn (QuotientGroup.mk' (U.principalUnitSubgroup n) x) = 1 ↔ x ∈ U.principalUnitSubgroup m rw [U.quotient_principalUnitSubgroup_mapOfLe_apply_mk' hmn x] @@ -1088,9 +1088,9 @@ noncomputable def quotientModuloPrincipalUnitClassEquivQuotientOfLe /-- Establishes the identity `U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn (QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q) = -U.quotient_principalUnitSubgroup_mapOfLe hmn q`. +U.quotientPrincipalUnitSubgroupMapOfLe hmn q`. -/ -@[simp] theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] @@ -1098,12 +1098,12 @@ U.quotient_principalUnitSubgroup_mapOfLe hmn q`. U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hmn (QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) q) = - U.quotient_principalUnitSubgroup_mapOfLe hmn q := by + U.quotientPrincipalUnitSubgroupMapOfLe hmn q := by change QuotientGroup.quotientQuotientEquivQuotientAux (U.principalUnitSubgroup n) (U.principalUnitSubgroup m) (U.principalUnitSubgroup_antitone hmn) q = - U.quotient_principalUnitSubgroup_mapOfLe hmn q + U.quotientPrincipalUnitSubgroupMapOfLe hmn q exact QuotientGroup.quotientQuotientEquivQuotientAux_mk (N := U.principalUnitSubgroup n) @@ -1115,7 +1115,7 @@ Establishes the identity `U.quotientModuloPrincipalUnitClassEquivQuotientOfLe hm (QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' (U.principalUnitSubgroup n) x)) = QuotientGroup.mk' (U.principalUnitSubgroup m) x`. -/ -@[simp] theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk_mk +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_mk_mk {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (x : G) : @@ -1132,7 +1132,7 @@ Establishes the identity `(U.quotientModuloPrincipalUnitClassEquivQuotientOfLe h (QuotientGroup.mk' (U.principalUnitSubgroup m) x) = QuotientGroup.mk' (U.principalUnitSubgroupClassInQuotient m n) (QuotientGroup.mk' (U.principalUnitSubgroup n) x)`. -/ -@[simp] theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_symm_mk +theorem quotientModuloPrincipalUnitClassEquivQuotientOfLe_symm_mk {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] (x : G) : @@ -1294,9 +1294,9 @@ theorem quotient_principalUnitSubgroup_mapOfLe_comp [(U.principalUnitSubgroup n).Normal] [(U.principalUnitSubgroup m).Normal] [(U.principalUnitSubgroup k).Normal] : - (U.quotient_principalUnitSubgroup_mapOfLe hkm).comp - (U.quotient_principalUnitSubgroup_mapOfLe hmn) = - U.quotient_principalUnitSubgroup_mapOfLe (le_trans hkm hmn) := by + (U.quotientPrincipalUnitSubgroupMapOfLe hkm).comp + (U.quotientPrincipalUnitSubgroupMapOfLe hmn) = + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hkm hmn) := by apply MonoidHom.ext intro q refine QuotientGroup.induction_on q ?_ @@ -1306,7 +1306,7 @@ theorem quotient_principalUnitSubgroup_mapOfLe_comp /-- The level-change map for `n ≤ n` is the identity. -/ theorem quotient_principalUnitSubgroup_mapOfLe_refl (n : ℕ) [(U.principalUnitSubgroup n).Normal] : - U.quotient_principalUnitSubgroup_mapOfLe (le_rfl : n ≤ n) = + U.quotientPrincipalUnitSubgroupMapOfLe (le_rfl : n ≤ n) = MonoidHom.id (G ⧸ U.principalUnitSubgroup n) := by apply MonoidHom.ext intro q @@ -1333,7 +1333,7 @@ theorem principalUnitClassMapOfLe_refl intro q apply Subtype.ext change - U.quotient_principalUnitSubgroup_mapOfLe (le_rfl : n ≤ n) + U.quotientPrincipalUnitSubgroupMapOfLe (le_rfl : n ≤ n) (q : G ⧸ U.principalUnitSubgroup n) = (q : G ⧸ U.principalUnitSubgroup n) rw [U.quotient_principalUnitSubgroup_mapOfLe_refl n] @@ -1352,16 +1352,16 @@ theorem principalUnitClassMapOfLe_comp intro q apply Subtype.ext change - U.quotient_principalUnitSubgroup_mapOfLe hlm - (U.quotient_principalUnitSubgroup_mapOfLe hmn + U.quotientPrincipalUnitSubgroupMapOfLe hlm + (U.quotientPrincipalUnitSubgroupMapOfLe hmn (q : G ⧸ U.principalUnitSubgroup n)) = - U.quotient_principalUnitSubgroup_mapOfLe (le_trans hlm hmn) + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hlm hmn) (q : G ⧸ U.principalUnitSubgroup n) change - ((U.quotient_principalUnitSubgroup_mapOfLe hlm).comp - (U.quotient_principalUnitSubgroup_mapOfLe hmn)) + ((U.quotientPrincipalUnitSubgroupMapOfLe hlm).comp + (U.quotientPrincipalUnitSubgroupMapOfLe hmn)) (q : G ⧸ U.principalUnitSubgroup n) = - U.quotient_principalUnitSubgroup_mapOfLe (le_trans hlm hmn) + U.quotientPrincipalUnitSubgroupMapOfLe (le_trans hlm hmn) (q : G ⧸ U.principalUnitSubgroup n) rw [U.quotient_principalUnitSubgroup_mapOfLe_comp hlm hmn] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean index d75651f5b8..81754497c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean @@ -43,14 +43,16 @@ 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 := + ((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 (IsLocalRing.ResidueField + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) := Finite.of_equiv F.residueField (WithZeroValuation.residueFieldEquivMrangeRestrict F.valuation).toEquiv @@ -61,12 +63,15 @@ is preserved by that identification. -/ theorem mrangeRestrict_isAdicComplete (F : CompleteDVF.{u, v} K) : IsAdicComplete - (IsLocalRing.maximalIdeal (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + (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 := + let e : F.valuationSubring ≃+* + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := WithZeroValuation.valuationSubringEquivMrangeRestrict F.valuation - let : Algebra F.valuationSubring (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := + let : Algebra F.valuationSubring + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := e.toRingHom.toAlgebra let eLin : F.valuationSubring ≃ₗ[F.valuationSubring] @@ -80,13 +85,15 @@ theorem mrangeRestrict_isAdicComplete intro a x change e (a * x) = (algebraMap F.valuationSubring - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring a) * e x + (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 F.maximalIdeal + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring := isAdicComplete_of_linearEquiv (M := F.valuationSubring) (N := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) @@ -94,19 +101,27 @@ theorem mrangeRestrict_isAdicComplete have hcompleteMap : IsAdicComplete (F.maximalIdeal.map - (algebraMap F.valuationSubring (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring)) + (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 + (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 + (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) = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict + F).valuationSubring) = IsLocalRing.maximalIdeal (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring exact IsLocalRing.map_ringEquiv_maximalIdeal e @@ -238,7 +253,7 @@ theorem mrangeRestrict_isRankOneDiscrete /-- The range-restricted valuation is rank one as a valuation into its actual value group. -/ @[implicit_reducible] -noncomputable def mrangeRestrict_rankOne +noncomputable def mrangeRestrictRankOne (F : CompleteDVF.{u, v} K) : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne := by haveI : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).IsNontrivial := @@ -247,7 +262,8 @@ noncomputable def mrangeRestrict_rankOne IsCyclic (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) - exact WithZeroValuation.rankOneOfUnitsIsCyclic (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) + exact WithZeroValuation.rankOneOfUnitsIsCyclic + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) end CompleteDVF end LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean index 5bf8fde178..00708be2e3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean @@ -35,7 +35,8 @@ def mrangeRestrict (F : LocalField.{u, v} K) : simpa [G, CompleteDVF.mrangeRestrictCompleteDVF, CompleteDVF.residueField, CompleteDVF.valuationSubring, CompleteDVF.toDVF] using - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_residueField_finite F.toCompleteDVF) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_residueField_finite + F.toCompleteDVF) exact { toCompleteDVF := G } /-- The range-restricted topology attached to a local-field package is proper. -/ @@ -46,7 +47,8 @@ theorem mrangeRestrict_properSpace F.toCompleteDVF.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + F.toCompleteDVF) ProperSpace K := by exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_properSpace_of_residueField_finite F.toCompleteDVF) @@ -59,7 +61,8 @@ theorem mrangeRestrict_completeSpace F.toCompleteDVF.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F.toCompleteDVF) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + F.toCompleteDVF) CompleteSpace K := by exact (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F.toCompleteDVF) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index e726a1803c..b7d960e388 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -48,12 +48,12 @@ private noncomputable def mrangeRestrictValued_rankOne change (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_rankOne F + 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 mrangeRestrict_nontriviallyNormedField +noncomputable def mrangeRestrictNontriviallyNormedField (F : CompleteDVF.{u, v} K) : NontriviallyNormedField K := Valued.toNontriviallyNormedField @@ -70,7 +70,8 @@ theorem mrangeRestrict_exists_uniformizer_pow_lt_unit (gamma : (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)ˣ) : ∃ N : ℕ, - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : F.valuationSubring) : K)) < gamma := by + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : + F.valuationSubring) : K)) < gamma := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom have hπ_ne : @@ -79,14 +80,16 @@ theorem mrangeRestrict_exists_uniformizer_pow_lt_unit 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 + 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) + simpa [Γ] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) have : MulArchimedean Γˣ := WithZeroValuation.isCyclic_mulArchimedean Γˣ have hdelta_inv : (1 : Γˣ) < delta⁻¹ := @@ -98,7 +101,8 @@ theorem mrangeRestrict_exists_uniformizer_pow_lt_unit 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 + (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 @@ -153,7 +157,8 @@ theorem mem_subfield_of_mrangeRestrict_isClosed_of_forall_valuationSubring_smodE apply hgamma have hdiff_le' : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) ((z : K) - (b : K)) ≤ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : F.valuationSubring) : K)) := by + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (((π ^ N : + F.valuationSubring) : K)) := by rw [← Subtype.coe_le_coe] simpa [zInt] using hdiff_le change @@ -187,11 +192,13 @@ def mrangeRestrictCompleteDVF (F : CompleteDVF.{u, v} K) : (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) letI : vK.IsRankOneDiscrete := by - simpa [vK] using (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isRankOneDiscrete F) + 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) + simpa [vK] using + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_isAdicComplete F) letI : ValuationTheory.DiscreteValuationField.Valuation.IsCompleteDiscrete vK := { isRankOneDiscrete := inferInstance isAdicComplete := inferInstance } @@ -207,14 +214,14 @@ theorem mrangeRestrict_integer_isAdic (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (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.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have : IsCyclic Γˣ := by simpa [Γ] using (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_units_isCyclic F) @@ -235,7 +242,7 @@ theorem mrangeRestrict_integer_completeSpace (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) CompleteSpace 𝒪[K] := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom @@ -249,7 +256,7 @@ theorem mrangeRestrict_integer_completeSpace change (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).RankOne exact - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_rankOne F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F) let : NontriviallyNormedField K := Valued.toNontriviallyNormedField (L := K) @@ -264,7 +271,8 @@ theorem mrangeRestrict_integer_completeSpace have hcomplete : IsAdicComplete (𝓂[K]) 𝒪[K] := by change IsAdicComplete - (IsLocalRing.maximalIdeal (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + (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 @@ -278,7 +286,7 @@ theorem mrangeRestrict_integer_compactSpace_of_residueField_finite (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) CompactSpace 𝒪[K] := by let : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := @@ -312,7 +320,8 @@ theorem mrangeRestrict_integer_compactSpace_of_residueField_finite have : Finite 𝓀[K] := by change Finite - (IsLocalRing.ResidueField (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F).valuationSubring) + (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) @@ -330,7 +339,7 @@ theorem mrangeRestrict_properSpace_of_residueField_finite (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) ProperSpace K := by let : Valued K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := @@ -342,10 +351,10 @@ theorem mrangeRestrict_properSpace_of_residueField_finite F.valuation.toMonoidWithZeroHom)).RankOne := mrangeRestrictValued_rankOne F let : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have hcompact : CompactSpace 𝒪[K] := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_compactSpace_of_residueField_finite F) - unfold mrangeRestrict_nontriviallyNormedField + unfold mrangeRestrictNontriviallyNormedField unfold Valued.toNontriviallyNormedField change @ProperSpace K (Valued.toNormedField K @@ -368,13 +377,13 @@ theorem mrangeRestrict_completeSpace_of_residueField_finite (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) letI : NontriviallyNormedField K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F) + (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.mrangeRestrict_nontriviallyNormedField F) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have : ProperSpace K := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_properSpace_of_residueField_finite F) exact complete_of_proper diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean index e6dfc2ee77..668a5e1dd9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean @@ -49,7 +49,8 @@ y) = (CompleteDVF.fieldUnitValueUnit F) x * (CompleteDVF.fieldUnitValueUnit F) y 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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x * + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by ext simp [fieldUnitValueUnit] @@ -68,7 +69,8 @@ theorem exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : ∃ n : ℤ, - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ n = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := by + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ n = + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := by have hxmem : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x ∈ MonoidWithZeroHom.valueGroup @@ -76,7 +78,8 @@ theorem exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit exact MonoidWithZeroHom.mem_valueGroup (MonoidWithZeroHom.ofClass F.valuation) - (show (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x : F.ValueGroup)) ∈ + (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 @@ -131,27 +134,35 @@ noncomputable def multiplicativeIntegerValuationOfUniformizer 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 + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) + hπ).1 rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] simp map_mul x y := by - apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) hπ).1 + 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.uniformizerValueExponent F) hπ (x + * y) = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) (x * y) := by rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] - _ = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x * (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by + _ = (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 + (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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F), (LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + hπ y) := by rw [← zpow_add] /-- @@ -173,7 +184,8 @@ theorem multiplicativeIntegerValuationOfUniformizer_isUniformizer {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.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 + 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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] ext @@ -200,7 +212,8 @@ theorem multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup congrArg (fun γ : F.ValueGroupˣ => (γ : F.ValueGroup)) hvalue simpa [fieldUnitValueUnit] using hvalue'.symm · intro hx - apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) hπ).1 + apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) + hπ).1 rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] ext simp [fieldUnitValueUnit, hx] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean index e59d24f870..5d6ef92acc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean @@ -36,7 +36,8 @@ The defining evaluation formula for `coe_valuationSubringUnitsToFieldUnits` is -/ @[simp] theorem coe_valuationSubringUnitsToFieldUnits_apply (F : CompleteDVF.{u, v} K) (a : F.valuationSubringˣ) : - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F) a : Kˣ) : K) = + (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits F) + a : Kˣ) : K) = (a : F.valuationSubring) := by change ((F.valuation.valuationSubring.unitGroupMulEquiv.symm a : Kˣ) : K) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean index 2eca0097b7..a772b72a1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean @@ -58,7 +58,8 @@ theorem baseUnitGroup_map_le_target_unitGroup theorem baseUnitsMap_valuationSubringUnitsToFieldUnits (a : base.valuationSubringˣ) : baseUnitsMap (K := K) (L := L) - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits base) a) = + ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + base) a) = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits target) (Units.map (integerMap base.toDVF target.toDVF).toMonoidHom a) := by ext @@ -75,7 +76,8 @@ theorem base_uniformizer_image_val_eq_ramificationIndex (vL : MultiplicativeIntegerValuation Lˣ) (hunit : ∀ u : target.valuationSubringˣ, - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits target) u ∈ vL.zeroSubgroup) + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + target) u ∈ vL.zeroSubgroup) {ϖ : base.valuationSubring} {π : target.valuationSubring} (hϖ : base.valuation.IsUniformizer (ϖ : K)) (hπ : target.valuation.IsUniformizer (π : L)) @@ -108,7 +110,8 @@ theorem base_uniformizer_image_val_eq_ramificationIndex simp have hbase : baseUnitsMap (K := K) (L := L) ϖK = - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits target) u * + (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits + target) u * πL ^ ramificationIndex base.toDVF target.toDVF := by ext simpa [ϖK, πL, diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean index 376a165d57..60b674d901 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean @@ -13,7 +13,8 @@ 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 +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. -/ @@ -140,13 +141,15 @@ theorem subgroupValueSubgroup_le_integerMultipleSubgroup_iff exact ⟨x, hx, rfl⟩ have hxmultiple := h hxvalue rw [mem_integerMultipleSubgroup_iff] at hxmultiple - simpa [_root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.valuationHom] + 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] + simpa + [_root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.valuationHom] using h x hx /-- A lower value-step inclusion for a larger subgroup value image restricts to diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean index f47d798c5b..c3bd04c253 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean @@ -52,7 +52,8 @@ 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 + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued + (completeDVF v)).toUniformSpace := by let w := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict (completeDVF v) @@ -78,16 +79,17 @@ theorem completeSpace_ofWithZeroValuation let F : CompleteDVF.{u, 0} K := completeDVF v let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let restrictedNormed : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField F + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F have : Finite F.residueField := by change Finite (IsLocalRing.ResidueField v.valuationSubring) infer_instance have hcomplete : @CompleteSpace K restrictedNormed.toUniformSpace := by - exact _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F + exact + _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F have huniform : direct.toUniformSpace = restrictedNormed.toUniformSpace := by change (Valued.mk' v).toUniformSpace = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField (completeDVF v)).toUniformSpace calc (Valued.mk' v).toUniformSpace = @@ -95,7 +97,7 @@ theorem completeSpace_ofWithZeroValuation (completeDVF v)).toUniformSpace := valuedMk_uniformSpace_eq_mrangeRestrict v _ = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_nontriviallyNormedField + (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField (completeDVF v)).toUniformSpace := by rfl let : Valued K (WithZero (Multiplicative ℤ)) := direct diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean index f60ebfe071..b718378243 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean @@ -50,7 +50,7 @@ noncomputable def continuousCongr /-- The descended equivalence acts on quotient classes through the original equivalence. -/ -@[simp] theorem continuousCongr_mk +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) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean index 4a29458674..eb024873dc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean @@ -49,7 +49,7 @@ def integerMultipleSubgroup (d : ℤ) : Subgroup (Multiplicative ℤ) where /-- Membership of a multiplicative integer in the multiple subgroup is equivalent to divisibility of its additive value. -/ -@[simp] theorem ofAdd_mem_integerMultipleSubgroup_iff (d n : ℤ) : +theorem ofAdd_mem_integerMultipleSubgroup_iff (d n : ℤ) : Multiplicative.ofAdd n ∈ integerMultipleSubgroup d ↔ d ∣ n := by rw [mem_integerMultipleSubgroup_iff, toAdd_ofAdd] @@ -124,7 +124,7 @@ noncomputable def valueModIntegerMultipleSubgroupEquivZMod (d : ℤ) : /-- The quotient-to-`ZMod` equivalence sends a quotient class to reduction of its representative modulo `n`. -/ -@[simp] theorem valueModIntegerMultipleSubgroupEquivZMod_mk +theorem valueModIntegerMultipleSubgroupEquivZMod_mk (d n : ℤ) : valueModIntegerMultipleSubgroupEquivZMod d (QuotientGroup.mk' (integerMultipleSubgroup d) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean index d00fa8461e..74865a9adf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -35,7 +35,6 @@ 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. -/ -@[simp] theorem powMonoidHom_range_one_mem (n : ℕ) : (1 : G) ∈ (powMonoidHom n : G →* G).range := by rw [MonoidHom.mem_range] @@ -152,7 +151,6 @@ def nthPowerQuotientEquivOfMulEquiv (n : ℕ) (e : G ≃* H) : /-- The quotient equivalence induced by a multiplicative equivalence maps each power-class representative to its image. -/ -@[simp] theorem nthPowerQuotientEquivOfMulEquiv_mk (n : ℕ) (e : G ≃* H) (x : G) : nthPowerQuotientEquivOfMulEquiv G H n e (QuotientGroup.mk' ((powMonoidHom n : G →* G).range) x) = @@ -417,7 +415,8 @@ theorem powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup /-- 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 + 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⟩ @@ -455,9 +454,11 @@ theorem cardinal_mk_multiplicativeInt_nthPowerQuotient (n : ℕ) : /-- For nonzero `n`, the multiplicative-integer power quotient has cardinality `n`. -/ theorem card_multiplicativeInt_nthPowerQuotient {n : ℕ} (hn : n ≠ 0) - [Finite (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range)] : + [Finite (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative + ℤ)).range)] : Nat.card - (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) = n := by + (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) = + n := by rw [Nat.card_congr ((QuotientGroup.quotientMulEquivOfEq (powMonoidHom_range_multiplicativeInt_eq_integerMultipleSubgroup n)).trans @@ -538,7 +539,8 @@ theorem cardinal_mk_nthPowerQuotient_eq_of_mulEquiv_units_prod_int 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))) := + (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative + ℤ)).range))) := Cardinal.mk_congr_lift ((nthPowerQuotientEquivOfMulEquiv G (U × Multiplicative ℤ) n e).trans (nthPowerProductQuotientEquiv U (Multiplicative ℤ) n)).toEquiv @@ -590,13 +592,11 @@ abbrev nsmulAddKernel (n : ℕ) : AddSubgroup A := /-- Membership in the image of multiplication by `n` is equivalent to being an `n`-fold additive multiple. -/ -@[simp] 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`. -/ -@[simp] theorem mem_nsmulAddKernel_iff {n : ℕ} {x : A} : x ∈ nsmulAddKernel A n ↔ n • x = 0 := by simp [nsmulAddKernel, AddMonoidHom.mem_ker] @@ -654,8 +654,10 @@ noncomputable instance finite_multiplicative_nthPowerQuotient `powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup`. -/ theorem card_multiplicative_nthPowerQuotient_eq_nsmulAddSubgroup_index (n : ℕ) - [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] : - Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) = + [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative + A)).range)] : + 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)] @@ -668,7 +670,8 @@ theorem card_multiplicative_nthPowerQuotient_eq_additive_nsmulQuotient (n : ℕ) [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] [Finite (A ⧸ nsmulAddSubgroup A n)] : - Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) = + 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] @@ -749,7 +752,8 @@ noncomputable instance finite_nsmulAddKernel_prod (n : ℕ) 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) + ((powMonoidHom n : (Multiplicative A × Multiplicative B) →* (Multiplicative A × + Multiplicative B)).ker) (nthPowerKernelEquivOfMulEquiv (Multiplicative (A × B)) (Multiplicative A × Multiplicative B) n e).symm.toEquiv diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean index ff41c7c0b9..9539b314b3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean @@ -74,7 +74,6 @@ theorem v_mul (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] simp [v, Valuation.map_mul, WithZero.unzero_mul, toAdd_mul] /-- The normalized valuation of the multiplicative identity is zero. -/ -@[simp] theorem v_one (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : v K (Additive.ofMul (1 : Kˣ)) = 0 := by @@ -199,7 +198,6 @@ theorem integerUnitsToFieldUnits_injective simpa [integerUnitsToFieldUnits] using congrArg Units.val hxy /-- A valuation-integer unit has normalized valuation zero as a field unit. -/ -@[simp] 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index 341e59e054..65ddc3de7c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -88,7 +88,8 @@ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_apply σ (x : L) := rfl -/-- The inverse restriction equivalence extends an integer-ring automorphism to the ambient field. -/ +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean index f70d97e798..abcaa70929 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -599,7 +599,6 @@ theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_apply /-- Applying the inverse principal-unit quotient equivalence to a residue representative recovers that residue. -/ -@[simp] theorem principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (ϖ : 𝒪[K]) (hϖ : Irreducible ϖ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean index 894ec67998..f5d66b1ee2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean @@ -153,7 +153,6 @@ def chosenLocalUniformizer Classical.choose (valuationMap_uniformiser K) /-- The chosen local uniformizer has normalized valuation one. -/ -@[simp] theorem chosenLocalUniformizer_spec (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean index ea26db7ebc..75b7413185 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean @@ -223,7 +223,8 @@ def normIntegerUnits ext simp [normIntegerUnitsValue] -/-- Coercing the integer-unit norm to the base field yields the algebra norm of the original unit. -/ +/-- 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) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean index f16fefd264..c55daa97a1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean @@ -24,7 +24,7 @@ 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] [FiniteDimensional M L] : + [IsScalarTower K M L] : localNormSubgroup K L ≤ localNormSubgroup K M := by rintro x ⟨y, rfl⟩ refine ⟨normUnits M L y, ?_⟩ @@ -68,7 +68,7 @@ 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 M] [FiniteDimensional K D] + [FiniteDimensional K D] (i : M →ₐ[K] D) : localNormSubgroup K D ≤ localNormSubgroup K M := by let : Algebra M D := i.toRingHom.toAlgebra diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean index b0ae36b7cf..eab8a59104 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean @@ -46,7 +46,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext v let d := Module.finrank ℚ_[F.residueCharacteristic] K obtain ⟨a, e⟩ := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v (localIntegerValuation_surjective K) let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup @@ -86,7 +86,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero ⟨(F.residueCharacteristic_prime.coprime_iff_not_dvd.mpr hpn).symm⟩ let valuedK : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let e := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenFirstPrincipalUnitStructure_equalCharacteristic + LocalFieldTheory.DiscreteValuationField.LocalField.chosenFirstPrincipalUnitStructureEqualCharacteristic v let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean index 99b6ea61f5..0fb20f204c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -266,7 +266,7 @@ theorem tendsto_neg_pow_succ_of_mem_maximalIdeal /-- 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] [IsUniformAddGroup K] + (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 @@ -453,7 +453,7 @@ theorem principalUnitsCorrectionProduct_sub_mem_of_le /-- 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] [IsUniformAddGroup K] + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (z : ∀ d : Nat, principalUnits K (n + d)) : CauchySeq fun d : Nat => @@ -487,7 +487,7 @@ theorem exists_tendsto_principalUnitsCorrectionProduct /-- 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] [IsUniformAddGroup K] + (K : Type u) [Field K] [ValuativeRel K] [UniformSpace K] [IsNonarchimedeanLocalField K] (n : Nat) (z : ∀ d : Nat, principalUnits K (n + d)) (x : 𝒪[K]) (hx : Tendsto @@ -538,7 +538,8 @@ def principalUnitsSuccIncl (K : Type u) [Field K] [ValuativeRel K] (n : Nat) : intro a b rfl -/-- The inclusion `U^(n+1) → U^n` retains the underlying unit and its stronger filtration witness. -/ +/-- 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)) : @@ -1241,7 +1242,6 @@ theorem finset_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ 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)`. -/ -@[simp] 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean index ce33893159..965285305a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean @@ -63,7 +63,7 @@ theorem localFieldTotallyDisconnectedSpace infer_instance /-- The unit group of the valuation ring of a nonarchimedean local field, as a profinite group. -/ -noncomputable def localUnits_profinite +noncomputable def localUnitsProfinite (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : ProfiniteGrp := by letI : T2Space K := localFieldT2Space K diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean index a59d061e25..a85cc5f991 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean @@ -57,7 +57,8 @@ theorem integerRingMapOfValuationExtension_apply (K L : Type u) /-- 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. -/ +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)] : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean index d9fec17f5b..8ff5f8e0c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean @@ -49,7 +49,7 @@ 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] - [IsScalarTower K L A] [Algebra.IsSeparable K L] : + [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 @@ -61,7 +61,7 @@ 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] [FiniteDimensional K L] + [IsScalarTower K L A] [Algebra.IsSeparable K L] [Normal K A] : IsGalois K (IntermediateField.normalClosure K L A) := by exact diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean index eb6724f20b..be674152e4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean @@ -56,7 +56,8 @@ theorem uniformizerUnitFactor_mul LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi y := by apply integerUnitsToFieldUnits_injective K rw [map_mul] - simp only [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor] + simp only + [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor] rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_mul, zpow_add] simp only [div_eq_mul_inv, mul_inv_rev] ac_rfl @@ -148,7 +149,8 @@ theorem fieldUnitsToIntegerUnitsPrincipalQuotientHom_ker 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 + have hfactor : LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi + pi = 1 := by apply integerUnitsToFieldUnits_injective K rw [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor, hpi] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean index b965643df3..93455bede5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -72,7 +72,8 @@ theorem residueExtensionArithmeticFrobeniusOfValuationExtension_preserves_base let : Algebra.IsAlgebraic 𝓀[K] 𝓀[L] := inferInstance simp [residueExtensionArithmeticFrobeniusOfValuationExtension] -/-- The order of residue arithmetic Frobenius is the degree of the finite residue-field extension. -/ +/-- 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] @@ -137,7 +138,6 @@ noncomputable def arithmeticFrobeniusOfUnramifiedValuation /-- The unramified Galois-residue equivalence lifts residue arithmetic Frobenius to field arithmetic Frobenius. -/ -@[simp] theorem galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure_arithmeticFrobenius (K L : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [Field L] [ValuativeRel L] @@ -340,7 +340,8 @@ theorem arithmeticFrobeniusOfUnramifiedValuation_apply_primitiveRoot _ = (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. -/ +/-- 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] @@ -520,7 +521,8 @@ private theorem zmodCyclicMulEquivOfGenerator_apply_one {G : Type*} [Group G] /-- 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. -/ +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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean index d2ffc2e207..ad641c55aa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean @@ -104,7 +104,6 @@ theorem valuationMap_uniformizerFieldUnit /-- The additive valuation map sends the zero element of the additive unit group to zero. -/ -@[simp] theorem valuationMap_zero (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : valuationMap K (0 : Additive Kˣ) = 0 := @@ -148,7 +147,6 @@ theorem valuationMap_mem_ker_iff (K : Type u) [Field K] [ValuativeRel K] rw [AddMonoidHom.mem_ker, valuationMap_apply] /-- The multiplicative identity, viewed additively, has valuation zero. -/ -@[simp] theorem valuationMap_ofMul_one (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : valuationMap K (Additive.ofMul (1 : Kˣ)) = 0 := by @@ -181,14 +179,16 @@ theorem valuation_eq_one_of_valuationMap_eq_zero (K : Type u) dsimp [v] at hx have hunzero : WithZero.unzero - (x := (_root_.IsNonarchimedeanLocalField.valueGroupWithZeroIsoInt K) (ValuativeRel.valuation K (x : K))) + (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))) + (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 @@ -465,7 +465,6 @@ noncomputable def chosenValuationMapSection (K : Type u) [Field K] [ValuativeRel fun n => Classical.choose (valuationMap_surjective_apply K n) /-- The chosen section of the additive valuation map is a right inverse. -/ -@[simp] theorem chosenValuationMapSection_spec (K : Type u) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : Int) : valuationMap K (chosenValuationMapSection K n) = n := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean index 69fa5a9837..b3d84d0049 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean @@ -26,7 +26,7 @@ valuative relation induced by its distinguished valuation. -/ theorem isValuativeTopology_of_valued_ofValuation (F : Type u) (Γ : Type v) [Field F] [LinearOrderedCommGroupWithZero Γ] - [MulArchimedean Γ] [Valued F Γ] + [Valued F Γ] [Valuation.IsNontrivial (Valued.v : Valuation F Γ)] : letI := ValuativeRel.ofValuation (Valued.v : Valuation F Γ) IsValuativeTopology F := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean index 608bfa94ff..4fddd39767 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean @@ -144,6 +144,7 @@ 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 @@ -190,7 +191,7 @@ theorem padicCyclotomic_finrank_eq_prime_sub_one_mul_pow /-- the totally ramified cyclotomic theorem(ii): the full Galois group is the unit group modulo `p ^ (k + 1)`. -/ -noncomputable def padicCyclotomicTotallyRamified_galoisGroupEquivUnits +noncomputable def padicCyclotomicTotallyRamifiedGaloisGroupEquivUnits (ζ : L) (hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) (hgen : Algebra.adjoin ℚ_[p] ({ζ} : Set L) = ⊤) : (L ≃ₐ[ℚ_[p]] L) ≃* (ZMod (p ^ (k + 1)))ˣ := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean index da884d38d9..e87636b12a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean @@ -26,6 +26,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean index 9104f043a5..91f0f2df5e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean @@ -28,7 +28,9 @@ section CyclotomicExtension variable {p k : ℕ} [Fact p.Prime] variable {L : Type u} [Field L] [Algebra ℚ_[p] L] -local instance padicCyclotomicTotallyRamifiedRamificationEndpointAlgebraPadicInt : 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 : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean index e44c0b2198..42af2a2735 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean @@ -27,6 +27,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean index 18b3be681c..c8a6ac3022 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean @@ -26,6 +26,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean index 0103244257..dd3080e70f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean @@ -26,6 +26,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean index f1a79ad163..ab17ef9953 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationF /-! # 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. +This file maps the Eisenstein unit relation into the target valuation ring and proves `e = [L : + ℚ_[p]]`, together with the uniformizer statement. -/ noncomputable section @@ -29,6 +30,7 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean index e896916ff1..7a6a766af8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean @@ -26,6 +26,7 @@ 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 @@ -39,9 +40,10 @@ 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) = ⊤) - [FiniteDimensional ℚ_[p] L] [Algebra.IsSeparable ℚ_[p] L] + (target : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} L) - [hExt : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.HasExtension + [hExt : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF + p).valuation.HasExtension target.valuation] [hTarget : IsIntegralClosure target.valuationSubring (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L] : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index fc5b00f427..28daf15202 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -103,7 +103,7 @@ theorem padicCyclotomicUnramified_primitiveRoot_isIntegral /-- 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] [Algebra K L] + {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 @@ -178,8 +178,9 @@ 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 padicCyclotomicUnramified_galIntegerRingEquiv - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) +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) @@ -226,12 +227,13 @@ noncomputable def padicCyclotomicUnramified_galIntegerRingEquiv @[simp] theorem padicCyclotomicUnramified_galIntegerRingEquiv_apply - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) + (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) : - ((padicCyclotomicUnramified_galIntegerRingEquiv + ((padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ x : LubinTate.Valuations.exponentialValuationSubring vL) : L) = σ (x : L) := rfl @@ -243,7 +245,8 @@ abbrev padicCyclotomicUnramifiedResidueField {F : Type*} [Field F] /-- The canonical residue-field algebra structure of a valuation extension. -/ @[reducible] noncomputable def padicCyclotomicUnramifiedResidueAlgebra - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) + (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 @@ -357,8 +360,9 @@ private theorem padicCyclotomicUnramified_residueMapEquiv_commutes exact congrArg (IsLocalRing.residue S) (hfix y) /-- The canonical action of `Gal(L/K)` on the residue extension. -/ -noncomputable def padicCyclotomicUnramified_galResidueAlgEquiv - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) +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) @@ -376,7 +380,7 @@ noncomputable def padicCyclotomicUnramified_galResidueAlgEquiv let k := IsLocalRing.ResidueField V let ell := IsLocalRing.ResidueField W letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt - let eW := padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ + let eW := padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ let eell : ell ≃+* ell := IsLocalRing.ResidueField.mapEquiv eW apply AlgEquiv.ofRingEquiv apply padicCyclotomicUnramified_residueMapEquiv_commutes i eW @@ -387,7 +391,8 @@ noncomputable def padicCyclotomicUnramified_galResidueAlgEquiv @[simp] theorem padicCyclotomicUnramified_galResidueAlgEquiv_residue - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) + (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) @@ -395,19 +400,20 @@ theorem padicCyclotomicUnramified_galResidueAlgEquiv_residue letI : Algebra (padicCyclotomicUnramifiedResidueField vK) (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt - padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ (IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) x) = IsLocalRing.residue (LubinTate.Valuations.exponentialValuationSubring vL) - (padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ x) := by - simp only [padicCyclotomicUnramified_galResidueAlgEquiv, + (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 padicCyclotomicUnramified_galToResidueGal - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) +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) : @@ -425,16 +431,16 @@ noncomputable def padicCyclotomicUnramified_galToResidueGal let ell := IsLocalRing.ResidueField W letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt refine - { toFun := padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens + { toFun := padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens map_one' := ?_ map_mul' := ?_ } · ext x obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x - change padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens 1 + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens 1 (IsLocalRing.residue W y) = IsLocalRing.residue W y rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] change IsLocalRing.residue W - (padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens 1 y) = + (padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens 1 y) = IsLocalRing.residue W y apply congrArg (IsLocalRing.residue W) apply Subtype.ext @@ -443,14 +449,14 @@ noncomputable def padicCyclotomicUnramified_galToResidueGal · intro σ τ ext x obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective x - change padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens (σ * τ) + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens (σ * τ) (IsLocalRing.residue W y) = - padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ - (padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens τ + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ + (padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens τ (IsLocalRing.residue W y)) rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue] change IsLocalRing.residue W - (padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens (σ * τ) y) = _ + (padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens (σ * τ) y) = _ rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue, padicCyclotomicUnramified_galResidueAlgEquiv_residue] apply congrArg (IsLocalRing.residue W) @@ -593,7 +599,8 @@ finite unramified extension in the literal sense of the finite unramified-extens 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) + (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) @@ -773,7 +780,8 @@ 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) + (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) @@ -785,7 +793,7 @@ theorem padicCyclotomicUnramified_galToResidueGal_injective letI : Algebra (padicCyclotomicUnramifiedResidueField vK) (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt - Function.Injective (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens) := by + Function.Injective (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) := by classical let Vv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vK let Wv := LubinTate.Valuations.exponentialValuationSubringAsValuationSubring vL @@ -837,15 +845,15 @@ theorem padicCyclotomicUnramified_galToResidueGal_injective _ = algebraMap k ell 0 := (map_zero _).symm intro σ τ hστ let bσ : W := - padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens σ a + padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ a let bτ : W := - padicCyclotomicUnramified_galIntegerRingEquiv vK vL hExt hhens τ a + 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 padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens σ + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens σ (IsLocalRing.residue W a) = - padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens τ + padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens τ (IsLocalRing.residue W a) at happ rw [padicCyclotomicUnramified_galResidueAlgEquiv_residue, padicCyclotomicUnramified_galResidueAlgEquiv_residue] at happ @@ -927,7 +935,8 @@ 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) + (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) @@ -940,7 +949,7 @@ theorem padicCyclotomicUnramified_galToResidueGal_bijective (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt Function.Bijective - (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens) := by + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) := by let V := LubinTate.Valuations.exponentialValuationSubring vK let W := LubinTate.Valuations.exponentialValuationSubring vL let i := unramifiedValuationRingValuationRingMap vK vL hExt @@ -966,7 +975,7 @@ theorem padicCyclotomicUnramified_galToResidueGal_bijective 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 - (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens)).2 + (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, @@ -976,8 +985,9 @@ theorem padicCyclotomicUnramified_galToResidueGal_bijective /-- the unramified cyclotomic theorem(ii): the canonical multiplicative equivalence obtained from reduction of valuation-ring automorphisms. -/ -noncomputable def padicCyclotomicUnramified_galEquivResidueGal - (vK : LubinTate.Valuations.ExponentialValuation K) (vL : LubinTate.Valuations.ExponentialValuation L) +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) @@ -995,14 +1005,15 @@ noncomputable def padicCyclotomicUnramified_galEquivResidueGal (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt exact MulEquiv.ofBijective - (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens) + (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) + (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) @@ -1019,13 +1030,14 @@ noncomputable def padicCyclotomicUnramifiedArithmeticFrobenius padicCyclotomicUnramified_residueFiniteDimensional vK vL hExt letI : Algebra.IsAlgebraic k ell := Algebra.IsAlgebraic.of_finite k ell exact - (padicCyclotomicUnramified_galEquivResidueGal + (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) + (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) @@ -1043,7 +1055,7 @@ theorem padicCyclotomicUnramified_galEquivResidueGal_arithmeticFrobenius letI : Algebra.IsAlgebraic (padicCyclotomicUnramifiedResidueField vK) (padicCyclotomicUnramifiedResidueField vL) := Algebra.IsAlgebraic.of_finite _ _ - padicCyclotomicUnramified_galEquivResidueGal + padicCyclotomicUnramifiedGalEquivResidueGal vK vL hExt hhens hk hpn hζ hζgen (padicCyclotomicUnramifiedArithmeticFrobenius vK vL hExt hhens hk hpn hζ hζgen) = @@ -1057,7 +1069,8 @@ 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) + (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) @@ -1107,7 +1120,7 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot let φ : Gal(L/K) := padicCyclotomicUnramifiedArithmeticFrobenius vK vL hExt hhens hk hpn hζ hζgen - let b : W := padicCyclotomicUnramified_galIntegerRingEquiv + let b : W := padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens φ a let c : W := a ^ (p ^ r) let F : W[X] := cyclotomic n W @@ -1127,7 +1140,7 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot _ = 0 := hzero _ = algebraMap k ell 0 := (map_zero _).symm have hφReduction : - padicCyclotomicUnramified_galEquivResidueGal + padicCyclotomicUnramifiedGalEquivResidueGal vK vL hExt hhens hk hpn hζ hζgen φ = FiniteField.frobeniusAlgEquivOfAlgebraic k ell := by exact padicCyclotomicUnramified_galEquivResidueGal_arithmeticFrobenius @@ -1135,7 +1148,7 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot 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 padicCyclotomicUnramified_galResidueAlgEquiv vK vL hExt hhens φ + change padicCyclotomicUnramifiedGalResidueAlgEquiv vK vL hExt hhens φ (IsLocalRing.residue W a) = FiniteField.frobeniusAlgEquivOfAlgebraic k ell (IsLocalRing.residue W a) at happ @@ -1202,7 +1215,8 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_apply_primitiveRoot /-- 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) + (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) @@ -1227,7 +1241,7 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_generates 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 := padicCyclotomicUnramified_galEquivResidueGal + let e := padicCyclotomicUnramifiedGalEquivResidueGal vK vL hExt hhens hk hpn hζ hζgen let φ := padicCyclotomicUnramifiedArithmeticFrobenius vK vL hExt hhens hk hpn hζ hζgen @@ -1268,7 +1282,8 @@ 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) + (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 @@ -1603,7 +1618,8 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top /-- 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) + (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 @@ -1631,7 +1647,7 @@ private theorem padicCyclotomicUnramified_of_finiteDimensional ∀ m : ℕ, 0 < m → (p ^ r) ^ m ≡ 1 [MOD n] → padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≤ m) ∧ Function.Bijective - (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens) ∧ + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) ∧ padicCyclotomicUnramifiedArithmeticFrobenius vK vL hExt hhens hk hpn hζ hζgen ζ = ζ ^ (p ^ r) ∧ (∀ σ : Gal(L/K), @@ -1704,7 +1720,8 @@ 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) + (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 @@ -1735,7 +1752,7 @@ theorem padicCyclotomicUnramified ∀ m : ℕ, 0 < m → (p ^ r) ^ m ≡ 1 [MOD n] → padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) ≤ m) ∧ Function.Bijective - (padicCyclotomicUnramified_galToResidueGal vK vL hExt hhens) ∧ + (padicCyclotomicUnramifiedGalToResidueGal vK vL hExt hhens) ∧ padicCyclotomicUnramifiedArithmeticFrobenius vK vL hExt hhens hk hpn hζ hζgen ζ = ζ ^ (p ^ r) ∧ (∀ σ : Gal(L/K), diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean index 0057b1adaf..d5478c84b9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean @@ -70,14 +70,16 @@ 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 ↔ + 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 ↔ + (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) @@ -88,7 +90,8 @@ 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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) n := by let E := Units.mapEquiv (integerRingEquivPadicDVRValuationSubring p).toMulEquiv ext u @@ -107,7 +110,8 @@ 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 := + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p) n := QuotientGroup.congr _ _ (Units.mapEquiv (integerRingEquivPadicDVRValuationSubring p).toMulEquiv) @@ -117,7 +121,8 @@ noncomputable def integerUnitsPrincipalQuotEquivPadicDVR (n : ℕ) : 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 ≃+* + (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] := @@ -142,7 +147,8 @@ theorem nat_card_integerUnitsPrincipalQuot_padic_succ (k : ℕ) : 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 (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))ˣ) := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits @@ -257,7 +263,8 @@ theorem padicInt_exists_degree_root_of_mem_maximalIdeal_pow_succ /-- 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 + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p).valuationSubring) := by simpa [LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF, ValuationTheory.DiscreteValuationField.CompleteDVF.residueField, ValuationTheory.DiscreteValuationField.CompleteDVF.valuationSubring, @@ -268,7 +275,8 @@ noncomputable instance padicDVR_residueField_finite : is `p`. -/ theorem padicDVR_residueCharacteristic : (LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p)).residueCharacteristic = p := by + (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 @@ -306,7 +314,8 @@ 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 := LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation_intCast v + have h := + LocalFieldTheory.DiscreteValuationField.LocalField.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 @@ -317,7 +326,8 @@ 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) < + (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation + p)).residueCharacteristic : ℚ) - 1) < (1 : ℚ) := by rw [padicDVR_ramificationIndex_eq_one p, padicDVR_residueCharacteristic p] @@ -341,7 +351,8 @@ theorem padicDVR_logExp_level_succ_of_odd (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) : ℚ) / (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p)).residueCharacteristic : ℚ) - 1) < + (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)) @@ -355,13 +366,17 @@ noncomputable def expLogMulEquivOfWithZeroValuation [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) < + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v + : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + v).residueCharacteristic : ℚ) - 1) < (n : ℚ)) : Multiplicative ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : - Ideal (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring) ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v) n := by + Ideal + (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring) ≃* + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v) n := by letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let P := LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv @@ -385,16 +400,20 @@ theorem expLogMulEquivOfWithZeroValuation_fieldVal [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) < + (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v + : ℚ) / + (((LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation + v).residueCharacteristic : ℚ) - 1) < (n : ℚ)) (a : Multiplicative ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : - Ideal (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring)) : + Ideal + (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring)) : let F := LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v let E := expLogMulEquivOfWithZeroValuation v hv n hlevel - ((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : F.valuationSubringˣ) : + ((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) + : F.valuationSubringˣ) : F.valuationSubring) : K) = LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation v (((a.toAdd : F.valuationSubring) : K)) @@ -409,8 +428,8 @@ theorem expLogMulEquivOfWithZeroValuation_fieldVal simp only [expLogMulEquivOfWithZeroValuation] simp only [ LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv, - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogContinuousMulEquivOfExact_ofWithZeroValuationScaled, - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogMulEquivOfExact_ofWithZeroValuationScaled] + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled, + LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled] apply LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled (v := v) (p := p) @@ -452,7 +471,8 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p let F := LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v - change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1), + 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ˣ) @@ -482,7 +502,8 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd 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) + 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 : @@ -491,7 +512,8 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd 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) : + change ((r ^ ((p - 1) * p ^ k) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) : F.valuationSubringˣ) = (u : F.valuationSubringˣ) rw [hrpow, ← hua] apply Units.ext @@ -505,7 +527,8 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd 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ˣ) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) : + F.valuationSubringˣ) : F.valuationSubring) : ℚ_[p]) = LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation v ((((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)).toAdd : @@ -514,7 +537,8 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd 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ˣ) : + ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F + (k + 1)) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[p]) = LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation v ((a.toAdd : F.valuationSubring) : ℚ_[p]) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean index b7f7787d5c..87b6476353 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -393,7 +393,7 @@ noncomputable def padicPrincipalDataDirect LocalField.mixedWithZeroValuationContext v letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := Valued.mk' v - exact LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + exact LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v (padicDVRValuation_surjective p) /-- The multiplicative equivalence underlying the first-principal-unit @@ -419,6 +419,10 @@ noncomputable def padicPrincipalMulData 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 @@ -443,7 +447,7 @@ noncomputable def padicPrincipalData Valued.mk' v letI : Valued ℚ_[p] (WithZero (Multiplicative ℤ)) := direct let raw := - LocalField.chosenMixed_firstPrincipalUnitStructure_ofWithZeroValuation + LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v (padicDVRValuation_surjective p) let directTopology : TopologicalSpace U := inferInstance let standardTopology : TopologicalSpace U := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean index 93dae935af..9f3c1b4a59 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean @@ -29,7 +29,8 @@ 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) + (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) @@ -114,11 +115,8 @@ private theorem primitive_separable_integral_model_core change (F.map ((algebraMap K L).comp V.subtype)).eval (a : L) = 0 exact hFroot - have hqSep : qbar.Separable := by - apply hFreduction.of_dvd - rcases hGdvdF with ⟨H, hH⟩ - refine ⟨H.map (IsLocalRing.residue V), ?_⟩ - rw [hH, Polynomial.map_mul] + 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 @@ -204,21 +202,11 @@ private theorem primitive_separable_integral_model_core rw [IntermediateField.adjoin.finrank halphaIntegral, ← hqMinpoly] exact hqDegree have hsuble : - Module.finrank K L ≤ - @Module.finrank k ell _ _ residueModule := by - calc - Module.finrank K L = - Module.finrank k - (IntermediateField.adjoin k ({alpha} : Set ell)) := - hresidueSubDegree.symm - _ ≤ @Module.finrank k ell _ _ algebraModule := by - simpa using - (@IntermediateField.finrank_le_of_le_right - k ell _ _ _ - (IntermediateField.adjoin k ({alpha} : Set ell)) - (⊤ : IntermediateField k ell) hfinTopAlgebra le_top) - _ = @Module.finrank k ell _ _ residueModule := by - rw [hresidueModule] + 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 @@ -236,42 +224,20 @@ private theorem primitive_separable_integral_model_core @Module.finrank k ell _ _ residueModule := Nat.le_antisymm hsuble hresle have hdegreeEqAlgebra : - Module.finrank K L = - @Module.finrank k ell _ _ algebraModule := by - calc - Module.finrank K L = - @Module.finrank k ell _ _ residueModule := hdegreeEq - _ = @Module.finrank k ell _ _ algebraModule := by - rw [hresidueModule] + Module.finrank K L = @Module.finrank k ell _ _ algebraModule := by + rwa [hresidueModule] at hdegreeEq have hAdjoinResidue : - IntermediateField.adjoin k ({alpha} : Set ell) = - (⊤ : IntermediateField k ell) := by - refine @IntermediateField.eq_of_le_of_finrank_eq - k ell _ _ _ - (IntermediateField.adjoin k ({alpha} : Set ell)) - (⊤ : IntermediateField k ell) hfinTopAlgebra le_top ?_ - calc - Module.finrank k - (IntermediateField.adjoin k ({alpha} : Set ell)) = - Module.finrank K L := hresidueSubDegree - _ = @Module.finrank k ell _ _ algebraModule := hdegreeEqAlgebra - _ = Module.finrank k (⊤ : IntermediateField k ell) := by - simp - have hsepAdjoin : Algebra.IsSeparable k - (IntermediateField.adjoin k ({alpha} : Set ell)) := - (IntermediateField.isSeparable_adjoin_iff_isSeparable k ell).2 (by - intro x hx - have hxalpha : x = alpha := by simpa using hx - subst x - exact halphaSep) - let eTop : IntermediateField.adjoin k ({alpha} : Set ell) ≃ₐ[k] ell := - (IntermediateField.equivOfEq hAdjoinResidue).trans - (IntermediateField.topEquiv : - (⊤ : IntermediateField k ell) ≃ₐ[k] ell) + 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 - let : Algebra.IsSeparable k - (IntermediateField.adjoin k ({alpha} : Set ell)) := hsepAdjoin - exact AlgEquiv.Algebra.isSeparable eTop + 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 = @@ -288,7 +254,8 @@ 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) + (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) @@ -315,7 +282,8 @@ 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) + (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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean index 58429e82cf..52a37be8ae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean @@ -9,7 +9,8 @@ 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 +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. @@ -31,7 +32,8 @@ omit [Algebra K L] 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) : + (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 @@ -53,7 +55,8 @@ 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) + (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 @@ -103,7 +106,8 @@ theorem exponentialValueGroupQuotient_finite_of_finiteDimensional extension is positive. -/ theorem exponentialRamificationIndex_pos_of_finiteDimensional [FiniteDimensional K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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) := @@ -121,7 +125,8 @@ 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) + (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 @@ -173,7 +178,8 @@ 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) + (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 @@ -213,7 +219,8 @@ theorem residueExtension_finiteDimensional_of_finiteDimensional positive. -/ theorem exponentialResidueDegree_pos_of_finiteDimensional [FiniteDimensional K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 @@ -236,19 +243,22 @@ theorem exponentialResidueDegree_pos_of_finiteDimensional extension is at most its field degree. -/ theorem exponentialRamificationIndex_le_finrank [FiniteDimensional K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 +/-- 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) + (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 : @@ -299,7 +309,8 @@ 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) + (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 : @@ -341,11 +352,13 @@ theorem exists_basis_eq_residueBasisLifts_of_finiteUnramifiedExtension exact congrFun (coe_basisOfLinearIndependentOfCardEqFinrank hli hcard) j -/-- the finite unramified-extension definition and the fundamental inequality force the actual ramification index of +/-- 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) + (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 @@ -376,7 +389,8 @@ theorem exponentialRamificationIndex_eq_one_of_finiteUnramifiedExtension /-- 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) + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean index d40a3f803e..a4f47b070f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean @@ -118,7 +118,8 @@ theorem exponentialValuationRestrict_apply /-- 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) + (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 @@ -127,10 +128,12 @@ theorem exponentialValuationRestrict_extends /-- 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 +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) + (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 := @@ -141,7 +144,8 @@ def unramifiedValuationRingValuationRingMap @[simp] theorem unramifiedValuationRingValuationRingMap_apply - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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) : ((unramifiedValuationRingValuationRingMap v w hExt a : @@ -152,7 +156,8 @@ theorem unramifiedValuationRingValuationRingMap_apply /-- 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) + (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 @@ -169,7 +174,8 @@ theorem unramifiedValuationRingValuationRingMap_isLocalHom /-- 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) + (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 @@ -191,27 +197,32 @@ 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 - [FiniteDimensional K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + + (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 +/-- 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) + (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 +/-- 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) + (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 @@ -220,7 +231,8 @@ theorem finiteUnramifiedExtension_degree_eq_residueDegree /-- 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) + (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, @@ -230,9 +242,11 @@ def FiniteUnramifiedSubextension (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. -/ +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) + (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) : @@ -243,7 +257,8 @@ theorem finiteDimensional_of_finiteUnramifiedSubextension /-- The literal set-theoretic union of all finite unramified intermediate extensions. -/ def finiteUnramifiedSubextensionUnion - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + (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} @@ -251,15 +266,17 @@ def finiteUnramifiedSubextensionUnion /-- Arbitrary algebraic-extension form: the ambient field is the union of its finite unramified subextensions. -/ def AlgebraicUnramifiedExtension - [Algebra.IsAlgebraic K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + + (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) + (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, @@ -268,21 +285,25 @@ theorem algebraicUnramifiedExtension_iff 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 +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 - [Algebra.IsAlgebraic K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + + (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 +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) + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean index 7d17fb680f..e75c8f451d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean @@ -29,7 +29,8 @@ 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) + (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) : @@ -67,7 +68,8 @@ theorem finiteUnramifiedSubextension_bot unramified. -/ theorem finiteUnramifiedSubextension_finset_iSup {ι : Type*} - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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) @@ -129,7 +131,8 @@ theorem finiteUnramifiedSubextension_finset_iSup /-- 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) + (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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean index 8e5834c682..838995ee17 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean @@ -45,7 +45,8 @@ theorem exponentialValuation_hasUniqueAlgebraicValuationSubringExtensions have hV : Vv = Va := associatedAbsoluteValue_valuationSubring_eq v (Real.exp 1) av havNonarch hav - have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization Va.valuation := by + have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + Va.valuation := by rw [← hV] exact hhens change HasUniqueAlgebraicValuationSubringExtensions Vv @@ -65,7 +66,8 @@ 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) + (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) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean index 4033ec2c4c..559d602d72 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean @@ -27,7 +27,8 @@ 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) + (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) : @@ -69,7 +70,8 @@ theorem maximalUnramifiedSubextension_valueSubgroup_eq /-- 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) + (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) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean index e360cccf59..d8951e4dcb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definit 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 +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. -/ @@ -24,16 +25,19 @@ 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. -/ +/-- The finite unramified intermediate fields occurring in the finite unramified-extension +definition. -/ def finiteUnramifiedSubextensions - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + (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) + (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 ↔ @@ -47,14 +51,16 @@ 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) + (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) + (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) : @@ -65,7 +71,8 @@ theorem finiteUnramifiedSubextension_le_maximal /-- `T` is the least intermediate field containing every finite unramified subextension. -/ theorem maximalUnramifiedSubextension_le - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation L) + (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, @@ -77,7 +84,8 @@ theorem maximalUnramifiedSubextension_le /-- 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) + (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 ↔ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean index cb6fbef9ee..aea8ff2cb8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean @@ -93,7 +93,7 @@ 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 E] [FiniteDimensional K D] + [FiniteDimensional K D] (i : E →ₐ[K] D) (v : LubinTate.Valuations.ExponentialValuation K) (u : LubinTate.Valuations.ExponentialValuation E) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean index eddf7696db..b10b707bd4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean @@ -69,7 +69,8 @@ theorem restrictedValuationRingMapToAmbient_isLocalHom 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) + (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 @@ -122,10 +123,12 @@ def restrictedResidueAlgHomToAmbient /-- Value-group source for the finite unramified embedding. -Every finite unramified subextension occurring in the maximal-unramified-subextension definition has exactly +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) + (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) : @@ -144,7 +147,8 @@ 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) + (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) @@ -194,7 +198,8 @@ theorem finiteUnramifiedSubextension_residue_image_mem_separableClosure /-- 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) + (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) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean index aa99db9e96..a5d0931519 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean @@ -28,7 +28,8 @@ 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) + (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) : @@ -185,7 +186,8 @@ theorem exists_integral_root_lifting_separable_residue_element /-- 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) + (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) : @@ -295,7 +297,8 @@ theorem exists_finiteUnramifiedSubextension_residue_image_eq 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) + (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) : @@ -354,7 +357,8 @@ theorem separableClosure_le_maximalUnramifiedSubextension_residue_fieldRange /-- 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) + (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) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean index 4edeeba8ad..c783ed4631 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -32,7 +32,8 @@ 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) + (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 @@ -63,7 +64,8 @@ theorem unramifiedValuationRing_polynomial_target_reduction_eq /-- 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) + (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) : @@ -102,6 +104,30 @@ theorem unramifiedValuationRing_polynomial_aeval_residue_eq 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] @@ -115,7 +141,8 @@ 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) + (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) @@ -284,70 +311,43 @@ theorem exists_primitive_lift_minpoly_of_finiteUnramifiedExtension rw [Polynomial.aeval_def, Polynomial.eval₂_eq_eval_map] rw [← hares] exact hred.symm - have hqdvd : q ∣ pbar := by - exact minpoly.dvd k abar hpbarRoot + have hqdvd : q ∣ pbar := minpoly.dvd k abar hpbarRoot have hpVmonic : pV.Monic := minpoly.monic haIntegralV - have hpbarMonic : pbar.Monic := hpVmonic.map _ have hqMonic : q.Monic := minpoly.monic habarIntegral - have hpKmap : pK = pV.map (algebraMap V K) := by - exact minpoly.isIntegrallyClosed_eq_field_fractions' K haIntegralV - have hdegree : pbar.natDegree ≤ q.natDegree := by - apply le_of_eq - calc - pbar.natDegree = pV.natDegree := hpVmonic.natDegree_map _ - _ = pK.natDegree := by - rw [hpKmap, hpVmonic.natDegree_map] - _ = pbL.dim := pbL.natDegree_minpoly - _ = pb.dim := rfl - _ = q.natDegree := pb.natDegree_minpoly.symm + have hpKmap : pK = pV.map (algebraMap V K) := + minpoly.isIntegrallyClosed_eq_field_fractions' K haIntegralV have hpbarEq : pbar = q := by - exact Polynomial.eq_of_monic_of_dvd_of_natDegree_le - hqMonic hpbarMonic hqdvd hdegree + 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 hqDerivative : q.derivative ≠ 0 := - (Polynomial.separable_iff_derivative_ne_zero - (minpoly.irreducible habarIntegral)).1 hqSeparable - have hpKDerivative : pK.derivative ≠ 0 := by - intro hpKzero - have hpVmapDerivative : - pV.derivative.map (algebraMap V K) = 0 := by - rw [← Polynomial.derivative_map, ← hpKmap, hpKzero] - have hVKinj : Function.Injective (algebraMap V K) := by - exact V.subtype_injective - have hpVDerivative : pV.derivative = 0 := - (Polynomial.map_eq_zero_iff hVKinj).1 hpVmapDerivative - have hpbarDerivative : pbar.derivative = 0 := by - simp [pbar, Polynomial.derivative_map, hpVDerivative] - apply hqDerivative - rw [← hpbarEq] - exact hpbarDerivative have haSeparable : IsSeparable K (a : L) := by change pK.Separable - exact (Polynomial.separable_iff_derivative_ne_zero - (minpoly.irreducible (Algebra.IsIntegral.isIntegral (a : L)))).2 - hpKDerivative + 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) = ⊤ := by - apply IntermediateField.adjoin_eq_top_iff.2 - exact pbL.adjoin_gen_eq_top + 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 - change pbar = minpoly k (IsLocalRing.residue W a) - rw [hares] - exact hpbarEq + simpa only [hares] using hpbarEq have hpbarSeparable : (pV.map (IsLocalRing.residue V)).Separable := by - change pbar.Separable - rw [hpbarEq] - exact hqSeparable + simpa only [← hpbarEq] using hqSeparable refine ⟨a, pV, hprimitiveK, ?_, hresidueMinpoly, hpbarSeparable, haSeparable⟩ - change pV.map V.subtype = pK - rw [hpKmap] - ext n - rfl + exact hpKmap.symm /-- Finite separability source for an unramified extension. @@ -355,7 +355,8 @@ 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) + (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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean index 32d4d30e1a..163b27cb69 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -46,9 +46,10 @@ 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] - [IsIntegralClosure target.valuationSubring base.valuationSubring L] + {z : L} : - z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base target) ↔ + z ∈ (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) ↔ ∀ a ∈ (1 : Submodule target.valuationSubring L), IsIntegral base.valuationSubring (Algebra.trace K L (z * a)) := by change @@ -77,7 +78,8 @@ omit [FiniteDimensional K L] in 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)) + {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 @@ -104,7 +106,8 @@ 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) = + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = differentIdeal base.valuationSubring target.valuationSubring := by simp [differentIdealOfFiniteSeparable] @@ -114,20 +117,25 @@ 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) ↔ + 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 (RamificationTheory.DiscreteValuationField.ValuedExtension.mem_codifferentSubmodule_iff_trace_mul_integral base target) + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 + 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 @@ -161,7 +169,7 @@ 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] - [IsIntegralClosure target.valuationSubring base.valuationSubring L] + [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : letI : FaithfulSMul base.valuationSubring target.valuationSubring := Module.IsTorsionFree.to_faithfulSMul @@ -207,7 +215,8 @@ certificates. -/ theorem differentIdealOfFiniteSeparable_ne_bot [Algebra.IsSeparable K L] [IsScalarTower base.valuationSubring target.valuationSubring L] : - (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) ≠ ⊥ := by + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ≠ ⊥ := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := target_valuationSubring_isIntegralClosure_of_finite_separable base target @@ -220,7 +229,8 @@ theorem differentIdealOfFiniteSeparable_ne_bot let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_ne_bot base target) + exact (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_ne_bot base + target) /-- The local different/codifferent relation specialized to the valuation rings. -/ @@ -231,7 +241,8 @@ theorem coeSubmodule_differentIdeal_eq_one_div_codifferent [Module.IsTorsionFree base.valuationSubring target.valuationSubring] : IsLocalization.coeSubmodule L (differentIdeal base.valuationSubring target.valuationSubring) = - 1 / (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base target) := by + 1 / (RamificationTheory.DiscreteValuationField.ValuedExtension.codifferentSubmodule base + target) := by change IsLocalization.coeSubmodule L (differentIdeal base.valuationSubring target.valuationSubring) = @@ -251,7 +262,8 @@ theorem isIntegral_discriminant_mul_of_mem_codifferent {ι : 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)) : + (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 @@ -266,12 +278,14 @@ theorem isIntegral_discriminant_mul_of_mem_codifferent_of_finite_separable {ι : 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)) : + (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 (RamificationTheory.DiscreteValuationField.ValuedExtension.isIntegral_discriminant_mul_of_mem_codifferent base target) hb ha hz + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 @@ -279,7 +293,9 @@ 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) ↔ + ¬ target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := @@ -300,7 +316,9 @@ 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) ↔ + target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ ¬ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := @@ -362,7 +380,9 @@ theorem isUnit_differentIdeal_iff_isUnramifiedAt theorem isUnit_differentIdealOfFiniteSeparable_iff_isUnramifiedAt [Algebra.IsSeparable K L] [IsScalarTower base.valuationSubring target.valuationSubring L] : - IsUnit (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) ↔ + IsUnit + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) ↔ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := @@ -376,7 +396,8 @@ theorem isUnit_differentIdealOfFiniteSeparable_iff_isUnramifiedAt let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.isUnit_differentIdeal_iff_isUnramifiedAt base target) + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.isUnit_differentIdeal_iff_isUnramifiedAt base target) omit [FiniteDimensional K L] in /-- States the theorem `differentIdeal_eq_top_iff_isUnramifiedAt`. -/ @@ -389,14 +410,16 @@ theorem differentIdeal_eq_top_iff_isUnramifiedAt differentIdeal base.valuationSubring target.valuationSubring = ⊤ ↔ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by rw [← Ideal.isUnit_iff] - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.isUnit_differentIdeal_iff_isUnramifiedAt base target) + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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) = ⊤ ↔ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = ⊤ ↔ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := @@ -410,7 +433,8 @@ theorem differentIdealOfFiniteSeparable_eq_top_iff_isUnramifiedAt let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_eq_top_iff_isUnramifiedAt base target) + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 @@ -452,7 +476,9 @@ theorem conductor_mul_differentIdealOfFiniteSeparable_eq_span_derivative [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) = + conductor base.valuationSubring z * + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = Ideal.span {Polynomial.aeval z (Polynomial.derivative (minpoly base.valuationSubring z))} := by @@ -462,7 +488,8 @@ theorem conductor_mul_differentIdealOfFiniteSeparable_eq_span_derivative let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := moduleIsTorsionFree_target_valuationSubring_of_finite_separable (K := K) (L := L) (base := base) (target := target) - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.conductor_mul_differentIdeal_eq_span_derivative base target) z hz + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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. -/ @@ -473,14 +500,16 @@ theorem aeval_derivative_mem_differentIdealOfFiniteSeparable (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 + (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 (RamificationTheory.DiscreteValuationField.ValuedExtension.aeval_derivative_mem_differentIdeal base target) z hz + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 @@ -565,7 +594,9 @@ theorem maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable target.maximalIdeal ^ e ∣ Ideal.map (algebraMap base.valuationSubring target.valuationSubring) base.maximalIdeal) : - target.maximalIdeal ^ (e - 1) ∣ (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) := by + 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 @@ -578,7 +609,8 @@ theorem maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) - exact (RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_pow_sub_one_dvd_differentIdeal base target) e hpow + exact + (RamificationTheory.DiscreteValuationField.ValuedExtension.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 @@ -588,7 +620,8 @@ theorem maximalIdeal_pow_ramificationIndex_sub_one_dvd_differentIdealOfFiniteSep [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 + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by refine (RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable base target) (ramificationIndex base.toDVF target.toDVF) ?_ @@ -603,7 +636,9 @@ theorem maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationI [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 + target.maximalIdeal ∣ + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) := by have hlower : target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF - 1) ∣ (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) := @@ -662,15 +697,17 @@ theorem differentIdeal_tower /-- Finite-separable tower formula for the different, using the finite-separable different ideals on all three steps. -/ theorem differentIdealOfFiniteSeparable_tower - [IsScalarTower K M L] + [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) * + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + base target) = + (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable + middle target) * Ideal.map (algebraMap middle.valuationSubring target.valuationSubring) (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base middle) := by unfold differentIdealOfFiniteSeparable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean index 9ed8882768..a034fc7bd7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -194,20 +194,24 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integ RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension (v := F.valuation) (A := A) E have hAInt : Algebra.IsIntegral F.valuation.valuationSubring - ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).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 = + ((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 := ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral - (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ + (L := E) F.valuation + ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz⟩ exact ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension (L := E) F.valuation B.valuation ⟨z, hz_int⟩ @@ -217,10 +221,13 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integ (L := E) F.valuation B.valuation ⟨z, hz⟩ exact ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension - (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz_int⟩ + (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 := + (RamificationTheory.ValuationSubring.restrictIntermediateField A + E).valuation.valuationSubring := (ValuationSubring.valuationSubring_valuation _).symm _ = B.valuation.valuationSubring := hsub _ = B := ValuationSubring.valuationSubring_valuation B) @@ -260,9 +267,11 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate (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)) + (hA : target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E)) (huniq : - ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} + ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, + w, u} F target) (σ : Field.absoluteGaloisGroup K) (x : E) : ((x : AlgebraicClosure K) ∈ A) ↔ @@ -312,20 +321,23 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_integral RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension (v := F.valuation) (A := A) E have hAInt : Algebra.IsIntegral F.valuation.valuationSubring - ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).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 = + ((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 := ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral - (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ + (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A + E)).valuation ⟨z, hz⟩ exact ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension (L := E) F.valuation B.valuation ⟨z, hz_int⟩ @@ -335,10 +347,12 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_integral (L := E) F.valuation B.valuation ⟨z, hz⟩ exact ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension - (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz_int⟩ + (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 := + (RamificationTheory.ValuationSubring.restrictIntermediateField A + E).valuation.valuationSubring := (ValuationSubring.valuationSubring_valuation _).symm _ = B.valuation.valuationSubring := hsub _ = B := ValuationSubring.valuationSubring_valuation B @@ -380,7 +394,8 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_henselianUnique ∀ (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) ∧ + target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} F target) : decompositionSubgroup K A = ⊤ := by @@ -408,7 +423,8 @@ theorem decompositionSubgroup_eq_top_of_henselianDVF_powerRoute ∀ (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) ∧ + target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} F target) : decompositionSubgroup K A = ⊤ := @@ -842,8 +858,9 @@ noncomputable def absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSu QuotientGroup.quotientKerEquivRange (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA) -/-- States the theorem `absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ -@[simp] theorem absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk +/-- States the theorem +`absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ +theorem absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk (A : ValuationSubring (AlgebraicClosure K)) (hA : decompositionSubgroup K A = ⊤) (σ : Field.absoluteGaloisGroup K) : @@ -871,8 +888,9 @@ noncomputable def absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionS (absoluteResidueActionOfDecompositionSubgroupEqTop_ker K A hA).symm).trans (absoluteQuotientKernelEquivResidueActionRangeOfDecompositionSubgroupEqTop K A hA) -/-- States the theorem `absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ -@[simp] theorem absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk +/-- States the theorem +`absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk`. -/ +theorem absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_mk (A : ValuationSubring (AlgebraicClosure K)) (hA : decompositionSubgroup K A = ⊤) (σ : Field.absoluteGaloisGroup K) : @@ -894,8 +912,11 @@ noncomputable def absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionS (absoluteResidueActionOfDecompositionSubgroupEqTop K A hA).rangeRestrict σ rfl -/-- States the theorem `absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict`. -/ -@[simp] theorem absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict +/-- States the theorem +`absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict`. +-/ +@[simp] theorem + absoluteQuotientInertiaEquivResidueActionRangeOfDecompositionSubgroupEqTop_symm_rangeRestrict (A : ValuationSubring (AlgebraicClosure K)) (hA : decompositionSubgroup K A = ⊤) (σ : Field.absoluteGaloisGroup K) : @@ -929,7 +950,7 @@ noncomputable def decompositionQuotientInertiaEquivResidueActionRange (decompositionResidueAction K A)) /-- States the theorem `decompositionQuotientInertiaEquivResidueActionRange_mk`. -/ -@[simp] theorem decompositionQuotientInertiaEquivResidueActionRange_mk +theorem decompositionQuotientInertiaEquivResidueActionRange_mk (A : ValuationSubring (AlgebraicClosure K)) (σ : decompositionSubgroup K A) : decompositionQuotientInertiaEquivResidueActionRange K A diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index 5990f7f58c..b86c1ae121 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import Mathlib.SetTheory.Cardinal.Finite import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence -/-! Provides the public declarations in the `RamificationTheory.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence` Lean module. -/ +/-! Provides the public declarations in the + `RamificationTheory.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence` Lean module. -/ namespace RamificationTheory @@ -250,7 +251,6 @@ def quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension exact quotientNormalClosureOpenSubgroupEquivGal K (AlgHom.fieldRange i) /-- States the theorem `quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension_mk'`. -/ -@[simp] theorem quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension_mk' [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) @@ -267,13 +267,10 @@ theorem quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension_mk' (AlgHom.fieldRange i) σ /-- The cardinality of the Galois group of the normal closure of an embedded -finite extension. The finite-dimensional structure on the field range is -installed inside this definition, so the natural cardinal cannot silently use -the infinite-type zero fallback. -/ +extension. The later index comparison supplies finite-dimensionality when +this cardinal is used for a finite extension. -/ noncomputable def normalClosureFiniteExtensionGaloisCard - [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : ℕ := by - letI := finiteDimensional_fieldRange (K := K) i exact Nat.card (Gal(IntermediateField.normalClosure K (AlgHom.fieldRange i) (AlgebraicClosure K) / K)) @@ -664,14 +661,13 @@ instance openSubgroupOfFiniteExtension.instNormal_coe /-- For an embedded finite normal extension, `G_K/G_L` is the automorphism group of the embedded field range. -/ -def quotientEquivGalFieldRangeOfNormalFiniteExtension [FiniteDimensional K L] +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'`. -/ -@[simp] theorem quotientEquivGalFieldRangeOfNormalFiniteExtension_mk' [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K/K)) : @@ -690,7 +686,6 @@ def quotientEquivGalOfNormalFiniteExtension [FiniteDimensional K L] (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm /-- States the theorem `quotientEquivGalOfNormalFiniteExtension_mk'`. -/ -@[simp] theorem quotientEquivGalOfNormalFiniteExtension_mk' [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) [Normal K (AlgHom.fieldRange i)] (σ : Gal(AlgebraicClosure K/K)) : @@ -715,7 +710,6 @@ def quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension quotientEquivGalFieldRangeOfNormalFiniteExtension K i /-- States the theorem `quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ -@[simp] theorem quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk' [FiniteDimensional K L] [Normal K L] (i : L →ₐ[K] AlgebraicClosure K) @@ -741,7 +735,6 @@ def quotientOpenSubgroupEquivGalOfNormalFiniteExtension (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm /-- States the theorem `quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk'`. -/ -@[simp] theorem quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk' [FiniteDimensional K L] [Normal K L] (i : L →ₐ[K] AlgebraicClosure K) @@ -970,7 +963,7 @@ private theorem automorphismsOverFieldRangeEquiv_symm_continuous /-- 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 [FiniteDimensional K L] +def equivGalFieldRangeOfFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : Field.absoluteGaloisGroup L ≃* Gal(AlgebraicClosure K / AlgHom.fieldRange i) := by @@ -978,7 +971,6 @@ def equivGalFieldRangeOfFiniteExtension [FiniteDimensional K L] 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 K L := Algebra.IsAlgebraic.of_finite K L haveI : Algebra.IsAlgebraic L (AlgebraicClosure K) := Algebra.IsAlgebraic.tower_top (K := K) (L := L) (A := AlgebraicClosure K) haveI : IsAlgClosure L (AlgebraicClosure K) := @@ -1336,7 +1328,6 @@ def quotientRangeEquivGalFieldRangeOfNormalFiniteExtension (quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i) /-- States the theorem `quotientRangeEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ -@[simp] theorem quotientRangeEquivGalFieldRangeOfNormalFiniteExtension_mk' [FiniteDimensional K L] [Normal K L] (i : L →ₐ[K] AlgebraicClosure K) @@ -1367,7 +1358,6 @@ def quotientRangeEquivGalOfNormalFiniteExtension (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm /-- States the theorem `quotientRangeEquivGalOfNormalFiniteExtension_mk'`. -/ -@[simp] theorem quotientRangeEquivGalOfNormalFiniteExtension_mk' [FiniteDimensional K L] [Normal K L] (i : L →ₐ[K] AlgebraicClosure K) @@ -1448,7 +1438,6 @@ theorem mem_range_ofFiniteExtensionAbsolute_iff_forall_apply_eq rfl /-- States the theorem `ofFiniteExtensionAbsolute_apply_embedding`. -/ -@[simp] theorem ofFiniteExtensionAbsolute_apply_embedding [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup L) (x : L) : @@ -1459,7 +1448,6 @@ theorem ofFiniteExtensionAbsolute_apply_embedding (ofFiniteExtensionAbsolute_mem_openSubgroup K i σ) x /-- States the theorem `coe_toOpenSubgroupOfFiniteExtension_apply_embedding`. -/ -@[simp] theorem coe_toOpenSubgroupOfFiniteExtension_apply_embedding [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup L) (x : L) : @@ -1481,7 +1469,6 @@ theorem exists_ofFiniteExtensionAbsolute_eq_iff_mem_openSubgroup rfl /-- States the theorem `ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm`. -/ -@[simp] theorem ofFiniteExtensionAbsolute_equivOpenSubgroupOfFiniteExtension_symm [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) (σ : openSubgroupOfFiniteExtension K i) : @@ -1524,7 +1511,6 @@ def ofFiniteExtensionAbsoluteTower /-- 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`. -/ -@[simp] theorem ofFiniteExtensionAbsoluteTower_naturality [FiniteDimensional K L] [FiniteDimensional K M] (i : M →ₐ[K] AlgebraicClosure K) (j : L →ₐ[K] M) @@ -1634,9 +1620,11 @@ theorem mem_absoluteValuationSubring_iff_apply_mem_of_finite_separable_intermedi (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)) + (hA : target.valuation.valuationSubring = + (RamificationTheory.ValuationSubring.restrictIntermediateField A E)) (huniq : - ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} + ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, + w, u} F target) (sigma : Field.absoluteGaloisGroup K) (x : E) : ((x : AlgebraicClosure K) ∈ A) ↔ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean index 5cae88edf8..f90462888a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean @@ -123,7 +123,7 @@ def restrictIntermediateField rfl /-- States the theorem `mem_restrictIntermediateField_iff`. -/ -@[simp] theorem mem_restrictIntermediateField_iff +theorem mem_restrictIntermediateField_iff (A : ValuationSubring Ω) (E : IntermediateField K Ω) (x : E) : x ∈ (restrictIntermediateField A E) ↔ (x : Ω) ∈ A := Iff.rfl diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index d69b243c2f..09ea45081b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import Mathlib.SetTheory.Cardinal.Finite import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification -/-! Provides the public declarations in the `RamificationTheory.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence` Lean module. -/ +/-! Provides the public declarations in the + `RamificationTheory.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence` Lean module. -/ namespace RamificationTheory @@ -766,7 +767,7 @@ theorem finiteDimensional_extendScalars_sup `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] - [IsGalois k M] + (E : IntermediateField k M) [FiniteDimensional k E] : Continuous (ofIntermediateFieldInExtension E) := by refine continuous_of_continuousAt_one @@ -1154,7 +1155,6 @@ def quotientEquivGalOfNormalIntermediateField (AlgEquiv.restrictNormalHom_surjective (AlgebraicClosure K))) /-- States the theorem `quotientEquivGalOfNormalIntermediateField_mk'`. -/ -@[simp] theorem quotientEquivGalOfNormalIntermediateField_mk' (E : IntermediateField K (AlgebraicClosure K)) [Normal K E] (σ : Gal(AlgebraicClosure K/K)) : @@ -1176,7 +1176,6 @@ def quotientNormalClosureOpenSubgroupEquivGal (IntermediateField.normalClosure K E (AlgebraicClosure K)) /-- States the theorem `quotientNormalClosureOpenSubgroupEquivGal_mk'`. -/ -@[simp] theorem quotientNormalClosureOpenSubgroupEquivGal_mk' (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] (σ : Gal(AlgebraicClosure K / K)) : @@ -1304,7 +1303,6 @@ instance fixedFieldOfOpenSubgroup.instFiniteDimensional /-- The reverse construction sends the finite-subextension open subgroup back to the original finite intermediate field. -/ -@[simp] theorem fixedFieldOfOpenSubgroup_openSubgroupOfFiniteIntermediateField [IsGalois K (AlgebraicClosure K)] (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : @@ -1315,7 +1313,6 @@ theorem fixedFieldOfOpenSubgroup_openSubgroupOfFiniteIntermediateField /-- The finite-intermediate-field construction sends the fixed field of an open subgroup back to that open subgroup. -/ -@[simp] theorem openSubgroupOfFiniteIntermediateField_fixedFieldOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : @@ -1469,7 +1466,6 @@ theorem mem_conjugateOpenSubgroupOfOpenSubgroup_iff /-- The fixed field of the conjugate open subgroup is the conjugate of the finite fixed field. -/ -@[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] (σ : Gal(AlgebraicClosure K/K)) @@ -1489,7 +1485,6 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup /-- Conjugation carries the fixed field of an intersection of open subgroups to the conjugate of the compositum of their fixed fields. -/ -@[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_inf [IsGalois K (AlgebraicClosure K)] (σ : Gal(AlgebraicClosure K/K)) @@ -1503,7 +1498,6 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_inf /-- Conjugation carries the fixed field of the generated open subgroup to the conjugate of the intersection of the fixed fields. -/ -@[simp] theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_sup [IsGalois K (AlgebraicClosure K)] (σ : Gal(AlgebraicClosure K/K)) @@ -1651,7 +1645,6 @@ def quotientOpenNormalSubgroupEquivGalFixedField exact InfiniteGalois.normalAutEquivQuotient Hc /-- States the theorem `quotientOpenNormalSubgroupEquivGalFixedField_mk'`. -/ -@[simp] theorem quotientOpenNormalSubgroupEquivGalFixedField_mk' [IsGalois K (AlgebraicClosure K)] (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) @@ -1734,7 +1727,6 @@ theorem fixedFieldOfOpenNormalCoreOfOpenSubgroup /-- Normal core is invariant under conjugating the original open subgroup, expressed on fixed fields. -/ -@[simp] theorem fixedFieldOfOpenNormalCoreOfConjugateOpenSubgroupOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] (σ : Gal(AlgebraicClosure K/K)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean index 17a0be1743..39302795e8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean @@ -504,7 +504,7 @@ def quotientKernelQuotientKerEquivQuotientKernelOfLe {l m n : ℕ} (F.quotientKernelMapOfLe_surjective hlm hmn) /-- States the theorem `quotientKernelQuotientKerEquivQuotientKernelOfLe_mk'`. -/ -@[simp] 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 @@ -526,7 +526,7 @@ def quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe {l m n : ℕ} (F.quotientKernelQuotientKerEquivQuotientKernelOfLe hlm hmn) /-- States the theorem `quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk'`. -/ -@[simp] 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 @@ -610,7 +610,7 @@ def quotientKernelByNextKernelEquivGradedPiece {n N : ℕ} (hN : n + 1 ≤ N) : (Nat.le_succ n) hN).trans (F.gradedPieceEquivQuotientKernel n).symm /-- States the theorem `gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk'`. -/ -@[simp] 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 @@ -675,7 +675,7 @@ def quotientInertiaByWildKernelEquivTameQuotient {n : ℕ} (hn : 1 ≤ n) : (Nat.zero_le 1) hn).trans F.tameQuotientEquivQuotientKernel.symm /-- States the theorem `tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk'`. -/ -@[simp] theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' +theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' {n : ℕ} (hn : 1 ≤ n) (q : F.quotientKernelOfLe (le_trans (Nat.zero_le 1) hn)) : F.tameQuotientEquivQuotientKernel @@ -723,7 +723,7 @@ def quotientQuotientKernelOfLeEquivQuotient {m n : ℕ} (hmn : m ≤ n) : (F.quotientMapOfLe hmn) (F.quotientMapOfLe_surjective hmn)) /-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'`. -/ -@[simp] theorem quotientQuotientKernelOfLeEquivQuotient_mk' +theorem quotientQuotientKernelOfLeEquivQuotient_mk' {m n : ℕ} (hmn : m ≤ n) (q : F.quotient n) : F.quotientQuotientKernelOfLeEquivQuotient hmn (QuotientGroup.mk' (F.quotientKernelOfLe hmn) q) = @@ -731,7 +731,7 @@ def quotientQuotientKernelOfLeEquivQuotient {m n : ℕ} (hmn : m ≤ n) : exact QuotientGroup.kerLift_mk (F.quotientMapOfLe hmn) q /-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'_mk'`. -/ -@[simp] theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' +theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' {m n : ℕ} (hmn : m ≤ n) (σ : G) : F.quotientQuotientKernelOfLeEquivQuotient hmn (QuotientGroup.mk' (F.quotientKernelOfLe hmn) @@ -1221,7 +1221,7 @@ def quotientInertiaByWildKernelEquivTameQuotient {n : ℕ} (hn : 1 ≤ n) : A.tameQuotientEquivLowerFiltration.symm /-- States the theorem `tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk'`. -/ -@[simp] theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' +theorem tameQuotientEquivQuotientKernel_quotientInertiaByWildKernel_mk' {n : ℕ} (hn : 1 ≤ n) (q : A.toLowerRamificationFiltration.quotientKernelOfLe @@ -1495,7 +1495,7 @@ def quotientKernelQuotientKerEquivQuotientKernelOfLe {l m n : ℕ} A.toLowerRamificationFiltration hlm hmn /-- States the theorem `quotientKernelQuotientKerEquivQuotientKernelOfLe_mk'`. -/ -@[simp] theorem quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' +theorem quotientKernelQuotientKerEquivQuotientKernelOfLe_mk' {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) (q : A.toLowerRamificationFiltration.quotientKernelOfLe @@ -1521,7 +1521,7 @@ def quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe {l m n : ℕ} A.toLowerRamificationFiltration hlm hmn /-- States the theorem `quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk'`. -/ -@[simp] theorem quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' +theorem quotientKernelQuotientSubgroupOfEquivQuotientKernelOfLe_mk' {l m n : ℕ} (hlm : l ≤ m) (hmn : m ≤ n) (q : A.toLowerRamificationFiltration.quotientKernelOfLe @@ -1559,7 +1559,7 @@ def quotientQuotientKernelOfLeEquivQuotient A.toLowerRamificationFiltration.quotientQuotientKernelOfLeEquivQuotient hmn /-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'`. -/ -@[simp] theorem quotientQuotientKernelOfLeEquivQuotient_mk' +theorem quotientQuotientKernelOfLeEquivQuotient_mk' {m n : ℕ} (hmn : m ≤ n) (q : A.toLowerRamificationFiltration.quotient n) : A.quotientQuotientKernelOfLeEquivQuotient hmn @@ -1570,7 +1570,7 @@ def quotientQuotientKernelOfLeEquivQuotient hmn q /-- States the theorem `quotientQuotientKernelOfLeEquivQuotient_mk'_mk'`. -/ -@[simp] theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' +theorem quotientQuotientKernelOfLeEquivQuotient_mk'_mk' {m n : ℕ} (hmn : m ≤ n) (σ : G) : A.quotientQuotientKernelOfLeEquivQuotient hmn (QuotientGroup.mk' @@ -1644,7 +1644,7 @@ def quotientKernelByNextKernelEquivGradedPiece {n N : ℕ} (hN : n + 1 ≤ N) : A.toLowerRamificationFiltration.quotientKernelByNextKernelEquivGradedPiece hN /-- States the theorem `gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk'`. -/ -@[simp] theorem gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk' +theorem gradedPieceEquivQuotientKernel_quotientKernelByNextKernel_mk' {n N : ℕ} (hN : n + 1 ≤ N) (q : A.toLowerRamificationFiltration.quotientKernelOfLe diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean index 23275a9f77..3413cefa36 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -49,9 +49,11 @@ theorem depth_inv (σ : G) : D.depth σ⁻¹ = D.depth σ := by 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) @@ -100,7 +102,7 @@ omit [H.Normal] in /-- The ramification index in the purely group-theoretic calculation, namely `|H_0|`. -/ -def depthRamificationIndex [Finite G] : ℕ := +def depthRamificationIndex : ℕ := Nat.card ((D.depthLowerFiltration H).lower 0) /-- The actual normalized average of the finite depths in a nontrivial @@ -179,7 +181,7 @@ theorem depth_eq_zero_of_not_mem_lower_zero (τ : H) 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 : ℕ) [Fintype G] : +theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Finite G] : (∑ τ : H, (WithTop.untopD (α := ℕ) 0 (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ)) = @@ -187,6 +189,8 @@ theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Fintype G] : ∑ τ : (D.depthLowerFiltration H).lower 0, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 τ => @@ -210,14 +214,16 @@ theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Fintype G] : intro τ simp [p] _ = ∑ τ : F.lower 0, - ((1 : ℝ) + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) n τ : ℝ)) := by + ((1 : ℝ) + + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) n τ : ℝ) := by + ∑ τ : F.lower 0, + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) n τ : ℝ) := by rw [Finset.sum_add_distrib] congr 1 calc @@ -273,7 +279,9 @@ theorem quotientFiberAverage_sub_one_eq_herbrandValueNat_of_depth_eq_succ have hdecomp := D.sum_min_depth_eq_card_add_truncated H n rw [← hsum] at hdecomp rw [quotientFiberAverage, hdecomp] - rw [show (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat (D.depthLowerFiltration H)) n = + rw [show + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + (D.depthLowerFiltration H)) n = (∑ τ : (D.depthLowerFiltration H).lower 0, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ)) / D.depthRamificationIndex H by @@ -391,12 +399,17 @@ theorem quotientFiberAverage_ge_herbrandFunction_add_one_iff_exists rw [hdepth] exact WithTop.coe_le_coe rw [hfiber, hwithTopNat, ← hrealNat] - change D.quotientFiberAverage H hq ≥ (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s + 1 ↔ _ - rw [show D.quotientFiberAverage H hq ≥ (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s + 1 ↔ + change D.quotientFiberAverage H hq ≥ + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F) s + 1 ↔ _ + rw [show D.quotientFiberAverage H hq ≥ + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F) s + 1 ↔ (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s ≤ D.quotientFiberAverage H hq - 1 by constructor <;> intro h <;> linarith] rw [havg] - exact (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).le_iff_le + exact + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).le_iff_le /-- Every nontrivial quotient fibre admits a maximal representative for which the Herbrand fibre-average identity holds. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean index efcce072f4..df595bdd25 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean @@ -30,7 +30,8 @@ def fixedFieldSubextensionFiltration (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) : AntitoneNormalSubgroupFiltration Gal(L/IntermediateField.fixedField H) := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) omit [IsGalois K L] in @@ -69,33 +70,39 @@ theorem card_fixedFieldSubextension_mul_card_fixedFieldQuotientImage 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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + change Nat.card + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H)).lower n) * - Nat.card (((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport F H) + Nat.card + (((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport F H) (IsGalois.normalAutEquivQuotient H)).lower n) = _ rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) n] - exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_subgroupFiltration_mul_card_quotientImageTransport F H + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_subgroupFiltration_mul_card_quotientImageTransport F H (IsGalois.normalAutEquivQuotient H) n omit [IsGalois K L] in /-- States the theorem `fixedFieldSubextension_herbrandFunction`. -/ theorem fixedFieldSubextension_herbrandFunction - [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (fixedFieldSubextensionFiltration F H)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (fixedFieldSubextensionFiltration F H)) s = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) s omit [IsGalois K L] in /-- States the theorem `fixedFieldSubextension_inverseHerbrandFunction`. -/ theorem fixedFieldSubextension_inverseHerbrandFunction - [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) (t : ℝ) : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldSubextensionFiltration F H)) t = @@ -103,31 +110,35 @@ theorem fixedFieldSubextension_inverseHerbrandFunction let : Fintype H := Fintype.ofFinite H let : Fintype Gal(L/IntermediateField.fixedField H) := Fintype.ofFinite Gal(L/IntermediateField.fixedField H) - exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) t /-- States the theorem `fixedFieldQuotientImage_herbrandFunction`. -/ theorem fixedFieldQuotientImage_herbrandFunction - [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) [H.Normal] (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (fixedFieldQuotientImageFiltration F H)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (fixedFieldQuotientImageFiltration F H)) s = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) s := by let : Fintype Gal(IntermediateField.fixedField H/K) := Fintype.ofFinite Gal(IntermediateField.fixedField H/K) - exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_herbrandFunction F H + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_herbrandFunction F H (IsGalois.normalAutEquivQuotient H) s /-- States the theorem `fixedFieldQuotientImage_inverseHerbrandFunction`. -/ theorem fixedFieldQuotientImage_inverseHerbrandFunction - [Fintype Gal(L/K)] + (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) [H.Normal] (t : ℝ) : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldQuotientImageFiltration F H)) t = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) t := by let : Fintype Gal(IntermediateField.fixedField H/K) := Fintype.ofFinite Gal(IntermediateField.fixedField H/K) - exact RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_inverseHerbrandFunction F H + exact + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_inverseHerbrandFunction F H (IsGalois.normalAutEquivQuotient H) t end Higher diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean index 1004be9cea..ffe639aa17 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean @@ -31,9 +31,11 @@ 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 _ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean index 391e29130d..68d35dd617 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -48,7 +48,7 @@ def subgroupFiltration (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) rfl /-- States the theorem `mem_subgroupFiltration_lower_iff`. -/ -@[simp] 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 := @@ -133,7 +133,7 @@ def lowerToQuotientImageKerEquiv (F : AntitoneNormalSubgroupFiltration G) /-- Exact level-cardinality factorization `|F_n| = |F_n ∩ H| * |image(F_n)|`. -/ theorem card_subgroupFiltration_mul_card_quotientImageFiltration - [Finite G] (F : AntitoneNormalSubgroupFiltration G) + (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] (n : ℕ) : Nat.card ((subgroupFiltration F H).lower n) * Nat.card ((quotientImageFiltration F H).lower n) = @@ -169,7 +169,7 @@ def transportEquiv (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') : rfl /-- States the theorem `mem_transportEquiv_lower_iff`. -/ -@[simp] 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 := @@ -190,7 +190,7 @@ def lowerEquivTransportEquiv /-- States the theorem `card_lower_transportEquiv`. -/ theorem card_lower_transportEquiv - [Finite G] [Finite G'] + (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 @@ -200,8 +200,11 @@ equivalence. -/ theorem herbrandFunction_transportEquiv [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (transportEquiv F e)) s = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s := by - apply RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq (transportEquiv F e) F + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (transportEquiv F e)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s := by + apply + RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq (transportEquiv F e) F intro n exact card_lower_transportEquiv F e n @@ -211,7 +214,8 @@ theorem inverseHerbrandFunction_transportEquiv [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (t : ℝ) : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (transportEquiv F e)) t = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t := by - apply (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono (transportEquiv F e)).injective + apply + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono (transportEquiv F e)).injective rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv F)] rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction F)] @@ -297,7 +301,8 @@ theorem quotientImageTransport_herbrandFunction [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] (e : (G ⧸ H) ≃* G') (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (quotientImageTransport F H e)) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (quotientImageTransport F H e)) s = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (quotientImageFiltration F H)) s := by exact herbrandFunction_transportEquiv (quotientImageFiltration F H) e s diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean index e90ac7ade4..e59b9433fb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean @@ -21,7 +21,8 @@ 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 +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. -/ @@ -69,16 +70,20 @@ variable (H : Subgroup G) [H.Normal] 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) @@ -207,7 +212,8 @@ theorem depth_mul_eq_min_of_maximal_representative /-- 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. -/ +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} diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean index 0bedd9adc4..e7ecc7e186 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean @@ -102,9 +102,9 @@ theorem absoluteValueConjugacy_exists_conjugatingAlgEquiv (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (w w' : AbsoluteValueExtension vK L) : ∃ σ : L ≃ₐ[K] L, w'.1 = absoluteValueConjugate w.1 σ := by - let A := absoluteValueExtension_algebraicCompletionClosure vK - let τ : L →ₐ[K] A := absoluteValueExtension_embeddingOfExtension vK w - let τ' : L →ₐ[K] A := absoluteValueExtension_embeddingOfExtension vK w' + 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 @@ -114,8 +114,8 @@ theorem absoluteValueConjugacy_exists_conjugatingAlgEquiv absoluteValueExtension_extension_eq_pullback_embeddingOfExtension vK hvK w] ext x change - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (τ' x) = - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (τ (σ x)) + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (τ' x) = + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (τ (σ x)) congr 1 simpa [σ, τ, AlgHom.restrictNormal', RingHom.algebraMap_toAlgebra] using (τ'.restrictNormal_commutes L x).symm diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean index 7837480d37..cb0f0a626e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean @@ -82,7 +82,7 @@ def valuationPreservingCompletionRingEquiv (valuationPreservingWithAbsRingEquiv_isometry vK w σ hσ).continuous (valuationPreservingWithAbsRingEquiv_symm_isometry vK w σ hσ).continuous -@[simp] theorem valuationPreservingCompletionRingEquiv_toCompletion +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) = @@ -430,7 +430,8 @@ def localizationToDecompositionGroup 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_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] @@ -572,7 +573,8 @@ omit hvK include hvK -/-- The localization and decomposition comparison (decomposition groups): for a possibly infinite Galois +/-- 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 : @@ -607,7 +609,7 @@ def decompositionGroupEquivAlgebraicLocalizationAut : localizationToDecompositionGroup vK hvK w τ := rfl -@[simp] theorem localizationRamificationGroups_decompositionGroupEquiv_toLocalization +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean index cc2c3383b6..2c96969b47 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -89,7 +89,7 @@ private theorem galoisPullbackElement_commutes include hsquare in /-- The conjugation and base-change law: conjugation along a commutative square restricts to a homomorphism on Galois groups. -/ -def galoisPullback_galoisPullback : (L' ≃ₐ[K'] L') →* (L ≃ₐ[K] L) where +def galoisPullbackGaloisPullback : (L' ≃ₐ[K'] L') →* (L ≃ₐ[K] L) where toFun := galoisPullbackElement tauK tauL hsquare map_one' := by ext x @@ -108,7 +108,7 @@ def galoisPullback_galoisPullback : (L' ≃ₐ[K'] L') →* (L ≃ₐ[K] L) wher /-- The defining equation `tauL (tau^* sigma x) = sigma (tauL x)`. -/ @[simp] theorem galoisPullback_galoisPullback_commutes (sigma : L' ≃ₐ[K'] L') (x : L) : - tauL (galoisPullback_galoisPullback tauK tauL hsquare sigma x) = + tauL (galoisPullbackGaloisPullback tauK tauL hsquare sigma x) = sigma (tauL x) := galoisPullbackElement_commutes tauK tauL hsquare sigma x @@ -116,24 +116,24 @@ 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 galoisPullback_absoluteValueDecompositionGroupMap (w' : AbsoluteValue L' ℝ) : +def galoisPullbackAbsoluteValueDecompositionGroupMap (w' : AbsoluteValue L' ℝ) : absoluteValueDecompositionGroup K' w' →* absoluteValueDecompositionGroup K (w'.comp (f := tauL) tauL.injective) where toFun sigma := - ⟨galoisPullback_galoisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + ⟨galoisPullbackGaloisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by intro x change w' (tauL - (galoisPullback_galoisPullback tauK tauL hsquare + (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 (galoisPullback_galoisPullback tauK tauL hsquare) + exact map_one (galoisPullbackGaloisPullback tauK tauL hsquare) map_mul' sigma rho := by apply Subtype.ext - exact map_mul (galoisPullback_galoisPullback tauK tauL hsquare) + exact map_mul (galoisPullbackGaloisPullback tauK tauL hsquare) (sigma : L' ≃ₐ[K'] L') (rho : L' ≃ₐ[K'] L') namespace ValuationSubring @@ -204,15 +204,15 @@ private theorem mem_inertiaGroup_iff_sub_mem_nonunits include hsquare in /-- The conjugation and base-change law in the valuation-subring model: decomposition groups map under pullback along the commutative square. -/ -def galoisPullback_decompositionGroupMap : +def galoisPullbackDecompositionGroupMap : decompositionGroup K' A' →* decompositionGroup K (pulledValuationSubring tauL A') where toFun sigma := - ⟨galoisPullback_galoisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by + ⟨galoisPullbackGaloisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'), by ext x rw [_root_.ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] change tauL - ((galoisPullback_galoisPullback tauK tauL hsquare + ((galoisPullbackGaloisPullback tauK tauL hsquare (sigma : L' ≃ₐ[K'] L'))⁻¹ x) ∈ A' ↔ tauL x ∈ A' have hinv := galoisPullback_galoisPullback_commutes @@ -226,15 +226,15 @@ def galoisPullback_decompositionGroupMap : exact ⟨fun h => hmem.mp h, fun h => hmem.symm.mp h⟩⟩ map_one' := by apply Subtype.ext - exact map_one (galoisPullback_galoisPullback tauK tauL hsquare) + exact map_one (galoisPullbackGaloisPullback tauK tauL hsquare) map_mul' sigma rho := by apply Subtype.ext - exact map_mul (galoisPullback_galoisPullback tauK tauL hsquare) + 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 ((((galoisPullback_decompositionGroupMap tauK tauL hsquare A' sigma : + tauL ((((galoisPullbackDecompositionGroupMap tauK tauL hsquare A' sigma : decompositionGroup K (pulledValuationSubring tauL A')) : L ≃ₐ[K] L) x)) = (sigma : L' ≃ₐ[K'] L') (tauL x) := @@ -244,11 +244,11 @@ private theorem decompositionGroupMap_commutes include hsquare in /-- The conjugation and base-change law in the valuation-subring model: inertia groups map under pullback along the commutative square. -/ -def galoisPullback_inertiaGroupMap : +def galoisPullbackInertiaGroupMap : inertiaGroup K' A' →* inertiaGroup K (pulledValuationSubring tauL A') where toFun sigma := by - let delta := galoisPullback_decompositionGroupMap tauK tauL hsquare A' + let delta := galoisPullbackDecompositionGroupMap tauK tauL hsquare A' (sigma : decompositionGroup K' A') refine ⟨delta, ?_⟩ rw [mem_inertiaGroup_iff_sub_mem_nonunits] @@ -260,21 +260,21 @@ def galoisPullback_inertiaGroupMap : ⟨tauL (x : L), x.property⟩ map_one' := by apply Subtype.ext - exact map_one (galoisPullback_decompositionGroupMap tauK tauL hsquare A') + exact map_one (galoisPullbackDecompositionGroupMap tauK tauL hsquare A') map_mul' sigma rho := by apply Subtype.ext - exact map_mul (galoisPullback_decompositionGroupMap tauK tauL hsquare A') + 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 (((((galoisPullback_inertiaGroupMap tauK tauL hsquare A' sigma : + 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 [galoisPullback_inertiaGroupMap] using + simpa [galoisPullbackInertiaGroupMap] using decompositionGroupMap_commutes tauK tauL hsquare A' (sigma : decompositionGroup K' A') x @@ -282,7 +282,7 @@ private theorem automorphismUnitQuotient_map (sigma : inertiaGroup K' A') (x : Lˣ) : Units.map tauL (automorphismUnitQuotient K (pulledValuationSubring tauL A') - ((galoisPullback_inertiaGroupMap tauK tauL hsquare A' sigma : + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' sigma : inertiaGroup K (pulledValuationSubring tauL A')) : decompositionGroup K (pulledValuationSubring tauL A')) x) = automorphismUnitQuotient K' A' @@ -297,7 +297,7 @@ private theorem ramificationPredicate_map A'.principalUnitGroup) : ∀ x : Lˣ, automorphismUnitQuotient K (pulledValuationSubring tauL A') - ((galoisPullback_inertiaGroupMap tauK tauL hsquare A' sigma : + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' sigma : inertiaGroup K (pulledValuationSubring tauL A')) : decompositionGroup K (pulledValuationSubring tauL A')) x ∈ (pulledValuationSubring tauL A').principalUnitGroup := by @@ -310,16 +310,16 @@ private theorem ramificationPredicate_map include hsquare in /-- The conjugation and base-change law in the valuation-subring model: ramification groups map under pullback along the commutative square. -/ -def galoisPullback_ramificationGroupMap : +def galoisPullbackRamificationGroupMap : ramificationGroup K' A' →* ramificationGroup K (pulledValuationSubring tauL A') := - ((galoisPullback_inertiaGroupMap tauK tauL hsquare A').domRestrict + ((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') - ((galoisPullback_inertiaGroupMap tauK tauL hsquare A' + ((galoisPullbackInertiaGroupMap tauK tauL hsquare A' (sigma : inertiaGroup K' A') : inertiaGroup K (pulledValuationSubring tauL A')) : decompositionGroup K (pulledValuationSubring tauL A')) x ∈ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean index 32142c8c8a..f814b4d116 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -143,7 +143,7 @@ abbrev inertiaUnitQuotientClass (automorphismUnitQuotient K A (σ : decompositionGroup K A) x) /-- States the theorem `inertiaUnitQuotientClass_eq_one_iff`. -/ -@[simp] 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 ∈ @@ -258,7 +258,7 @@ def principalUnitQuotientToValueClass exact A.principal_units_le_units hx) /-- States the theorem `principalUnitQuotientToValueClass_mk`. -/ -@[simp] theorem principalUnitQuotientToValueClass_mk +theorem principalUnitQuotientToValueClass_mk (A : _root_.ValuationSubring L) (x : Lˣ) : principalUnitQuotientToValueClass A (QuotientGroup.mk' A.principalUnitGroup x) = @@ -273,7 +273,7 @@ abbrev valueDisplacementClass QuotientGroup.mk' A.unitGroup (automorphismUnitQuotient K A σ x) /-- States the theorem `valueDisplacementClass_eq_one_iff`. -/ -@[simp] 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 := @@ -589,7 +589,7 @@ def valueClassToResidueUnits (unitGroup_le_valueTrivialInertiaResidueUnitHom_ker (K := K) A σ) /-- States the theorem `valueClassToResidueUnits_mk`. -/ -@[simp] theorem valueClassToResidueUnits_mk +theorem valueClassToResidueUnits_mk (A : _root_.ValuationSubring L) (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : valueClassToResidueUnits K A σ @@ -682,7 +682,7 @@ def valueClassToPrincipalUnitQuotient (unitGroup_le_inertiaUnitQuotientHom_ker (K := K) A σ) /-- States the theorem `valueClassToPrincipalUnitQuotient_mk`. -/ -@[simp] theorem valueClassToPrincipalUnitQuotient_mk +theorem valueClassToPrincipalUnitQuotient_mk (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ) : valueClassToPrincipalUnitQuotient K A σ (QuotientGroup.mk' A.unitGroup x) = @@ -755,7 +755,7 @@ def valueModuloBaseToPrincipalUnitQuotient (K := K) A σ) /-- States the theorem `valueModuloBaseToPrincipalUnitQuotient_mk`. -/ -@[simp] theorem valueModuloBaseToPrincipalUnitQuotient_mk +theorem valueModuloBaseToPrincipalUnitQuotient_mk (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) (x : Lˣ ⧸ A.unitGroup) : valueModuloBaseToPrincipalUnitQuotient K A σ @@ -764,7 +764,7 @@ def valueModuloBaseToPrincipalUnitQuotient rfl /-- States the theorem `valueModuloBaseToPrincipalUnitQuotient_mk_mk`. -/ -@[simp] 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) @@ -797,7 +797,7 @@ def valueModuloBaseToResidueUnits (K := K) A σ) /-- States the theorem `valueModuloBaseToResidueUnits_mk`. -/ -@[simp] theorem valueModuloBaseToResidueUnits_mk +theorem valueModuloBaseToResidueUnits_mk (A : _root_.ValuationSubring L) (σ : valueTrivialInertiaGroup K A) (x : Lˣ ⧸ A.unitGroup) : valueModuloBaseToResidueUnits K A σ @@ -806,7 +806,7 @@ def valueModuloBaseToResidueUnits rfl /-- States the theorem `valueModuloBaseToResidueUnits_mk_mk`. -/ -@[simp] theorem valueModuloBaseToResidueUnits_mk_mk +theorem valueModuloBaseToResidueUnits_mk_mk (A : _root_.ValuationSubring L) (σ : valueTrivialInertiaGroup K A) (x : Lˣ) : valueModuloBaseToResidueUnits K A σ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean index 0571df6773..b403d9979b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean @@ -213,7 +213,6 @@ theorem decompositionResidueAction_apply rfl /-- States the theorem `decompositionResidueAction_algebraMap`. -/ -@[simp] theorem decompositionResidueAction_algebraMap (sigma : ValuationSubring.decompositionGroup K target.valuation.valuationSubring) @@ -486,7 +485,6 @@ def galQuotientInertiaEquivResidueGalois (K := K) (base := base) (target := target))) /-- States the theorem `galQuotientInertiaEquivResidueGalois_mk`. -/ -@[simp] theorem galQuotientInertiaEquivResidueGalois_mk [IsGalois K L] (sigma : L ≃ₐ[K] L) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean index 085e698533..85841f5256 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean @@ -29,7 +29,7 @@ abbrev absoluteValueDecompositionField (w : AbsoluteValue L ℝ) : IntermediateField K L := IntermediateField.fixedField (absoluteValueDecompositionGroup K w) -@[simp] theorem mem_absoluteValueDecompositionField_iff +theorem mem_absoluteValueDecompositionField_iff (w : AbsoluteValue L ℝ) (x : L) : x ∈ absoluteValueDecompositionField K w ↔ ∀ σ ∈ absoluteValueDecompositionGroup K w, σ x = x := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean index 10a787239a..8b7d416778 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -35,12 +35,16 @@ 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 @@ -50,6 +54,7 @@ private abbrev localization : IntermediateField vK.Completion w.1.Completion := private abbrev toLocalization : L →+* localization vK w := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 +/-- 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 @@ -62,7 +67,7 @@ local instance proposition98LocalizationScalarTower : /-- The dense copy of `L` in the localization, as a `K`-algebra embedding for the scalar tower `K → K_v → L_w`. -/ -def decompositionField_toLocalizationAlgHom : +def decompositionFieldToLocalizationAlgHom : L →ₐ[K] localization vK w where __ := toLocalization vK w commutes' x := AbsoluteValue.toAlgebraicLocalization_algebraMap vK w.1 w.2 x @@ -92,10 +97,10 @@ omit hvK in theorem decompositionField_toLocalization_isSeparable (x : L) : IsSeparable vK.Completion (toLocalization vK w x) := by have hx : IsSeparable K - (decompositionField_toLocalizationAlgHom vK w x) := + (decompositionFieldToLocalizationAlgHom vK w x) := (Algebra.IsSeparable.isSeparable K x).map - (decompositionField_toLocalizationAlgHom vK w) - (decompositionField_toLocalizationAlgHom vK w).injective + (decompositionFieldToLocalizationAlgHom vK w) + (decompositionFieldToLocalizationAlgHom vK w).injective exact IsSeparable.tower_top vK.Completion hx omit hvK in @@ -104,7 +109,7 @@ 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 := decompositionField_toLocalizationAlgHom vK w + 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 @@ -181,7 +186,7 @@ theorem algebraicLocalization_isGalois : decompositionField_localization_normal vK w⟩ /-- The copy of `K_v` as an actual subfield of the algebraic localization. -/ -abbrev decompositionField_completionImageSubfield : +abbrev decompositionFieldCompletionImageSubfield : Subfield (localization vK w) := (algebraMap vK.Completion (localization vK w)).fieldRange @@ -191,7 +196,7 @@ include hvK decomposition field exactly when its image in `L_w` belongs to the embedded copy of `K_v`. -/ theorem decompositionField_decompositionField_eq_completionImage_comap : - (decompositionField_completionImageSubfield vK w).comap + (decompositionFieldCompletionImageSubfield vK w).comap (toLocalization vK w) = (absoluteValueDecompositionField K w.1).toSubfield := by let : IsGalois vK.Completion (localization vK w) := @@ -231,18 +236,18 @@ theorem decompositionField_decompositionField_eq_completionImage_comap : 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 ⊓ - decompositionField_completionImageSubfield vK w = + decompositionFieldCompletionImageSubfield vK w = (absoluteValueDecompositionField K w.1).toSubfield.map (toLocalization vK w) := by calc (toLocalization vK w).fieldRange ⊓ - decompositionField_completionImageSubfield vK w = - decompositionField_completionImageSubfield vK w ⊓ + decompositionFieldCompletionImageSubfield vK w = + decompositionFieldCompletionImageSubfield vK w ⊓ (toLocalization vK w).fieldRange := by rw [inf_comm] - _ = ((decompositionField_completionImageSubfield vK w).comap + _ = ((decompositionFieldCompletionImageSubfield vK w).comap (toLocalization vK w)).map (toLocalization vK w) := (Subfield.map_comap_eq (toLocalization vK w) - (decompositionField_completionImageSubfield vK w)).symm + (decompositionFieldCompletionImageSubfield vK w)).symm _ = (absoluteValueDecompositionField K w.1).toSubfield.map (toLocalization vK w) := by rw [decompositionField_decompositionField_eq_completionImage_comap @@ -282,7 +287,8 @@ theorem decompositionField_completion_nonarchimedean ((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. -/ +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 := @@ -311,7 +317,8 @@ theorem decompositionField_decompositionField_valueRange_eq 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 + (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 := @@ -328,13 +335,13 @@ theorem decompositionField_decompositionField_valueRange_eq omit hvK /-- The valuation subring of the nonarchimedean base absolute value. -/ -abbrev decompositionField_baseValuationSubring +abbrev decompositionFieldBaseValuationSubring (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : _root_.ValuationSubring K := absoluteValueValuationSubring vK hv /-- The valuation subring of `w|Z_w`. -/ -abbrev decompositionField_decompositionFieldValuationSubring +abbrev decompositionFieldDecompositionFieldValuationSubring (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : _root_.ValuationSubring (absoluteValueDecompositionField K w.1) := absoluteValueValuationSubring @@ -344,13 +351,13 @@ abbrev decompositionField_decompositionFieldValuationSubring /-- The canonical local homomorphism between the two valuation subrings in the decomposition-field extension comparison. -/ -def decompositionField_decompositionField_integerMap +def decompositionFieldDecompositionFieldIntegerMap (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : - decompositionField_baseValuationSubring vK hv →+* - decompositionField_decompositionFieldValuationSubring vK w hv := by + decompositionFieldBaseValuationSubring vK hv →+* + decompositionFieldDecompositionFieldValuationSubring vK w hv := by let Z := absoluteValueDecompositionField K w.1 - let AK := decompositionField_baseValuationSubring vK hv - let AZ := decompositionField_decompositionFieldValuationSubring vK w hv + 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] @@ -362,9 +369,9 @@ def decompositionField_decompositionField_integerMap omit [IsGalois K L] in @[simp] theorem decompositionField_decompositionField_integerMap_apply (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) - (x : decompositionField_baseValuationSubring vK hv) : - ((decompositionField_decompositionField_integerMap vK w hv x : - decompositionField_decompositionFieldValuationSubring vK w hv) : + (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 @@ -372,7 +379,7 @@ omit [IsGalois K L] in /-- The valuation-ring map in the decomposition-field extension comparison is local. -/ instance decompositionField_decompositionField_integerMap_isLocalHom (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : - IsLocalHom (decompositionField_decompositionField_integerMap vK w hv) where + IsLocalHom (decompositionFieldDecompositionFieldIntegerMap vK w hv) where map_nonunit x hx := by rw [← IsLocalRing.notMem_maximalIdeal] at hx ⊢ intro hxmax @@ -390,13 +397,13 @@ instance decompositionField_decompositionField_integerMap_isLocalHom exact hxabs /-- The induced canonical map of actual residue fields. -/ -def decompositionField_decompositionField_residueMap +def decompositionFieldDecompositionFieldResidueMap (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : - IsLocalRing.ResidueField (decompositionField_baseValuationSubring vK hv) →+* + IsLocalRing.ResidueField (decompositionFieldBaseValuationSubring vK hv) →+* IsLocalRing.ResidueField - (decompositionField_decompositionFieldValuationSubring vK w hv) := + (decompositionFieldDecompositionFieldValuationSubring vK w hv) := IsLocalRing.ResidueField.map - (decompositionField_decompositionField_integerMap vK w hv) + (decompositionFieldDecompositionFieldIntegerMap vK w hv) include hvK @@ -406,11 +413,11 @@ it modulo the maximal ideal by an element of `K`. -/ theorem decompositionField_decompositionField_residueMap_surjective (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : Function.Surjective - (decompositionField_decompositionField_residueMap vK w hv) := by + (decompositionFieldDecompositionFieldResidueMap vK w hv) := by let Z := absoluteValueDecompositionField K w.1 - let AK := decompositionField_baseValuationSubring vK hv - let AZ := decompositionField_decompositionFieldValuationSubring vK w hv - let f := decompositionField_decompositionField_integerMap vK w hv + 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⟩ @@ -487,23 +494,24 @@ theorem decompositionField_decompositionField_residueMap_surjective ring _ < 1 := hclose -/-- The decomposition-field extension comparison, residue-field form: the canonical residue map is an +/-- The decomposition-field extension comparison, residue-field form: the canonical residue map +is an isomorphism of the actual residue fields. -/ -def decompositionField_decompositionField_residueFieldEquiv +def decompositionFieldDecompositionFieldResidueFieldEquiv (hv : LubinTate.Valuations.NonarchimedeanAbsoluteValue vK) : - IsLocalRing.ResidueField (decompositionField_baseValuationSubring vK hv) ≃+* + IsLocalRing.ResidueField (decompositionFieldBaseValuationSubring vK hv) ≃+* IsLocalRing.ResidueField - (decompositionField_decompositionFieldValuationSubring vK w hv) := + (decompositionFieldDecompositionFieldValuationSubring vK w hv) := ValuationTheory.DiscreteValuationField.ResidueField.ringEquivOfSurjective - (decompositionField_decompositionField_integerMap vK w hv) + (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 - (decompositionField_baseValuationSubring vK hv)) : - decompositionField_decompositionField_residueFieldEquiv vK hvK w hv x = - decompositionField_decompositionField_residueMap vK w hv x := + (decompositionFieldBaseValuationSubring vK hv)) : + decompositionFieldDecompositionFieldResidueFieldEquiv vK hvK w hv x = + decompositionFieldDecompositionFieldResidueMap vK w hv x := rfl omit hvK diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean index 14774ece9d..16b781d0a7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean @@ -101,7 +101,8 @@ theorem decompositionGroupRestriction_restrictAutomorphismScalars_injective : 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) σ ∈ + RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars (K := K) + (M := M) σ ∈ absoluteValueDecompositionGroup K w ↔ σ ∈ absoluteValueDecompositionGroup M w := Iff.rfl @@ -112,7 +113,8 @@ inside `G(L/K)`, the decomposition group over `M` is theorem decompositionGroupRestriction_absoluteValueDecompositionGroup_range_eq_inf (w : AbsoluteValue L ℝ) : Subgroup.map - (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars (K := K) (M := M)) + (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars (K + := K) (M := M)) (absoluteValueDecompositionGroup M w) = absoluteValueDecompositionGroup K w ⊓ (RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean index 089091831b..9ca0251566 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean @@ -41,7 +41,6 @@ abbrev decompositionGroup /-- Membership in the decomposition group is exactly stabilization of the prime ideal. -/ -@[simp] theorem mem_decompositionGroup_iff {P : Ideal B} {G : Type*} [Group G] [MulSemiringAction G B] {σ : G} : σ ∈ decompositionGroup P G ↔ σ • P = P := @@ -55,7 +54,6 @@ abbrev inertiaGroup P.toAddSubgroup.inertia G /-- Membership in the inertia group is trivial action on the residue ring. -/ -@[simp] theorem mem_inertiaGroup_iff {P : Ideal B} {G : Type*} [Group G] [MulSemiringAction G B] {σ : G} : σ ∈ inertiaGroup P G ↔ ∀ x : B, σ • x - x ∈ P := @@ -119,7 +117,7 @@ theorem dedekindRamification_ramificationIdx_eq /-- 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.IsMaximal] (P Q : Ideal B) + (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] : @@ -129,7 +127,7 @@ theorem dedekindRamification_inertiaDeg_eq /-- Decomposition and inertia groups satisfy: the primes above `p` are identified with the cosets `G/G_P`. -/ -noncomputable def dedekindDecomposition_primesOverEquivQuotientDecompositionGroup +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] : @@ -265,7 +263,7 @@ theorem dedekindRamification_residueAction_shortExact /-- The localization and decomposition comparison gives: the quotient of the decomposition group by inertia is the residue Galois group. -/ -def dedekindRamification_decompositionQuotientInertiaEquivResidueGalois +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] : @@ -301,7 +299,7 @@ theorem dedekindRamification_residueAction_bijective_of_inertiaGroup_eq_bot /-- A trivial-inertia special case: when `I_P = 1`, the residue Galois group is isomorphic to `G_P`. -/ -noncomputable def dedekindRamification_decompositionGroupEquivResidueGalois_of_inertiaGroup_eq_bot +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 = ⊥) : @@ -313,13 +311,13 @@ noncomputable def dedekindRamification_decompositionGroupEquivResidueGalois_of_i /-- A trivial-inertia special case: when `I_P = 1`, the residue Galois group embeds into `G` through the decomposition group. -/ -noncomputable def dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot +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 - (dedekindRamification_decompositionGroupEquivResidueGalois_of_inertiaGroup_eq_bot + (dedekindRamificationDecompositionGroupEquivResidueGaloisOfInertiaGroupEqBot p P G hI).symm.toMonoidHom /-- The residue-Galois embedding into `G` from the preceding declaration is @@ -329,12 +327,12 @@ theorem dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot_ (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B] [Algebra.IsInvariant A B G] (hI : inertiaGroup P G = ⊥) : Function.Injective - (dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot p P G hI) := by + (dedekindRamificationResidueGaloisEmbeddingIntoGOfInertiaGroupEqBot p P G hI) := by intro σ τ hστ - apply (dedekindRamification_decompositionGroupEquivResidueGalois_of_inertiaGroup_eq_bot + apply (dedekindRamificationDecompositionGroupEquivResidueGaloisOfInertiaGroupEqBot p P G hI).symm.injective exact Subtype.ext <| by - simpa [dedekindRamification_residueGaloisEmbeddingIntoG_of_inertiaGroup_eq_bot] using hστ + simpa [dedekindRamificationResidueGaloisEmbeddingIntoGOfInertiaGroupEqBot] using hστ @@ -476,7 +474,7 @@ theorem dedekindRamification_decompositionQuotientInertia_card_eq_inertiaDeg Nat.card ((B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) := by exact Nat.card_congr - (dedekindRamification_decompositionQuotientInertiaEquivResidueGalois + (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)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean index 1eb04a9c31..1bacb13b2c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean @@ -31,9 +31,9 @@ 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] [NumberField K] - [Field M] [NumberField M] [Algebra K M] - [FiniteDimensional K M] [IsGalois K M] + [Field K] + [Field M] [Algebra K M] + (A B : IntermediateField K M) [Normal K A] [Normal K B] (Q : Ideal (𝓞 M)) (hsup : A ⊔ B = ⊤) @@ -121,9 +121,9 @@ 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] [NumberField K] + [Field K] [Field M] [NumberField M] [Algebra K M] - [FiniteDimensional K M] [IsGalois K M] + (T : Finset M) (Q : Ideal (𝓞 M)) (hnormal : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean index 955df51e8d..c80e2d9aa9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean @@ -37,7 +37,6 @@ variable {G} /-- Elementwise membership in the inertia field viewed over the decomposition field. -/ -@[simp] theorem mem_inertiaFieldOverDecompositionField_iff {P : Ideal B} [MulSemiringAction G B] {x : L} : x ∈ inertiaFieldOverDecompositionField (K := K) (L := L) G P ↔ @@ -58,7 +57,7 @@ theorem inertiaFieldOverDecompositionField_restrictScalars /-- The prime-decomposition tower identity: identify the decomposition group with `Gal(L/Z_P)`. -/ -def dedekindTower_decompositionGroupEquivGalDecompositionField +def dedekindTowerDecompositionGroupEquivGalDecompositionField (P : Ideal B) [MulSemiringAction G B] [Finite G] [IsGaloisGroup G K L] : decompositionGroup P G ≃* @@ -75,7 +74,7 @@ theorem dedekindTower_decompositionGroupEquivGalDecompositionField_apply (P : Ideal B) [MulSemiringAction G B] [Finite G] [IsGaloisGroup G K L] (σ : decompositionGroup P G) (x : L) : - dedekindTower_decompositionGroupEquivGalDecompositionField + dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P σ x = (σ : G) • x := rfl @@ -110,21 +109,20 @@ abbrev inertiaGroupOverDecompositionField [Finite G] [IsGaloisGroup G K L] : Subgroup (L ≃ₐ[decompositionField (K := K) (L := L) G P] L) := Subgroup.map - (dedekindTower_decompositionGroupEquivGalDecompositionField + (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. -/ -@[simp] 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), - dedekindTower_decompositionGroupEquivGalDecompositionField + dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P (τ : decompositionGroup P G) = σ := by constructor · rintro ⟨τ, hτ, rfl⟩ @@ -140,7 +138,7 @@ instance inertiaGroupOverDecompositionField_normal [Finite G] [IsGaloisGroup G K L] : (inertiaGroupOverDecompositionField (K := K) (L := L) G P).Normal := by let e := - dedekindTower_decompositionGroupEquivGalDecompositionField + dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P simpa [inertiaGroupOverDecompositionField, e] using (Subgroup.Normal.map @@ -166,12 +164,12 @@ theorem dedekindRamification_inertiaFieldOverDecompositionField_fixedField_eq τ ∈ (inertiaGroup P G).subgroupOf (decompositionGroup P G) := hσ have hτmap : - dedekindTower_decompositionGroupEquivGalDecompositionField + dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P τ ∈ inertiaGroupOverDecompositionField (K := K) (L := L) G P := by exact ⟨τ, hτ, rfl⟩ simpa [τ] using hx - (dedekindTower_decompositionGroupEquivGalDecompositionField + (dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P τ) hτmap · intro hx σ hσ rcases @@ -210,7 +208,7 @@ instance inertiaFieldOverDecompositionField_isGalois /-- The localization and decomposition comparison gives: `G_P/I_P ≃ Gal(T_P/Z_P)`, the fixed-field quotient form. -/ -def dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition +def dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition (P : Ideal B) [MulSemiringAction G B] [Finite G] [IsGaloisGroup G K L] : decompositionGroup P G ⧸ @@ -224,7 +222,7 @@ def dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDec (QuotientGroup.congr ((inertiaGroup P G).subgroupOf (decompositionGroup P G)) (inertiaGroupOverDecompositionField (K := K) (L := L) G P) - (dedekindTower_decompositionGroupEquivGalDecompositionField + (dedekindTowerDecompositionGroupEquivGalDecompositionField (K := K) (L := L) G P) rfl).trans (by @@ -259,13 +257,13 @@ theorem dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_quoti (inertiaGroup P G).subgroupOf (decompositionGroup P G)) := by exact Nat.card_congr - (dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (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 dedekindRamification_galInertiaFieldOverDecompositionEquivResidueGalois +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] : @@ -273,9 +271,9 @@ def dedekindRamification_galInertiaFieldOverDecompositionEquivResidueGalois decompositionField (K := K) (L := L) G P] inertiaFieldOverDecompositionField (K := K) (L := L) G P) ≃* (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := - (dedekindRamification_decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition + (dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition (K := K) (L := L) G P).symm.trans - (dedekindRamification_decompositionQuotientInertiaEquivResidueGalois + (dedekindRamificationDecompositionQuotientInertiaEquivResidueGalois (A := A) (B := B) p P G) /-- The localization and decomposition comparison: @@ -298,7 +296,7 @@ theorem dedekindInertiaField_inertiaField_properties inertiaGroup P G := by exact ⟨inferInstance, - ⟨dedekindRamification_galInertiaFieldOverDecompositionEquivResidueGalois + ⟨dedekindRamificationGalInertiaFieldOverDecompositionEquivResidueGalois (A := A) (B := B) (K := K) (L := L) G p P⟩, dedekindRamification_inertiaField_fixingSubgroup_eq (K := K) (L := L) G P⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean index f7640f4879..4b803126be 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean @@ -34,7 +34,6 @@ abbrev fixedFieldOfSubgroup (H : Subgroup G) : IntermediateField K L := variable {G} /-- Elementwise membership in the fixed field of a subgroup. -/ -@[simp] theorem mem_fixedFieldOfSubgroup_iff {H : Subgroup G} {x : L} : x ∈ fixedFieldOfSubgroup (K := K) (L := L) G H ↔ @@ -117,7 +116,6 @@ abbrev decompositionField variable {G} /-- Elementwise membership in the decomposition field. -/ -@[simp] theorem mem_decompositionField_iff {P : Ideal B} [MulSemiringAction G B] {x : L} : x ∈ decompositionField (K := K) (L := L) G P ↔ @@ -219,7 +217,6 @@ abbrev inertiaField variable {G} /-- Elementwise membership in the inertia field. -/ -@[simp] theorem mem_inertiaField_iff {P : Ideal B} [MulSemiringAction G B] {x : L} : x ∈ inertiaField (K := K) (L := L) G P ↔ @@ -235,7 +232,8 @@ theorem decompositionField_le_inertiaField decompositionField (K := K) (L := L) G P ≤ inertiaField (K := K) (L := L) G P := by - simpa [decompositionField, inertiaField, fixedFieldOfSubgroup, inertiaGroup, decompositionGroup] using + 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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean index 411eabcfd9..6979eeb0c5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean @@ -124,7 +124,8 @@ 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 ∧ + 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 = @@ -384,7 +385,8 @@ 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 ∧ + 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 @@ -424,7 +426,8 @@ theorem dedekindRamification_inertiaFieldPrime_middle_invariants 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 ∧ + 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 @@ -524,7 +527,8 @@ theorem dedekindRamification_inertiaFieldPrime_tower_invariants 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 ∧ + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean index 4207ee755a..64d316845b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean @@ -38,7 +38,7 @@ theorem ringOfIntegers_moduleFinite : /-- 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] [NumberField F] + {E F : Type*} [Field E] [Field F] [NumberField E] [Algebra E F] (P : Ideal (𝓞 F)) [P.IsMaximal] : P.under (𝓞 E) ≠ ⊥ := by exact @@ -65,6 +65,7 @@ instance basePrime_liesOver 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 @@ -132,7 +133,7 @@ instance inertiaFieldPrime_liesOver /-- 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 inertiaField_algebra_decompositionField +instance inertiaFieldAlgebraDecompositionField (P : Ideal (𝓞 L)) : Algebra (decompositionField (K := K) (L := L) G P) (inertiaField (K := K) (L := L) G P) := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean index 776d6ba804..704b02987f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean @@ -39,8 +39,8 @@ theorem ramificationIdx_tower /-- The prime-decomposition tower identity: inertia degrees multiply in a tower. -/ theorem dedekindTower_inertiaDeg_tower - (p : Ideal A) [p.IsMaximal] - (P : Ideal B) [P.IsMaximal] [P.LiesOver p] + (p : Ideal A) + (P : Ideal B) (Q : Ideal C) [Q.LiesOver P] : Q.inertiaDeg A = P.inertiaDeg A * Q.inertiaDeg B := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean index 5e20abf706..7fadb99d12 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean @@ -45,8 +45,10 @@ private theorem lowerRamificationFiltration_ext /-- 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') + (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 : ℝ) : @@ -146,8 +148,10 @@ theorem lowerRamificationGroup_eq_of_valuationSubring_eq /-- 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') + (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 @@ -163,9 +167,11 @@ theorem lowerRamificationFiltration_eq_of_valuationSubring_eq /-- Herbrand functions are unchanged when the two target valuations have the same valuation ring. -/ theorem herbrandFunction_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') + + (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 @@ -183,9 +189,11 @@ theorem herbrandFunction_eq_of_valuationSubring_eq /-- Inverse Herbrand functions are unchanged when the two target valuations have the same valuation ring. -/ theorem inverseHerbrandFunction_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') + + (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 @@ -204,8 +212,10 @@ theorem inverseHerbrandFunction_eq_of_valuationSubring_eq 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') + (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 : ℝ) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean index 005400d964..083e100188 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean @@ -61,7 +61,8 @@ theorem valuation_decomposition_apply_eq_of_isOfFinOrder 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) + (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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean index 7d9062757d..5095424069 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -281,7 +281,7 @@ private theorem depthLowerFiltration_zero_eq_fixedFieldInertiaSubgroupDVF (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} base target) - (H : Subgroup Gal(L/K)) [H.Normal] : + (H : Subgroup Gal(L/K)) : ((ramificationNumberDepthOfUniqueExtension (base := base) (target := target) huniq).depthLowerFiltration H).lower 0 = fixedFieldInertiaSubgroupDVF diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean index 7f59fe4f25..50e5cbb6ab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -213,7 +213,7 @@ theorem fixedFieldValuationSubringDVF_moduleFinite (huniq : HasUniqueValuationExtension.{u, v, w, x, x} base target) - (H : Subgroup Gal(L/K)) [H.Normal] : + (H : Subgroup Gal(L/K)) : Module.Finite base.valuationSubring (fixedFieldValuationSubringDVF (K := K) (target := target) H) := by let : IsNoetherianRing base.valuationSubring := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean index ba3608c829..59b02b1608 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean @@ -35,7 +35,8 @@ variable [base.valuation.HasExtension target.valuation] `AntitoneNormalSubgroupFiltration`. This is the general-DVF replacement for the complete-only `toLowerRamificationFiltration`. -/ def lowerRamificationFiltrationOfUniqueExtension - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) : RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration Gal(L/K) where lower n := lowerRamificationGroup @@ -50,7 +51,8 @@ def lowerRamificationFiltrationOfUniqueExtension /-- States the theorem `lowerRamificationFiltrationOfUniqueExtension_lower`. -/ @[simp] theorem lowerRamificationFiltrationOfUniqueExtension_lower - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (n : ℕ) : (lowerRamificationFiltrationOfUniqueExtension @@ -61,13 +63,16 @@ def lowerRamificationFiltrationOfUniqueExtension 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 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} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (s : ℝ) : ℝ := RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (lowerRamificationFiltrationOfUniqueExtension @@ -75,7 +80,8 @@ noncomputable def herbrandFunctionOfUniqueExtension /-- The inverse Herbrand function in the general-DVF setting. -/ noncomputable def inverseHerbrandFunctionOfUniqueExtension - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (t : ℝ) : ℝ := RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (lowerRamificationFiltrationOfUniqueExtension @@ -84,7 +90,8 @@ noncomputable def inverseHerbrandFunctionOfUniqueExtension omit [FiniteDimensional K L] in /-- States the theorem `herbrandFunctionOfUniqueExtension_apply`. -/ @[simp] theorem herbrandFunctionOfUniqueExtension_apply - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (s : ℝ) : herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq s = @@ -96,7 +103,8 @@ omit [FiniteDimensional K L] in omit [FiniteDimensional K L] in /-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_apply`. -/ @[simp] theorem inverseHerbrandFunctionOfUniqueExtension_apply - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (t : ℝ) : inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq t = @@ -106,8 +114,9 @@ omit [FiniteDimensional K L] in rfl /-- States the theorem `herbrandFunctionOfUniqueExtension_psi`. -/ -@[simp] theorem herbrandFunctionOfUniqueExtension_psi - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} +theorem herbrandFunctionOfUniqueExtension_psi + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (t : ℝ) : herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq @@ -118,8 +127,9 @@ omit [FiniteDimensional K L] in (base := base) (target := target) huniq) t /-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_eta`. -/ -@[simp] theorem inverseHerbrandFunctionOfUniqueExtension_eta - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} +theorem inverseHerbrandFunctionOfUniqueExtension_eta + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (s : ℝ) : inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq @@ -131,7 +141,8 @@ omit [FiniteDimensional K L] in /-- States the theorem `herbrandFunctionOfUniqueExtension_strictMono`. -/ theorem herbrandFunctionOfUniqueExtension_strictMono - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) : StrictMono (herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq) := @@ -141,7 +152,8 @@ theorem herbrandFunctionOfUniqueExtension_strictMono /-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_strictMono`. -/ theorem inverseHerbrandFunctionOfUniqueExtension_strictMono - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) : StrictMono (inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq) := @@ -152,7 +164,8 @@ theorem inverseHerbrandFunctionOfUniqueExtension_strictMono /-- 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} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (t : ℝ) : Subgroup Gal(L/K) := lowerRamificationGroup (base := base) (target := target) huniq @@ -160,8 +173,9 @@ def upperRamificationGroupOfUniqueExtension (base := base) (target := target) huniq t) /-- States the theorem `upperRamificationGroupOfUniqueExtension_herbrandFunction`. -/ -@[simp] theorem upperRamificationGroupOfUniqueExtension_herbrandFunction - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} +theorem upperRamificationGroupOfUniqueExtension_herbrandFunction + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) (s : ℝ) : upperRamificationGroupOfUniqueExtension (base := base) (target := target) huniq @@ -176,7 +190,8 @@ def upperRamificationGroupOfUniqueExtension /-- States the theorem `inverseHerbrandFunctionOfUniqueExtension_ge_neg_one_iff`. -/ theorem inverseHerbrandFunctionOfUniqueExtension_ge_neg_one_iff - (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} + (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, + x, x} base target) {t : ℝ} : -1 ≤ inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq t ↔ -1 ≤ t := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean index 8130be9ed4..ec86b960f8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean @@ -15,7 +15,8 @@ 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 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. -/ @@ -257,17 +258,19 @@ def fixedFieldUpperRamificationGroup (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] [Fintype G] + {G : Type*} [Group G] (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) (hmem : ∀ n sigma, sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) @@ -340,7 +343,7 @@ private theorem truncate_depth_eq_intrinsic_summand_of_mem exact_mod_cast (by omega : k = 1 + (k - 1)) private theorem truncate_depth_eq_zero_of_not_mem_lower_zero - {G : Type*} [Group G] [Fintype G] + {G : Type*} [Group G] (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) (hmem : ∀ n sigma, sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) @@ -386,7 +389,7 @@ private theorem sum_truncate_depth_eq_sum_lower_zero_of_mem (p := fun sigma : G => sigma ∈ F.lower 0)).symm private theorem sum_lower_zero_truncate_depth_eq_intrinsic_of_mem - {G : Type*} [Group G] [Fintype G] + {G : Type*} [Group G] [Finite G] (F : AntitoneNormalSubgroupFiltration G) (depth : G → ℕ∞) (hmem : ∀ n sigma, sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) @@ -397,6 +400,8 @@ private theorem sum_lower_zero_truncate_depth_eq_intrinsic_of_mem (∑ 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 : @@ -418,7 +423,8 @@ private theorem herbrandFunction_eq_depth_sum_of_mem (hmem : ∀ n sigma, sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) {s : ℝ} (hs : -1 ≤ s) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F) s = (1 / Nat.card (F.lower 0) : ℝ) * (∑ sigma : G, truncateENatAtDVF (depth sigma) (s + 1)) - 1 := by classical @@ -477,14 +483,15 @@ private theorem fixedField_herbrandFunction_formula_dvf +/-- 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] [Fintype G] - (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + {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) = @@ -553,13 +560,15 @@ private theorem truncate_depth_eq_intrinsic_summand exact_mod_cast (by omega : k = 1 + (k - 1)) private theorem sum_truncate_depth_eq_sum_lower_zero - {G : Type*} [Group G] [Fintype G] - (D : NonarchimedeanDepth G) (H : Subgroup G) [H.Normal] + {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 @@ -586,7 +595,7 @@ private theorem sum_truncate_depth_eq_sum_lower_zero (p := fun tau : H => tau ∈ F.lower 0)).symm private theorem sum_lower_zero_truncate_depth_eq_intrinsic - {G : Type*} [Group G] [Fintype G] + {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, @@ -596,6 +605,8 @@ private theorem sum_lower_zero_truncate_depth_eq_intrinsic ((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)) = @@ -618,15 +629,19 @@ private theorem sum_lower_zero_truncate_depth_eq_intrinsic /-- 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] [Fintype G] + {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 (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s + 1 = + change + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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 @@ -787,7 +802,7 @@ private theorem subgroupFiltration_lower_eq_depthLowerFiltration_dvf (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} base target) - (H : Subgroup Gal(L/K)) [H.Normal] (n : ℕ) : + (H : Subgroup Gal(L/K)) (n : ℕ) : ((lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq).subgroupFiltration H).lower n = ((ramificationNumberDepthOfUniqueExtension @@ -816,7 +831,8 @@ private theorem fixedFieldSubextension_herbrandFunction_eq_depth_dvf rw [fixedFieldSubextension_herbrandFunction] apply ((lowerRamificationFiltrationOfUniqueExtension - (base := base) (target := target) huniq).subgroupFiltration H).herbrandFunction_eq_of_card_lower_eq + (base := base) (target := target) huniq).subgroupFiltration + H).herbrandFunction_eq_of_card_lower_eq ((ramificationNumberDepthOfUniqueExtension (base := base) (target := target) huniq).depthLowerFiltration H) intro n @@ -1266,7 +1282,8 @@ theorem herbrandFunction_trans let Q := fixedFieldLowerRamificationFiltration (base := base) (target := target) huniq H let S := fixedFieldSubextensionFiltration F H - change (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) + change + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos F) hs0, S.herbrandFunction_of_nonpos hs0, Q.herbrandFunction_of_nonpos hs0] @@ -1297,8 +1314,10 @@ theorem inverseHerbrandFunction_trans simpa [F, Q, S, fixedFieldHerbrandFunction] using herbrandFunction_trans (base := base) (target := target) huniq H s - change (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) - apply (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).injective + change + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) + apply + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).injective rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction F)] rw [heta] rw [S.herbrandFunction_inverseHerbrandFunction, diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean index c2ca76c6af..7eb9811d1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -119,12 +119,16 @@ 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 @@ -437,7 +441,8 @@ theorem algebraicLocalizationDensity_localization_principalUnit_map AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _ _ < 1 := hxAbs -/-- The difficult direction of ramification transport in the localization and decomposition comparison. +/-- 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. -/ @@ -450,7 +455,8 @@ theorem algebraicLocalizationDensity_localization_mem_ramification_of_commutes (sigma : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup K (extensionValuationSubring vK w hw)) (hcomm : ∀ x : L, - (((tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (((tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion (localizationValuationSubring vK w hw)) : localization vK w ≃ₐ[vK.Completion] localization vK w) (toLocalization vK w x)) = @@ -466,8 +472,10 @@ theorem algebraicLocalizationDensity_localization_mem_ramification_of_commutes 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 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⟩ := @@ -496,25 +504,32 @@ theorem algebraicLocalizationDensity_localization_mem_ramification_of_commutes algebraicLocalizationDensity_localizationAbsoluteValue_algEquiv vK w hvK tauE _ _ < 1 := huAbs have hquotU : - RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient vK.Completion AE tauD u ∈ + 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 ∈ + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K AL + sigmaD x ∈ AL.principalUnitGroup := - (RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff K AL sigma).mp hsigma x + (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) ∈ + (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 ∈ + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD xE ∈ AE.principalUnitGroup := by have heq : - RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient vK.Completion AE tauD xE = + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion AE tauD xE = Units.map j - (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K AL sigmaD x) := by + (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K + AL sigmaD x) := by ext simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, xE, tauD, sigmaD, j, hcomm] @@ -524,11 +539,15 @@ theorem algebraicLocalizationDensity_localization_mem_ramification_of_commutes 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 + 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] + simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, + div_eq_mul_inv] ac_rfl rw [hquotMul] exact AE.principalUnitGroup.mul_mem hquotU hquotX diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index 33e89d2c37..2497ac3fee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamificat /-! # Localization of inertia and ramification groups -This file packages the decomposition-group equivalence of the localization and decomposition comparison +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 @@ -35,17 +36,22 @@ 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 localizationRamificationGroups_localization : +/-- 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 @@ -57,7 +63,7 @@ abbrev absoluteValueExtensionValuationSubring : /-- The valuation subring of the algebraic localization defined by the extended absolute value. -/ abbrev algebraicLocalizationValuationSubring : - _root_.ValuationSubring (localizationRamificationGroups_localization vK w) := + _root_.ValuationSubring (localizationRamificationGroupsLocalization vK w) := absoluteValueValuationSubring (AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2) (algebraicLocalizationDensity_localization_nonarchimedean vK w hw) @@ -84,7 +90,7 @@ private theorem mem_extensionValuationSubring_smul /-- The chosen-valuation decomposition group is the valuation-subring decomposition group attached to the same absolute value. -/ -def localizationRamificationGroups_absoluteValueDecompositionGroupEquiv : +def localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv : absoluteValueDecompositionGroup K w.1 ≃* RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K (absoluteValueExtensionValuationSubring vK w hw) where @@ -136,8 +142,8 @@ def localizationRamificationGroups_absoluteValueDecompositionGroupEquiv : rfl private theorem local_mem_localizationValuationSubring_smul - (tau : localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) : + (tau : localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) : tau • algebraicLocalizationValuationSubring vK w hw = algebraicLocalizationValuationSubring vK w hw := by ext z @@ -153,9 +159,9 @@ private theorem local_mem_localizationValuationSubring_smul /-- Every automorphism of the localization over `K_v` belongs to its valuation-subring decomposition group. -/ -def localizationRamificationGroups_localDecompositionGroupEquiv : - (localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) ≃* +def localizationRamificationGroupsLocalDecompositionGroupEquiv : + (localizationRamificationGroupsLocalization vK w ≃ₐ[vK.Completion] + localizationRamificationGroupsLocalization vK w) ≃* RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw) where toFun tau := @@ -171,33 +177,33 @@ def localizationRamificationGroups_localDecompositionGroupEquiv : rfl /-- The localization and decomposition comparison for valuation-subring decomposition groups. -/ -def localizationRamificationGroups_valuationDecompositionGroupEquiv : +def localizationRamificationGroupsValuationDecompositionGroupEquiv : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K (absoluteValueExtensionValuationSubring vK w hw) ≃* RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw) := - (localizationRamificationGroups_absoluteValueDecompositionGroupEquiv + (localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv vK (hvK := hvK) w hw).symm.trans ((decompositionGroupEquivAlgebraicLocalizationAut vK hvK w).trans - (localizationRamificationGroups_localDecompositionGroupEquiv + (localizationRamificationGroupsLocalDecompositionGroupEquiv vK (hvK := hvK) w hw)) @[simp] theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K (absoluteValueExtensionValuationSubring vK w hw)) (x : L) : - (((localizationRamificationGroups_valuationDecompositionGroupEquiv + (((localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw)) : - localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) + 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 - ((localizationRamificationGroups_absoluteValueDecompositionGroupEquiv + ((localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv vK (hvK := hvK) w hw).symm sigma) x /-- The decomposition-group equivalence carries inertia precisely to @@ -206,7 +212,7 @@ 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)) : - localizationRamificationGroups_valuationDecompositionGroupEquiv + localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma ∈ RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw) ↔ @@ -227,18 +233,19 @@ theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_iner have hlocalNonunit := (ValuationSubring.mem_inertiaGroup_iff_sub_mem_nonunits (algebraicLocalizationValuationSubring vK w hw) - (localizationRamificationGroups_valuationDecompositionGroupEquiv + (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma)).mp hsigma xLocal have hlocal : AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 - (((localizationRamificationGroups_valuationDecompositionGroupEquiv + (((localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma : - RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion (algebraicLocalizationValuationSubring vK w hw)) : - localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) - (xLocal : localizationRamificationGroups_localization vK w) - - (xLocal : localizationRamificationGroups_localization vK w)) < 1 := + 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 @@ -249,21 +256,22 @@ theorem localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_iner (((sigma : L ≃ₐ[K] L) (x : L)) - (x : L))) := (AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 _).symm _ = AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 - (((localizationRamificationGroups_valuationDecompositionGroupEquiv + (((localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma : - RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion (algebraicLocalizationValuationSubring vK w hw)) : - localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) - (xLocal : localizationRamificationGroups_localization vK w) - - (xLocal : localizationRamificationGroups_localization vK w)) := by + 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 - (localizationRamificationGroups_valuationDecompositionGroupEquiv + (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw sigma) sigma · intro x exact localizationRamificationGroups_valuationDecompositionGroupEquiv_toLocalization @@ -277,14 +285,15 @@ def inertiaGroupEquivAlgebraicLocalization : RamificationTheory.HilbertRamification.ValuationSubring.inertiaGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw) where toFun sigma := - ⟨localizationRamificationGroups_valuationDecompositionGroupEquiv + ⟨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 := (localizationRamificationGroups_valuationDecompositionGroupEquiv + let sigma := (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw).symm - (tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion + (tau : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion (algebraicLocalizationValuationSubring vK w hw)) refine ⟨sigma, ?_⟩ apply (localizationRamificationGroups_valuationDecompositionGroupEquiv_mem_inertia_iff @@ -292,15 +301,15 @@ def inertiaGroupEquivAlgebraicLocalization : simp [sigma, tau.property] left_inv sigma := by apply Subtype.ext - exact (localizationRamificationGroups_valuationDecompositionGroupEquiv + exact (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw).symm_apply_apply sigma right_inv tau := by apply Subtype.ext - exact (localizationRamificationGroups_valuationDecompositionGroupEquiv + exact (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw).apply_symm_apply tau map_mul' sigma tau := by apply Subtype.ext - exact map_mul (localizationRamificationGroups_valuationDecompositionGroupEquiv + exact map_mul (localizationRamificationGroupsValuationDecompositionGroupEquiv vK (hvK := hvK) w hw) (sigma : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup K (absoluteValueExtensionValuationSubring vK w hw)) @@ -316,8 +325,8 @@ def inertiaGroupEquivAlgebraicLocalization : (algebraicLocalizationValuationSubring vK w hw)) : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw)) : - localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w) + 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 @@ -342,12 +351,13 @@ theorem localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff rw [RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff] intro x rw [algebraicLocalizationDensity_mem_principalUnitGroup_iff_abs_lt_one] - let j : L →+* localizationRamificationGroups_localization vK w := + let j : L →+* localizationRamificationGroupsLocalization vK w := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 - let xLocal : (localizationRamificationGroups_localization vK w)ˣ := Units.map j x + 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 + let sigmaLocal : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup + vK.Completion (algebraicLocalizationValuationSubring vK w hw) := inertiaGroupEquivAlgebraicLocalization vK hvK w hw sigma have hquotient : @@ -355,25 +365,29 @@ theorem localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff (RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient K (absoluteValueExtensionValuationSubring vK w hw) sigmaGlobal x) = - RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient vK.Completion + RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion (algebraicLocalizationValuationSubring vK w hw) sigmaLocal xLocal := by ext - simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, sigmaGlobal, + simp [RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient, + sigmaGlobal, sigmaLocal, xLocal, j, localizationRamificationGroups_inertiaGroupEquiv_toLocalization] have hlocalPrincipal := - (RamificationTheory.HilbertRamification.ValuationSubring.mem_ramificationGroup_iff vK.Completion + (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 + (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion (algebraicLocalizationValuationSubring vK w hw) sigmaLocal xLocal : - (localizationRamificationGroups_localization vK w)ˣ) : - localizationRamificationGroups_localization vK w) - 1) < 1 := + (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 @@ -388,11 +402,12 @@ theorem localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff 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 + (((RamificationTheory.HilbertRamification.ValuationSubring.automorphismUnitQuotient + vK.Completion (algebraicLocalizationValuationSubring vK w hw) sigmaLocal xLocal : - (localizationRamificationGroups_localization vK w)ˣ) : - localizationRamificationGroups_localization vK w) - 1) := by + (localizationRamificationGroupsLocalization vK w)ˣ) : + localizationRamificationGroupsLocalization vK w) - 1) := by congr 1 rw [← hquotient] simp [j] @@ -407,7 +422,7 @@ theorem localizationRamificationGroups_inertiaGroupEquiv_mem_ramification_iff · exact hsigma /-- The localization and decomposition comparison for ramification groups. -/ -def localizationRamificationGroups_ramificationGroupEquiv : +def localizationRamificationGroupsRamificationGroupEquiv : RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K (absoluteValueExtensionValuationSubring vK w hw) ≃* RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup vK.Completion @@ -444,9 +459,9 @@ def localizationRamificationGroups_ramificationGroupEquiv : (sigma : RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup K (absoluteValueExtensionValuationSubring vK w hw)) (x : L) : - ((show localizationRamificationGroups_localization vK w ≃ₐ[vK.Completion] - localizationRamificationGroups_localization vK w from - (((localizationRamificationGroups_ramificationGroupEquiv vK hvK w hw sigma : + ((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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean index a9a66754b3..749dd484a7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean @@ -488,7 +488,9 @@ theorem exists_primitive_residue_lift_polynomial_uniformizer_dvf 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 +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean index 4dbee5d92b..1913b65475 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean @@ -70,7 +70,7 @@ abbrev ramificationGroupInDecomposition 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. -/ -@[simp] theorem mem_ramificationGroupInDecomposition_iff +theorem mem_ramificationGroupInDecomposition_iff (A : _root_.ValuationSubring L) (sigma : decompositionGroup K A) : sigma ∈ ramificationGroupInDecomposition K A ↔ ∀ x : Lˣ, diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean index 218869f32a..063ef71b9a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean @@ -124,7 +124,7 @@ abbrev ramificationGroupInInertiaAut (ramificationGroup K A) /-- States the theorem `mem_ramificationGroupInInertiaAut_iff`. -/ -@[simp] theorem mem_ramificationGroupInInertiaAut_iff +theorem mem_ramificationGroupInInertiaAut_iff (A : _root_.ValuationSubring L) (σ : inertiaGroupInAut K A) : σ ∈ ramificationGroupInInertiaAut K A ↔ ∃ τ : ramificationGroup K A, @@ -158,7 +158,7 @@ def inertiaGroupQuotientRamificationEquivInertiaAutQuotient rfl /-- States the theorem `inertiaGroupQuotientRamificationEquivInertiaAutQuotient_mk`. -/ -@[simp] theorem inertiaGroupQuotientRamificationEquivInertiaAutQuotient_mk +theorem inertiaGroupQuotientRamificationEquivInertiaAutQuotient_mk (A : _root_.ValuationSubring L) (σ : inertiaGroup K A) : inertiaGroupQuotientRamificationEquivInertiaAutQuotient (K := K) A (QuotientGroup.mk' (ramificationGroup K A) σ) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean index 75e303d277..d728f33960 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -32,12 +32,15 @@ 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 _ @@ -101,7 +104,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa 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 : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = m := by + have hdepth : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = m := by rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth] rw [Finset.filter_eq_self.2] · simp @@ -136,7 +140,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa (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 : (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = k - 1 := by + have hdepth : + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = k - 1 := by rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth] have hfilter : (Finset.range m).filter @@ -166,7 +171,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa simp [hmem] exact_mod_cast (by omega : k = 1 + (k - 1)) -/-- States the theorem `truncate_intrinsicRamificationNumberOfUniqueExtension_eq_zero_of_not_mem_inertia`. -/ +/-- 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} @@ -191,7 +197,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_zero_of_not_mem simp [truncateENatAtDVF, min_eq_left (show (0 : ℝ) ≤ s + 1 by linarith)] -/-- States the theorem `sum_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_sum_inertia`. -/ +/-- 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} @@ -228,7 +235,8 @@ theorem sum_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_sum_inertia (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`. -/ +/-- 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} @@ -253,7 +261,8 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int (intrinsicRamificationNumberOfUniqueExtension (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1)) = (Nat.card (F.lower 0) : ℝ) + - (∑ sigma : F.lower 0, ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma : ℝ)) + + (∑ sigma : F.lower 0, + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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] @@ -261,9 +270,11 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int (∑ 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 ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_succ_eq_sum_indicator F) m).symm + exact_mod_cast + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_succ_eq_sum_indicator F) m).symm change Finset.sum Finset.univ (fun sigma : F.lower 0 => - (1 : ℝ) + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma : ℝ) + + (1 : ℝ) + + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.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] @@ -272,7 +283,8 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int 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 +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 : @@ -289,7 +301,9 @@ theorem herbrandFunctionOfUniqueExtension_eq_intrinsicRamificationNumber_sum classical let F := lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq - change (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = + change + (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + F) s = (1 / Nat.card (F.lower 0) : ℝ) * (∑ sigma : Gal(L/K), truncateENatAtDVF (intrinsicRamificationNumberOfUniqueExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean index 77192429f6..58e3b819ad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean @@ -9,7 +9,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamificat /-! # quotient-depth identity over a general DVF -The public endpoint has no generator argument. The monogenic integral-generator theorem supplies the top +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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean index 718866b559..851be148e1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean @@ -445,7 +445,7 @@ def decompositionQuotientEquivResidueGalois (decompositionGroupResidueAction_surjective (K := K) A)) /-- States the theorem `decompositionQuotientEquivResidueGalois_mk`. -/ -@[simp] theorem decompositionQuotientEquivResidueGalois_mk +theorem decompositionQuotientEquivResidueGalois_mk (A : _root_.ValuationSubring L) (sigma : decompositionGroup K A) : decompositionQuotientEquivResidueGalois (K := K) A (QuotientGroup.mk' (inertiaGroup K A) sigma) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean index e944596684..42c1b10715 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -697,7 +697,7 @@ noncomputable def uniformizerGradedHom omit [FiniteDimensional K L] [IsGalois K L] in /-- States the theorem `uniformizerGradedHom_mk`. -/ -@[simp] theorem uniformizerGradedHom_mk +theorem uniformizerGradedHom_mk (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} base target) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean index 2a93c09d54..41b3dbaaf2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean @@ -157,7 +157,7 @@ abbrev decompositionField (A : _root_.ValuationSubring L) : IntermediateField.fixedField (decompositionGroup K A) /-- States the theorem `mem_decompositionField_iff`. -/ -@[simp] theorem mem_decompositionField_iff +theorem mem_decompositionField_iff (A : _root_.ValuationSubring L) (x : L) : x ∈ decompositionField K A ↔ ∀ σ ∈ decompositionGroup K A, σ x = x := by @@ -189,7 +189,7 @@ abbrev inertiaField (A : _root_.ValuationSubring L) : IntermediateField.fixedField (inertiaGroupInAut K A) /-- States the theorem `mem_inertiaField_iff`. -/ -@[simp] 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 @@ -222,7 +222,7 @@ abbrev ramificationField (A : _root_.ValuationSubring L) : IntermediateField.fixedField (ramificationGroupInAut K A) /-- States the theorem `mem_ramificationField_iff`. -/ -@[simp] theorem mem_ramificationField_iff +theorem mem_ramificationField_iff (A : _root_.ValuationSubring L) (x : L) : x ∈ ramificationField K A ↔ ∀ σ : ramificationGroup K A, @@ -290,7 +290,7 @@ theorem ramificationField_fixingSubgroup_eq_of_finiteDimensional /-- The ramification-field definition source: the ramification group is the Galois group over its fixed field. -/ -def ramificationGroupEquivGalRamificationField_of_finiteDimensional +def ramificationGroupEquivGalRamificationFieldOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : ramificationGroup K A ≃* (L ≃ₐ[ramificationField K A] L) := (ramificationGroupEquivInAut (K := K) A).trans @@ -338,7 +338,7 @@ abbrev inertiaFieldOverDecompositionField (decompositionField_le_inertiaField (K := K) A) /-- States the theorem `mem_inertiaFieldOverDecompositionField_iff`. -/ -@[simp] 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 @@ -361,7 +361,7 @@ theorem decompositionField_fixingSubgroup_eq_of_finiteDimensional /-- The fixed-field description of decomposition source: the decomposition group is the Galois group over its fixed field. -/ -def decompositionGroupEquivGalDecompositionField_of_finiteDimensional +def decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : decompositionGroup K A ≃* (L ≃ₐ[decompositionField K A] L) := IntermediateField.subgroupEquivAlgEquiv (decompositionGroup K A) @@ -380,7 +380,7 @@ States the theorem `decompositionGroupEquivGalDecompositionField_of_finiteDimens @[simp] theorem decompositionGroupEquivGalDecompositionField_of_finiteDimensional_apply [FiniteDimensional K L] (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) (x : L) : - decompositionGroupEquivGalDecompositionField_of_finiteDimensional (K := K) A σ x = + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A σ x = ((σ : L ≃ₐ[K] L) x) := rfl @@ -391,17 +391,17 @@ abbrev inertiaGroupOverDecompositionField [FiniteDimensional K L] (A : _root_.ValuationSubring L) : Subgroup (L ≃ₐ[decompositionField K A] L) := Subgroup.map - (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A).toMonoidHom (inertiaGroup K A) /-- States the theorem `mem_inertiaGroupOverDecompositionField_iff`. -/ -@[simp] 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, - decompositionGroupEquivGalDecompositionField_of_finiteDimensional + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A (τ : decompositionGroup K A) = σ := by constructor · rintro ⟨τ, hτ, rfl⟩ @@ -414,7 +414,7 @@ instance inertiaGroupOverDecompositionField_normal [FiniteDimensional K L] (A : _root_.ValuationSubring L) : (inertiaGroupOverDecompositionField (K := K) A).Normal := by let e := - decompositionGroupEquivGalDecompositionField_of_finiteDimensional + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A simpa [inertiaGroupOverDecompositionField, e] using (Subgroup.Normal.map (inertiaGroup_normal (K := K) A) @@ -433,12 +433,12 @@ theorem inertiaFieldOverDecompositionField_fixedField_eq_of_finiteDimensional constructor · intro hx τ have hτ : - decompositionGroupEquivGalDecompositionField_of_finiteDimensional + decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A (τ : decompositionGroup K A) ∈ inertiaGroupOverDecompositionField (K := K) A := by exact ⟨(τ : decompositionGroup K A), τ.property, rfl⟩ simpa using hx - (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (decompositionGroupEquivGalDecompositionFieldOfFiniteDimensional (K := K) A (τ : decompositionGroup K A)) hτ · intro hx σ hσ rcases @@ -463,7 +463,7 @@ theorem inertiaFieldOverDecompositionField_fixingSubgroup_eq_of_finiteDimensiona the transported inertia group is the Galois group `G(L/T_w)` in the tower `Z_w ⊆ T_w ⊆ L`. -/ def -inertiaGroupOverDecompositionFieldEquivGalInertiaFieldOverDecompositionField_of_finiteDimensional +inertiaGroupOverDecompositionFieldEquivGalInertiaFieldOverDecompositionFieldOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : inertiaGroupOverDecompositionField (K := K) A ≃* (L ≃ₐ[inertiaFieldOverDecompositionField K A] L) := @@ -476,7 +476,7 @@ inertiaGroupOverDecompositionFieldEquivGalInertiaFieldOverDecompositionField_of_ /-- The inertia-field definition: the Galois correspondence gives `G(L/Z_w)/I_w ≃ G(T_w/Z_w)`. -/ -def decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional +def decompositionQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : (L ≃ₐ[decompositionField K A] L) ⧸ inertiaGroupOverDecompositionField (K := K) A ≃* @@ -490,7 +490,7 @@ def decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteD /-- The inertia-field definition source: transport the quotient `G_w/I_w` along `G_w = G(L/Z_w)`. -/ -def decompositionGroupQuotientInertiaEquivGalDecompositionQuotient_of_finiteDimensional +def decompositionGroupQuotientInertiaEquivGalDecompositionQuotientOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : decompositionGroup K A ⧸ inertiaGroup K A ≃* (L ≃ₐ[decompositionField K A] L) ⧸ @@ -498,21 +498,21 @@ def decompositionGroupQuotientInertiaEquivGalDecompositionQuotient_of_finiteDime QuotientGroup.congr (inertiaGroup K A) (inertiaGroupOverDecompositionField (K := K) A) - (decompositionGroupEquivGalDecompositionField_of_finiteDimensional + (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 decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional +def decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : decompositionGroup K A ⧸ inertiaGroup K A ≃* (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] inertiaFieldOverDecompositionField K A) := - (decompositionGroupQuotientInertiaEquivGalDecompositionQuotient_of_finiteDimensional + (decompositionGroupQuotientInertiaEquivGalDecompositionQuotientOfFiniteDimensional (K := K) A).trans - (decompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + (decompositionQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional (K := K) A) /-- The inertia-field definition source: @@ -524,7 +524,7 @@ theorem inertiaField_fixingSubgroup_eq_of_finiteDimensional /-- The inertia-field definition source: the inertia group is the Galois group over its fixed field. -/ -def inertiaGroupInAutEquivGalInertiaField_of_finiteDimensional +def inertiaGroupInAutEquivGalInertiaFieldOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : inertiaGroupInAut K A ≃* (L ≃ₐ[inertiaField K A] L) := IntermediateField.subgroupEquivAlgEquiv (inertiaGroupInAut K A) @@ -726,7 +726,7 @@ def quotientInertiaEquivResidueActionRange (QuotientGroup.quotientKerEquivRange (residueAction K A)) /-- States the theorem `quotientInertiaEquivResidueActionRange_mk`. -/ -@[simp] theorem quotientInertiaEquivResidueActionRange_mk +theorem quotientInertiaEquivResidueActionRange_mk (A : _root_.ValuationSubring L) (σ : decompositionGroup K A) : quotientInertiaEquivResidueActionRange (K := K) A (QuotientGroup.mk' (inertiaGroup K A) σ) = @@ -737,12 +737,12 @@ def quotientInertiaEquivResidueActionRange 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 galInertiaFieldOverDecompositionEquivResidueActionRange_of_finiteDimensional +def galInertiaFieldOverDecompositionEquivResidueActionRangeOfFiniteDimensional [FiniteDimensional K L] (A : _root_.ValuationSubring L) : (inertiaFieldOverDecompositionField K A ≃ₐ[decompositionField K A] inertiaFieldOverDecompositionField K A) ≃* (residueAction K A).range := - (decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecomposition_of_finiteDimensional + (decompositionGroupQuotientInertiaEquivGalInertiaFieldOverDecompositionOfFiniteDimensional (K := K) A).symm.trans (quotientInertiaEquivResidueActionRange (K := K) A) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index f61184838d..a039adba54 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -159,20 +159,7 @@ theorem localUpperRamificationGroup_map_autCongr (r : pulled.valuationSubring →+* targetM.valuationSubring) (IsLocalRing.maximalIdeal pulled.valuationSubring) = IsLocalRing.maximalIdeal targetM.valuationSubring := by - apply le_antisymm - · rw [Ideal.map_le_iff_le_comap] - intro x hx - change r x ∈ IsLocalRing.maximalIdeal targetM.valuationSubring - rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ - intro h - have h' := h.map r.symm.toRingHom - exact hx (by simpa using h') - · intro y hy - obtain ⟨x, rfl⟩ := r.surjective y - apply Ideal.mem_map_of_mem - rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ - intro h - exact hy (h.map r.toRingHom) + exact IsLocalRing.map_ringEquiv_maximalIdeal r have hmapIdeal (s : ℝ) : Ideal.map (r : pulled.valuationSubring →+* targetM.valuationSubring) (realRamificationIdeal pulled.toDVF s) = @@ -182,22 +169,8 @@ theorem localUpperRamificationGroup_map_autCongr have hideal (s : ℝ) (x : pulled.valuationSubring) : x ∈ realRamificationIdeal pulled.toDVF s ↔ r x ∈ realRamificationIdeal targetM.toDVF s := by - constructor - · intro hx - have hrx : - r x ∈ Ideal.map - (r : pulled.valuationSubring →+* targetM.valuationSubring) - (realRamificationIdeal pulled.toDVF s) := - Ideal.mem_map_of_mem - (r : pulled.valuationSubring →+* targetM.valuationSubring) hx - simpa only [hmapIdeal s] using hrx - · intro hrx - have hrx' : - r x ∈ Ideal.map - (r : pulled.valuationSubring →+* targetM.valuationSubring) - (realRamificationIdeal pulled.toDVF s) := by - simpa only [hmapIdeal s] using hrx - exact Ideal.apply_mem_of_equiv_iff.mp hrx' + 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) @@ -429,20 +402,7 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr Ideal.map (r : B →+* targetM.valuationSubring) (IsLocalRing.maximalIdeal B) = IsLocalRing.maximalIdeal targetM.valuationSubring := by - apply le_antisymm - · rw [Ideal.map_le_iff_le_comap] - intro x hx - change r x ∈ IsLocalRing.maximalIdeal targetM.valuationSubring - rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hx ⊢ - intro h - have h' := h.map r.symm.toRingHom - exact hx (by simpa using h') - · intro y hy - obtain ⟨x, rfl⟩ := r.surjective y - apply Ideal.mem_map_of_mem - rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at hy ⊢ - intro h - exact hy (h.map r.toRingHom) + exact IsLocalRing.map_ringEquiv_maximalIdeal r have hmapIdeal (s : ℝ) : Ideal.map (r : B →+* targetM.valuationSubring) (fixedFieldRamificationIdealDVF @@ -454,21 +414,8 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr x ∈ fixedFieldRamificationIdealDVF (K := K) (target := targetL.toDVF) H s ↔ r x ∈ realRamificationIdeal targetM.toDVF s := by - constructor - · intro hx - have hrx : - r x ∈ Ideal.map (r : B →+* targetM.valuationSubring) - (fixedFieldRamificationIdealDVF - (K := K) (target := targetL.toDVF) H s) := - Ideal.mem_map_of_mem (r : B →+* targetM.valuationSubring) hx - simpa only [hmapIdeal s] using hrx - · intro hrx - have hrx' : - r x ∈ Ideal.map (r : B →+* targetM.valuationSubring) - (fixedFieldRamificationIdealDVF - (K := K) (target := targetL.toDVF) H s) := by - simpa only [hmapIdeal s] using hrx - exact Ideal.apply_mem_of_equiv_iff.mp hrx' + rw [← hmapIdeal s] + exact Ideal.apply_mem_of_equiv_iff.symm let φ : Gal(IntermediateField.fixedField H / K) ≃* Gal(M / K) := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean index ed75c9c350..72baf8221f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean @@ -54,7 +54,8 @@ theorem localLowerRamificationGroup_one_eq_hilbertRamificationGroup Algebra.IsAlgebraic.of_finite _ _ let : Algebra.IsSeparable base.residueField target.residueField := inferInstance - exact RamificationTheory.HilbertRamification.lowerRamificationGroup_one_eq_hilbertRamificationGroup + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean index b1204098dc..2f28e2821d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean @@ -137,7 +137,6 @@ theorem compAlgEquiv_apply rfl /-- Transporting an extending absolute value along an algebra equivalence preserves extension. -/ -@[simp] theorem compAlgEquiv_extends_apply {K L E : Type*} [Field K] [Field L] [Field E] [Algebra K L] [Algebra K E] (e : L ≃ₐ[K] E) @@ -257,7 +256,8 @@ private theorem algebraicExtension_complex_algEquiv_complex_unique_rpow_extensio rw [hx, hw] exact congrArg (fun t : ℝ => t ^ s) (compAlgEquiv_extends_apply e - algebraicExtension_standardComplexAbsoluteValue algebraicExtension_standardComplexAbsoluteValue + algebraicExtension_standardComplexAbsoluteValue + algebraicExtension_standardComplexAbsoluteValue (fun z => rfl) (e x)).symm /-- A chosen absolute-value extension together with its uniqueness property. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean index 71467aa196..c29c653bc6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean @@ -231,7 +231,8 @@ private theorem finiteComplexAlgEquivComplexUniqueRpowExtension finiteStandardComplexAbsoluteValue finiteStandardComplexAbsoluteValue (fun z => rfl) (e x)).symm -/-- the finite-degree norm construction, archimedean standard branch over `ℝ | ℝ`: the construction's +/-- 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 : ℝ) : @@ -241,7 +242,8 @@ private theorem finiteNormExtension_real_self_normFormulaValue_eq_standard rw [finiteExtensionNormFormulaValue, Module.finrank_self ℝ] simp -/-- the finite-degree norm construction, archimedean standard branch over `ℂ | ℂ`: the construction's +/-- 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 : ℂ) : @@ -251,7 +253,8 @@ private theorem finiteNormExtension_complex_self_normFormulaValue_eq_standard rw [finiteExtensionNormFormulaValue, Module.finrank_self ℂ] simp -/-- the finite-degree norm construction, archimedean standard branch over `ℂ | ℝ`: the construction's +/-- 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 : ℂ) : @@ -333,7 +336,8 @@ private theorem finiteNormExtension_real_complex_normFormulaValue_eq_rpow 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 +/-- 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 @@ -707,7 +711,7 @@ theorem finiteNormExtension_finite_normFormulaValue_strong_triangle /-- the finite-degree norm construction, finite nonarchimedean branch: the norm formula, bundled as an absolute value on the finite extension. -/ -noncomputable def finiteNormExtension_finite_normFormulaAbsoluteValue +noncomputable def finiteNormExtensionFiniteNormFormulaAbsoluteValue {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] (v : AbsoluteValue K ℝ) @@ -752,7 +756,7 @@ theorem finiteNormExtension_finite_normFormulaAbsoluteValue_apply (hcomplete : IsCompleteForAbsoluteValue v) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (hv : v.IsNontrivial) (x : L) : - finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) v hcomplete hnonarch hv x = finiteExtensionNormFormulaValue v x := rfl @@ -766,7 +770,7 @@ private theorem finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralA (hcomplete : IsCompleteForAbsoluteValue v) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (hv : v.IsNontrivial) : - finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) v hcomplete hnonarch hv = finiteSpectralExtension (K := K) (L := L) v hcomplete hnonarch hv := by @@ -783,7 +787,7 @@ theorem finiteNormExtension_finite_normFormulaAbsoluteValue_extends_base (hcomplete : IsCompleteForAbsoluteValue v) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (hv : v.IsNontrivial) (x : K) : - finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + 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] @@ -800,7 +804,7 @@ theorem finiteNormExtension_finite_normFormulaAbsoluteValue_complete (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) (hv : v.IsNontrivial) : IsCompleteForAbsoluteValue - (finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + (finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) v hcomplete hnonarch hv) := by rw [finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue v hcomplete hnonarch hv] @@ -819,7 +823,7 @@ theorem finiteNormExtension_unique_extension_finite_normFormulaAbsoluteValue (hv : v.IsNontrivial) (w : AbsoluteValue L ℝ) (hw_ext : ∀ x : K, w (algebraMap K L x) = v x) : - w = finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + w = finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) v hcomplete hnonarch hv := by rw [finiteNormExtension_finite_normFormulaAbsoluteValue_eq_spectralAbsoluteValue v hcomplete hnonarch hv] @@ -1168,7 +1172,7 @@ private noncomputable def finiteNormExtension_finiteExtensionResult_base_ringEqu /-- 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 finiteNormExtension_nonarchimedean_finite_extension +noncomputable def finiteNormExtensionNonarchimedeanFiniteExtension {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] (v : AbsoluteValue K ℝ) @@ -1177,7 +1181,7 @@ noncomputable def finiteNormExtension_nonarchimedean_finite_extension (hv : v.IsNontrivial) : FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v where extension := - finiteNormExtension_finite_normFormulaAbsoluteValue (K := K) (L := L) + finiteNormExtensionFiniteNormFormulaAbsoluteValue (K := K) (L := L) v hcomplete hnonarch hv extends_base := finiteNormExtension_finite_normFormulaAbsoluteValue_extends_base @@ -1195,7 +1199,7 @@ noncomputable def finiteNormExtension_nonarchimedean_finite_extension /-- Explicit archimedean finite-extension theorem: after the archimedean classification, the finite norm formula and completeness reduce to the standard `ℝ`/`ℂ` cases. -/ -noncomputable def finiteNormExtension_archimedean_finite_extension +noncomputable def finiteNormExtensionArchimedeanFiniteExtension {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] (v : AbsoluteValue K ℝ) @@ -1252,7 +1256,7 @@ noncomputable def finiteNormExtension_archimedean_finite_extension /-- 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 finiteNormExtension_finite_extension +noncomputable def finiteNormExtensionFiniteExtension {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] (v : AbsoluteValue K ℝ) @@ -1260,9 +1264,9 @@ noncomputable def finiteNormExtension_finite_extension (hv : v.IsNontrivial) : FiniteNormExtensionFiniteExtensionResult (K := K) (L := L) v := by by_cases hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v - · exact finiteNormExtension_nonarchimedean_finite_extension + · exact finiteNormExtensionNonarchimedeanFiniteExtension v hcomplete hnonarch hv - · exact finiteNormExtension_archimedean_finite_extension + · exact finiteNormExtensionArchimedeanFiniteExtension v hcomplete hnonarch end Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean index 977ee10e04..383854cd94 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean @@ -119,7 +119,7 @@ theorem normFormula_finiteExtensionNormFormulaValue_strong_triangle_of_henselFac /-- 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 normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization +noncomputable def normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization {K L : Type*} [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] (v : AbsoluteValue K ℝ) (hnonarch : LubinTate.Valuations.NonarchimedeanAbsoluteValue v) @@ -152,7 +152,7 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_apply (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty (absoluteValueValuationSubring v hnonarch)) (x : L) : - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv x = finiteExtensionNormFormulaValue v x := rfl @@ -166,7 +166,7 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_exten (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty (absoluteValueValuationSubring v hnonarch)) (x : K) : - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv (algebraMap K L x) = v x := normFormula_finiteExtensionNormFormulaValue_algebraMap v x @@ -178,10 +178,10 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonar (hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty (absoluteValueValuationSubring v hnonarch)) : LubinTate.Valuations.NonarchimedeanAbsoluteValue - (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv) := by refine LubinTate.Valuations.nonarchimedean_of_strong_triangle - (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv) ?_ intro x y exact @@ -190,7 +190,8 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonar /-- The closed unit ball of the bundled norm formula consists exactly of the elements integral over the base valuation ring. -/ -theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_mem_valuationSubring_iff_isIntegral +theorem + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_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) @@ -198,7 +199,7 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_mem_v (absoluteValueValuationSubring v hnonarch)) (x : L) : x ∈ absoluteValueValuationSubring - (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv) (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean (K := K) (L := L) v hnonarch hv) ↔ @@ -215,14 +216,15 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_mem_v /-- The valuation ring of the bundled finite norm formula is the actual integral closure of the base valuation ring in `L`. -/ -theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_valuationSubring_eq_integralClosure +theorem + normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_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 - (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv) (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean (K := K) (L := L) v hnonarch hv)).toSubring = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean index 49a511896f..5ed023d213 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean @@ -11,7 +11,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core 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 +factorization form of Hensel's lemma in the primitive factorization definition, so no + completeness or separatedness hypothesis is needed. -/ @@ -22,7 +23,8 @@ open scoped Polynomial namespace AlgebraicNumberTheory namespace Valuations -/-- The normalized residual factor input from the irreducible-polynomial coefficient bounds contradicts +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean index 40d6e53bcb..392fd6d2d4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -133,16 +133,16 @@ theorem normFormula_finite_normFormulaAbsoluteValue_eq_of_valuationSubring_eq_of (hsub : absoluteValueValuationSubring w hwnonarch = absoluteValueValuationSubring - (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + (normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv) (normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean (K := K) (L := L) v hnonarch hv)) : w = - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv := by ext x let rAbs := - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv let hrnonarch := normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean @@ -238,7 +238,7 @@ theorem normFormula_finite_extension_norm_formula (absoluteValueValuationSubring v hnonarch) := (henselianValuation_iff_henselFactorization v hnonarch).1 hhens let extended := - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv LubinTate.Valuations.NonarchimedeanAbsoluteValue extended ∧ (∀ a : K, extended (algebraMap K L a) = v a) ∧ @@ -252,7 +252,7 @@ theorem normFormula_finite_extension_norm_formula let hv : ValuationTheory.DiscreteValuationField.HenselFactorizationProperty V := (henselianValuation_iff_henselFactorization v hnonarch).1 hhens let extended := - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization + normFormulaFiniteNormFormulaAbsoluteValueOfHenselFactorization (K := K) (L := L) v hnonarch hv let hextendedNonarch := normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonarchimedean diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean index 3d0410297d..248abed7a9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean @@ -24,7 +24,8 @@ 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. -/ +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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean index 32acc08e4c..00ed238977 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -100,7 +100,8 @@ private theorem exponentialValuation_finset_sum_ne_zero_of_value_ne exponential valuations. -/ def exponentialValuationRingMap {K L : Type*} [Field K] [Field L] [Algebra K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 := @@ -112,7 +113,8 @@ def exponentialValuationRingMap @[simp] theorem exponentialValuationRingMap_apply {K L : Type*} [Field K] [Field L] [Algebra K L] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 : @@ -123,7 +125,8 @@ theorem exponentialValuationRingMap_apply /-- 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) + (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 @@ -143,7 +146,8 @@ 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) + (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 : @@ -227,7 +231,8 @@ 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) + (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 : @@ -459,7 +464,8 @@ private theorem maximalIdeal_eq_span_discretePrimeElement 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) + (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) @@ -529,7 +535,8 @@ private theorem exists_valueGroup_generators_scaled_by_ramificationIdx /-- 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) + (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⟩ @@ -540,7 +547,8 @@ theorem exponentialValueSubgroup_le_of_extends 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) := + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) := exponentialValueSubgroup w ⧸ (exponentialValueSubgroup v).comap (exponentialValueSubgroup w).subtype @@ -548,14 +556,16 @@ def ExponentialValueGroupQuotient /-- 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) : ℕ := + (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) + (v : LubinTate.Valuations.ExponentialValuation K) (w : + LubinTate.Valuations.ExponentialValuation L) {s t : ℝ} (ht : t ≠ 0) (e : ℕ) (hvgroup : exponentialValueSubgroup v = AddSubgroup.zmultiples s) @@ -625,7 +635,8 @@ private theorem exponentialRamificationIndex_eq_of_cyclic_valueSubgroups 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) + (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)] @@ -656,7 +667,8 @@ theorem exponentialRamificationIndex_eq_ideal_ramificationIdx /-- 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) + (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 @@ -673,7 +685,8 @@ def exponentialResidueDegree /-- 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) + (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 @@ -878,7 +891,8 @@ theorem associatedAbsoluteValue_valuationSubring_eq 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) + (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) @@ -900,7 +914,7 @@ theorem associatedAbsoluteValue_extends /-- 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] [Algebra K L] + {K L : Type*} [Field K] [Field L] (V : Subring K) (W : Subring L) [Algebra V L] (h : W = (integralClosure V L).toSubring) : @@ -928,7 +942,8 @@ 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) + (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) : @@ -955,7 +970,8 @@ theorem exponentialValuationSubring_eq_integralClosure_of_henselian have hW : Wv = Wa := associatedAbsoluteValue_valuationSubring_eq w (Real.exp 1) aw hawNonarch haw - have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization Va.valuation := by + have hhensA : ValuationTheory.DiscreteValuationField.HenselianValuationByFactorization + Va.valuation := by rw [← hV] exact hhens have habsExt : ∀ a : K, aw (algebraMap K L a) = av a := @@ -983,7 +999,8 @@ theorem exponentialValuationSubring_eq_integralClosure_of_henselian /-- 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) + (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 @@ -993,7 +1010,8 @@ def exponentialValueCoset 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) : + (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 @@ -1010,7 +1028,8 @@ private theorem exponentialValueCoset_units_surjective 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) + (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) @@ -1069,7 +1088,8 @@ def DistinctExponentialValueCosetRepresentatives 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) + (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 @@ -1089,8 +1109,9 @@ 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] - [Fintype I] [Fintype J] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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) @@ -1109,6 +1130,9 @@ theorem ramificationInvariants_valueCosets_mul_residueLifts_linearIndependent 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 ↦ @@ -1169,7 +1193,8 @@ 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) + (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) @@ -1236,7 +1261,8 @@ 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) + (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) @@ -1262,8 +1288,9 @@ theorem ramificationInvariants_valueCosets_mul_residueLifts_card_le_finrank 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] [Fintype I] [Fintype J] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 @@ -1282,6 +1309,8 @@ theorem ramificationInvariants_actual_valueGroup_card_mul_residueLifts_card_le_f 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 @@ -1303,8 +1332,9 @@ 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] [Fintype I] [Fintype J] - (v : LubinTate.Valuations.ExponentialValuation K) (w : LubinTate.Valuations.ExponentialValuation 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 @@ -1327,6 +1357,9 @@ theorem ramificationInvariants_fundamental_inequality_of_representatives ∀ 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 @@ -1357,7 +1390,8 @@ 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) + (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 @@ -1447,7 +1481,8 @@ 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) + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean index e370b23172..57fb626d3a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean @@ -7,7 +7,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds /-! -# the nonarchimedean valuation construction, the irreducible coefficient estimate: the coefficient norm of an irreducible polynomial +# 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean index 2df99ae1f6..d22327d249 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean @@ -104,7 +104,7 @@ def withAbsNontriviallyNormedField /-- 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] [FiniteDimensional K L] + {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 : ℝ)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean index 5eea81ee04..dd42945f04 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean @@ -98,7 +98,6 @@ theorem toCompletion_apply rfl /-- The canonical completion embedding agrees with the completion algebra map. -/ -@[simp] theorem toCompletion_eq_algebraMap {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (x : K) : toCompletion vK x = algebraMap K vK.Completion x := @@ -420,7 +419,6 @@ 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`. -/ -@[simp] theorem completionMapToCompleteTarget_comp_completionMap_coe (vK : AbsoluteValue K ℝ) (wL : AbsoluteValue L ℝ) (hw : Extends vK wL) (vD : AbsoluteValue D ℝ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean index e366786022..26cf84831d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean @@ -8,8 +8,10 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Henseli /-! # 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 +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|`. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean index 6ac2d7c458..57ddf87ec7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean @@ -62,7 +62,8 @@ theorem absoluteValueDist_triangle 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 +/-- 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 ℝ) : @@ -121,7 +122,8 @@ theorem absoluteValue_finset_sum_le 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 +/-- 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 := @@ -172,7 +174,8 @@ theorem equivalentAbsoluteValues_trans ((isEquiv_of_equivalentAbsoluteValues h₁₂).trans (isEquiv_of_equivalentAbsoluteValues h₂₃)) -/-- The power characterization of equivalent absolute values: two real absolute values are equivalent exactly when +/-- 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 ℝ) : @@ -181,7 +184,8 @@ theorem equivalentAbsoluteValues_iff_exists_rpow_eq (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 +/-- 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 ℝ) : @@ -207,7 +211,8 @@ theorem absoluteValueApproximation_exists_separating_element (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 +/-- 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 ι] @@ -354,10 +359,12 @@ theorem absoluteValueApproximation_from_weighted_bump_family /-- 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*} [Fintype ι] + {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] @@ -400,13 +407,15 @@ theorem absoluteValueApproximation_exists_coefficient_precision /-- The weak approximation theorem, Approximation Theorem for a finite family of pairwise inequivalent nontrivial absolute values. -/ theorem absoluteValueApproximation - {K : Type*} [Field K] {ι : Type*} [Fintype ι] + {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 @@ -455,7 +464,8 @@ 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. -/ +/-- 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) @@ -471,14 +481,16 @@ theorem archimedean_iff_not_nonarchimedean ArchimedeanAbsoluteValue v ↔ ¬ NonarchimedeanAbsoluteValue v := Iff.rfl -/-- The boundedness characterization of nonarchimedean absolute values, strong triangle inequality as mathlib's +/-- 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 +/-- 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 ℝ) @@ -487,7 +499,8 @@ theorem nat_le_one_of_strong_triangle 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 +/-- 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 ℝ) @@ -495,7 +508,8 @@ theorem nonarchimedean_of_strong_triangle 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 +/-- 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 : ℝ} @@ -503,7 +517,8 @@ theorem nat_bound_ge_one 1 ≤ C := by simpa using hC 1 -/-- The binomial-estimate step in the proof of the boundedness characterization of nonarchimedean absolute values: boundedness +/-- 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 @@ -564,7 +579,8 @@ theorem add_pow_le_of_bounded_nat _ = ((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 +/-- 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) : @@ -603,7 +619,8 @@ theorem tendsto_linear_bound_rpow_inv 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. -/ +/-- 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) @@ -652,7 +669,8 @@ theorem add_le_root_bound_of_bounded_nat max (v x) (v y) := by rfl -/-- The converse direction of the boundedness characterization of nonarchimedean absolute values: a bounded-on-integers +/-- 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 ℝ) @@ -684,7 +702,8 @@ theorem strong_triangle_of_nonarchimedean 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 +/-- 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 ℝ) : @@ -692,7 +711,8 @@ theorem nonarchimedean_iff_strong_triangle ⟨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. -/ +/-- 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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean index a8186ac07b..01e0985d74 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean @@ -40,11 +40,12 @@ theorem uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized 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: +/-- 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 residue_addEquiv_maximalIdeal_pow_quotient +noncomputable def residueAddEquivMaximalIdealPowQuotient {K : Type*} [Field K] {v : ExponentialValuation K} (hv : NormalizedExponentialValuation v) {π : K} (hπ : PrimeElementFor v π) (n : ℕ) : @@ -65,9 +66,10 @@ noncomputable def residue_addEquiv_maximalIdeal_pow_quotient (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𝒪` +/-- 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 residue_addEquiv_uniformizerPowerIdeal_quotient +noncomputable def residueAddEquivUniformizerPowerIdealQuotient {K : Type*} [Field K] {v : ExponentialValuation K} (hv : NormalizedExponentialValuation v) {π : K} (hπ : PrimeElementFor v π) (n : ℕ) : @@ -81,7 +83,7 @@ noncomputable def residue_addEquiv_uniformizerPowerIdeal_quotient pow_one, uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ n, uniformizerPowerIdeal_primeElement_eq_maximalIdeal_pow_of_normalized hv hπ (n + 1)] - exact residue_addEquiv_maximalIdeal_pow_quotient hv hπ n + exact residueAddEquivMaximalIdealPowQuotient hv hπ n /-- The graded piece `π^n𝒪 / π^{n+1}𝒪` as an additive quotient. -/ def uniformizerGradedPiece {O : Type*} [CommRing O] (π : O) (n : ℕ) : Type _ := @@ -768,13 +770,15 @@ noncomputable def higherUnitGradedPieceMulEquivResidue {O : Type*} (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. -/ +/-- 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. -/ +/-- 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) : @@ -783,9 +787,10 @@ theorem units_reduction_surjective 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 +/-- The unit-reduction and graded-piece equivalences, the named first-isomorphism-theorem +equivalence `Oˣ/U⁽ⁿ⁾ ≃ (O/π^nO)ˣ`. -/ -noncomputable def units_quotient_equiv +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 @@ -798,7 +803,7 @@ reduction modulo `πⁿO`. -/ theorem units_quotient_equiv_mk {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) (u : Oˣ) : - units_quotient_equiv hπ hn (QuotientGroup.mk u) = + unitsQuotientEquiv hπ hn (QuotientGroup.mk u) = unitReduction (uniformizerPowerIdeal π n) u := by change QuotientGroup.kerLift (unitReduction (uniformizerPowerIdeal π n)) ((QuotientGroup.quotientMulEquivOfEq @@ -827,7 +832,7 @@ theorem higher_unit_coeff_surjective /-- The unit-reduction and graded-piece equivalences, the named additive graded-piece equivalence `U⁽ⁿ⁾/U⁽ⁿ⁺¹⁾ ≃+ O/(π)`. -/ -noncomputable def higher_unit_graded_equiv +noncomputable def higherUnitGradedEquiv {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] {π : O} (hπ : Irreducible π) {n : ℕ} (hn : 1 ≤ n) : Additive diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean index 3aba89de2e..cad934f110 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean @@ -10,7 +10,8 @@ import Mathlib.RingTheory.DiscreteValuationRing.Basic import Mathlib.RingTheory.Henselian import Mathlib.RingTheory.Ideal.IsPrincipalPowQuotient import Mathlib.RingTheory.Valuation.ValuationSubring -/-! Provides the public declarations in the `ValuationTheory.AbsoluteValue.Theory.ExponentialValuations` Lean module. -/ +/-! Provides the public declarations in the + `ValuationTheory.AbsoluteValue.Theory.ExponentialValuations` Lean module. -/ noncomputable section @@ -88,7 +89,6 @@ theorem exponentialValuation_one {K : Type*} [Field K] simp [hr, hr0] /-- The value of `-1` is `0` for a exponential valuation. -/ -@[simp] theorem exponentialValuation_neg_one {K : Type*} [Field K] (v : ExponentialValuation K) : v (-1 : K) = 0 := by @@ -1236,7 +1236,8 @@ theorem ideal_exists_min_value_of_nat_indexed_values 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 +/-- 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 @@ -1306,7 +1307,8 @@ theorem uniformizerPowerIdeal_le_ideal_of_mem_value_eq 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 +/-- 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} @@ -1343,7 +1345,8 @@ theorem nonzero_ideal_eq_uniformizerPowerIdeal 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 +/-- 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} @@ -1360,7 +1363,8 @@ theorem normalizedExponentialValuationSubring_isPrincipalIdealRing refine ⟨(primeElementInValuationSubring v hπ) ^ n, ?_⟩ rw [hIn, uniformizerPowerIdeal] -/-- The ideal structure theorem for discrete valuation rings, DVR part: the valuation ring of a normalized +/-- 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} @@ -1430,7 +1434,8 @@ theorem discreteExponentialValuation_subring_exists_nat_value ∃ 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 +/-- 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) @@ -1464,7 +1469,8 @@ theorem discreteUniformizerPowerIdeal_le_ideal_of_mem_value_eq (π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 +/-- 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} @@ -1508,7 +1514,8 @@ theorem discreteExponentialValuationSubring_isPrincipalIdealRing · 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 +/-- 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} diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean index 6e5f7b440f..9c02bec9fc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean @@ -49,7 +49,8 @@ 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. -/ +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] := @@ -70,16 +71,16 @@ theorem AbsoluteValueExtension.isNontrivial simpa only [u.2 a] using hva /-- The concrete algebraic closure `\bar K_v` used in the valuation-extension theorem. -/ -abbrev absoluteValueExtension_algebraicCompletionClosure +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 absoluteValueExtension_algebraicClosureAbsoluteValue +noncomputable def absoluteValueExtensionAlgebraicClosureAbsoluteValue {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : - AbsoluteValue (absoluteValueExtension_algebraicCompletionClosure vK) ℝ := + AbsoluteValue (absoluteValueExtensionAlgebraicCompletionClosure vK) ℝ := (AbsoluteValue.uniqueAlgebraicExtension (AbsoluteValue.completionAbsoluteValue vK) (AbsoluteValue.completionAbsoluteValue_complete vK) @@ -89,9 +90,9 @@ noncomputable def absoluteValueExtension_algebraicClosureAbsoluteValue theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (x : vK.Completion) : - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) x) = + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) = AbsoluteValue.completionAbsoluteValue vK x := by exact (AbsoluteValue.uniqueAlgebraicExtension @@ -101,7 +102,7 @@ theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap /-- A `K_v`-embedding of the algebraic localization into `\bar K_v`. -/ -noncomputable def absoluteValueExtension_localizationEmbedding +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) : @@ -109,7 +110,7 @@ noncomputable def absoluteValueExtension_localizationEmbedding 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] - absoluteValueExtension_algebraicCompletionClosure vK := by + 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 @@ -122,10 +123,10 @@ noncomputable def absoluteValueExtension_localizationEmbedding (algebraMap vK.Completion (AbsoluteValue.algebraicLocalization vK w.1 w.2)).injective letI : Module.IsTorsionFree vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) := + (absoluteValueExtensionAlgebraicCompletionClosure vK) := Module.isTorsionFree_iff_algebraMap_injective.mpr (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK)).injective + (absoluteValueExtensionAlgebraicCompletionClosure vK)).injective exact IsAlgClosed.lift /-- The localization absolute value is the pullback of `\bar v` along the @@ -139,8 +140,8 @@ theorem absoluteValueExtension_localizationAbsoluteValue_eq_pullback letI : SMul K w.1.Completion := hK.toSMul letI := AbsoluteValue.completionAlgebra vK w.1 w.2 AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp - (absoluteValueExtension_localizationEmbedding vK w).injective := by + (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 @@ -155,37 +156,37 @@ theorem absoluteValueExtension_localizationAbsoluteValue_eq_pullback have hleft : AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 = R.extension := R.unique _ (AbsoluteValue.algebraicLocalizationAbsoluteValue_extends vK w.1 w.2) have hright : - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp - (absoluteValueExtension_localizationEmbedding vK w).injective = R.extension := by + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp + (absoluteValueExtensionLocalizationEmbedding vK w).injective = R.extension := by apply R.unique intro x - change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK - (absoluteValueExtension_localizationEmbedding vK w + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK + (absoluteValueExtensionLocalizationEmbedding vK w (algebraMap vK.Completion (AbsoluteValue.algebraicLocalization vK w.1 w.2) x)) = _ - rw [(absoluteValueExtension_localizationEmbedding vK w).commutes] + 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 absoluteValueExtension_pullback +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] absoluteValueExtension_algebraicCompletionClosure vK) : + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : AbsoluteValue L ℝ := - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp tau.injective + (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] absoluteValueExtension_algebraicCompletionClosure vK) : - AbsoluteValue.Extends vK (absoluteValueExtension_pullback vK hvK tau) := by + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : + AbsoluteValue.Extends vK (absoluteValueExtensionPullback vK hvK tau) := by intro x - change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (tau (algebraMap K L x)) = vK x rw [tau.commutes, IsScalarTower.algebraMap_apply K vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK), + (absoluteValueExtensionAlgebraicCompletionClosure vK), absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap] exact AbsoluteValue.completionAbsoluteValue_coe vK x @@ -201,17 +202,17 @@ noncomputable def AbsoluteValueExtension.extendToAlgebraicallyClosed [Field K] [Field L] [Field Ω] [Algebra K L] [Algebra L Ω] [Algebra K Ω] [IsScalarTower K L Ω] - [Algebra.IsAlgebraic L Ω] [IsAlgClosed Ω] + [Algebra.IsAlgebraic L Ω] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (u : AbsoluteValueExtension vK L) : AbsoluteValueExtension vK Ω := by let τ : Ω →ₐ[L] - absoluteValueExtension_algebraicCompletionClosure u.1 := + absoluteValueExtensionAlgebraicCompletionClosure u.1 := IsAlgClosed.lift let wΩ : AbsoluteValue Ω ℝ := - absoluteValueExtension_pullback + absoluteValueExtensionPullback u.1 (u.isNontrivial hvK) τ have hwΩ : AbsoluteValue.Extends u.1 wΩ := @@ -242,7 +243,7 @@ theorem AbsoluteValueExtension.extendToAlgebraicallyClosed_algebraMap (algebraMap L Ω x) = u.1 x := by change - absoluteValueExtension_pullback + absoluteValueExtensionPullback u.1 (u.isNontrivial hvK) IsAlgClosed.lift (algebraMap L Ω x) = u.1 x @@ -251,22 +252,22 @@ theorem AbsoluteValueExtension.extendToAlgebraicallyClosed_algebraMap u.1 (u.isNontrivial hvK) IsAlgClosed.lift x /-- The `K`-embedding attached to an exact extension `w | v`. -/ -noncomputable def absoluteValueExtension_embeddingOfExtension +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] absoluteValueExtension_algebraicCompletionClosure vK := by + 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 := absoluteValueExtension_localizationEmbedding vK w + 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 - (absoluteValueExtension_algebraicCompletionClosure vK) x + (absoluteValueExtensionAlgebraicCompletionClosure vK) x rw [AbsoluteValue.toAlgebraicLocalization_algebraMap, phi.commutes] rfl @@ -277,8 +278,8 @@ theorem absoluteValueExtension_embeddingOfExtension_apply [Algebra.IsAlgebraic K L] (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) (x : L) : - absoluteValueExtension_embeddingOfExtension vK w x = - absoluteValueExtension_localizationEmbedding vK w + absoluteValueExtensionEmbeddingOfExtension vK w x = + absoluteValueExtensionLocalizationEmbedding vK w (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) := rfl @@ -289,8 +290,8 @@ theorem absoluteValueExtension_extension_eq_pullback_embeddingOfExtension [Algebra.IsAlgebraic K L] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (w : AbsoluteValueExtension vK L) : - w.1 = absoluteValueExtension_pullback vK hvK - (absoluteValueExtension_embeddingOfExtension vK w) := by + 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 @@ -303,34 +304,35 @@ theorem absoluteValueExtension_extension_eq_pullback_embeddingOfExtension 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 - _ = absoluteValueExtension_pullback vK hvK - (absoluteValueExtension_embeddingOfExtension vK w) x := by + _ = absoluteValueExtensionPullback vK hvK + (absoluteValueExtensionEmbeddingOfExtension vK w) x := by change AbsoluteValue.algebraicLocalizationAbsoluteValue vK w.1 w.2 (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp - (absoluteValueExtension_localizationEmbedding vK w).injective + (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 +/-- 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] absoluteValueExtension_algebraicCompletionClosure vK, - w.1 = absoluteValueExtension_pullback vK hvK tau := by - exact ⟨absoluteValueExtension_embeddingOfExtension vK w, + ∃ 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] absoluteValueExtension_algebraicCompletionClosure vK) : Prop := - ∃ sigma : absoluteValueExtension_algebraicCompletionClosure vK ≃ₐ[vK.Completion] - absoluteValueExtension_algebraicCompletionClosure vK, + (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 @@ -338,27 +340,27 @@ def AbsoluteValueExtensionConjugateOverCompletion theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algEquiv {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) - (sigma : absoluteValueExtension_algebraicCompletionClosure vK - ≃ₐ[vK.Completion] absoluteValueExtension_algebraicCompletionClosure vK) - (x : absoluteValueExtension_algebraicCompletionClosure vK) : - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (sigma x) = - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK x := by + (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 := absoluteValueExtension_algebraicCompletionClosure vK) + (L := absoluteValueExtensionAlgebraicCompletionClosure vK) (AbsoluteValue.completionAbsoluteValue vK) (AbsoluteValue.completionAbsoluteValue_complete vK) (AbsoluteValue.completionAbsoluteValue_isNontrivial vK hvK) - let a : AbsoluteValue (absoluteValueExtension_algebraicCompletionClosure vK) ℝ := - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).comp + let a : AbsoluteValue (absoluteValueExtensionAlgebraicCompletionClosure vK) ℝ := + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).comp (f := sigma.toRingHom) sigma.injective - have ha : a = absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK := by + have ha : a = absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK := by change a = R.extension apply R.unique intro y - change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (sigma (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) y)) = _ + (absoluteValueExtensionAlgebraicCompletionClosure vK) y)) = _ rw [sigma.commutes] exact absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap vK hvK y exact congrArg (fun b : AbsoluteValue _ ℝ => b x) ha @@ -367,83 +369,83 @@ theorem absoluteValueExtension_algebraicClosureAbsoluteValue_algEquiv 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] absoluteValueExtension_algebraicCompletionClosure vK} + {tau tau' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK} (hconj : AbsoluteValueExtensionConjugateOverCompletion vK tau tau') : - absoluteValueExtension_pullback vK hvK tau = - absoluteValueExtension_pullback vK hvK tau' := by + absoluteValueExtensionPullback vK hvK tau = + absoluteValueExtensionPullback vK hvK tau' := by rcases hconj with ⟨sigma, hsigma⟩ ext x - change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (tau x) = - absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK (tau' 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 absoluteValueExtension_algebraicClosureToCompletionRingHom +noncomputable def absoluteValueExtensionAlgebraicClosureToCompletionRingHom {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : - absoluteValueExtension_algebraicCompletionClosure vK →+* - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + absoluteValueExtensionAlgebraicCompletionClosure vK →+* + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := UniformSpace.Completion.coeRingHom.comp (WithAbs.equiv - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK)).symm.toRingHom + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK)).symm.toRingHom @[simp] theorem absoluteValueExtension_algebraicClosureToCompletionRingHom_apply {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) - (x : absoluteValueExtension_algebraicCompletionClosure vK) : - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK x = + (x : absoluteValueExtensionAlgebraicCompletionClosure vK) : + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK x = ((WithAbs.equiv - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK)).symm x : - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion) := + (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 absoluteValueExtension_algebraicClosureCompletionAlgebra +noncomputable def absoluteValueExtensionAlgebraicClosureCompletionAlgebra {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : Algebra vK.Completion - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := - ((absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := + ((absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK))).toAlgebra + (absoluteValueExtensionAlgebraicCompletionClosure vK))).toAlgebra /-- The dense algebraic-closure map as a `K_v`-algebra homomorphism. -/ -noncomputable def absoluteValueExtension_algebraicClosureToCompletionAlgHom +noncomputable def absoluteValueExtensionAlgebraicClosureToCompletionAlgHom {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : - letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK - absoluteValueExtension_algebraicCompletionClosure vK →ₐ[vK.Completion] - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := by - letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK + absoluteValueExtensionAlgebraicCompletionClosure vK →ₐ[vK.Completion] + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := by + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK exact - { __ := absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + { __ := absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK commutes' _ := rfl } /-- A valuation-preserving `K`-embedding `tau` extends isometrically from `L` to a map between metric completions. -/ -noncomputable def absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom +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] absoluteValueExtension_algebraicCompletionClosure vK) : + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : WithAbs w.1 →+* - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := - (absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + (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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) (x : WithAbs w.1) : - ‖absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + ‖absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom vK hvK w tau x‖ = ‖x‖ := by - change ‖absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + change ‖absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (tau (WithAbs.equiv w.1 x))‖ = ‖x‖ rw [absoluteValueExtension_algebraicClosureToCompletionRingHom_apply, UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs, @@ -458,25 +460,25 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : - Isometry (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + (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 absoluteValueExtension_embeddingCompletionMap +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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : w.1.Completion →+* - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := UniformSpace.Completion.extensionHom - (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + (absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom vK hvK w tau) (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry vK hvK w tau htau).continuous @@ -486,15 +488,15 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) (x : WithAbs w.1) : - absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (x : w.1.Completion) = - absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom vK hvK w tau x := UniformSpace.Completion.extensionHom_coe - (absoluteValueExtension_embeddingToAlgebraicClosureCompletionRingHom + (absoluteValueExtensionEmbeddingToAlgebraicClosureCompletionRingHom vK hvK w tau) (absoluteValueExtension_embeddingToAlgebraicClosureCompletion_isometry vK hvK w tau htau).continuous x @@ -504,9 +506,9 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : - Isometry (absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau) := + (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 @@ -515,19 +517,19 @@ is an isometry. -/ theorem absoluteValueExtension_completionToAlgebraicClosureCompletion_isometry {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : - Isometry ((absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + Isometry ((absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK))) := by + (absoluteValueExtensionAlgebraicCompletionClosure vK))) := by apply AddMonoidHomClass.isometry_of_norm intro x - change ‖absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + change ‖absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) x)‖ = ‖x‖ + (absoluteValueExtensionAlgebraicCompletionClosure vK) x)‖ = ‖x‖ rw [absoluteValueExtension_algebraicClosureToCompletionRingHom_apply, UniformSpace.Completion.norm_coe, WithAbs.norm_eq_apply_ofAbs] - change absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK + change absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) x) = ‖x‖ + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) = ‖x‖ rw [absoluteValueExtension_algebraicClosureAbsoluteValue_algebraMap] rfl @@ -538,19 +540,19 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) (x : vK.Completion) : - absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (AbsoluteValue.completionMap vK w.1 w.2 x) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) x) := by - let f := (absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau).comp + (absoluteValueExtensionAlgebraicCompletionClosure vK) x) := by + let f := (absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau).comp (AbsoluteValue.completionMap vK w.1 w.2) - let g := (absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK).comp + let g := (absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK).comp (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK)) + (absoluteValueExtensionAlgebraicCompletionClosure vK)) change f x = g x refine UniformSpace.Completion.induction_on (α := WithAbs vK) x ?_ ?_ · exact isClosed_eq @@ -561,48 +563,48 @@ theorem absoluteValueExtension_embeddingCompletionMap_completionMap vK hvK).continuous · intro a dsimp [f, g] - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (AbsoluteValue.completionMap vK w.1 w.2 (algebraMap K vK.Completion (WithAbs.equiv vK a))) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) + (absoluteValueExtensionAlgebraicCompletionClosure vK) (algebraMap K vK.Completion (WithAbs.equiv vK a))) rw [AbsoluteValue.completionMap_coe] - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (((algebraMap (WithAbs vK) (WithAbs w.1)) a : WithAbs w.1) : w.1.Completion) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) + (absoluteValueExtensionAlgebraicCompletionClosure vK) (a : vK.Completion)) rw [absoluteValueExtension_embeddingCompletionMap_coe] - change absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + change absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (tau (algebraMap K L (WithAbs.equiv vK a))) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK + absoluteValueExtensionAlgebraicClosureToCompletionRingHom vK hvK (algebraMap vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK) + (absoluteValueExtensionAlgebraicCompletionClosure vK) (algebraMap K vK.Completion (WithAbs.equiv vK a))) congr 1 rw [tau.commutes, IsScalarTower.algebraMap_apply K vK.Completion - (absoluteValueExtension_algebraicCompletionClosure vK)] + (absoluteValueExtensionAlgebraicCompletionClosure vK)] /-- The completion extension of `tau`, bundled over `K_v`. -/ -noncomputable def absoluteValueExtension_embeddingCompletionAlgHom +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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) : letI := AbsoluteValue.completionAlgebra vK w.1 w.2 - letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK w.1.Completion →ₐ[vK.Completion] - (absoluteValueExtension_algebraicClosureAbsoluteValue vK hvK).Completion := by + (absoluteValueExtensionAlgebraicClosureAbsoluteValue vK hvK).Completion := by letI := AbsoluteValue.completionAlgebra vK w.1 w.2 - letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK exact - { __ := absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + { __ := absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau commutes' x := absoluteValueExtension_embeddingCompletionMap_completionMap vK hvK w tau htau x } @@ -613,19 +615,19 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (tau : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) + (htau : w.1 = absoluteValueExtensionPullback vK hvK tau) (z : AbsoluteValue.algebraicLocalization vK w.1 w.2) : - letI := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK - absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau (z : w.1.Completion) - ∈ (absoluteValueExtension_algebraicClosureToCompletionAlgHom vK hvK).range := by + 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + let := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 - let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau - let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom vK hvK + 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) @@ -636,16 +638,16 @@ theorem absoluteValueExtension_embeddingCompletionAlgHom_mem_range rcases hx with ⟨y, rfl⟩ refine ⟨tau y, ?_⟩ symm - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (AbsoluteValue.toCompletion w.1 y) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK (tau y) - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + 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 - (absoluteValueExtension_algebraicCompletionClosure vK) x, ?_⟩ + (absoluteValueExtensionAlgebraicCompletionClosure vK) x, ?_⟩ exact (absoluteValueExtension_embeddingCompletionMap_completionMap vK hvK w tau htau x).symm · intro x y _ _ hx hy @@ -662,24 +664,24 @@ theorem absoluteValueExtension_embeddingCompletionAlgHom_mem_range `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 absoluteValueExtension_localizationEmbeddingOfPullback +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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) : + (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] - absoluteValueExtension_algebraicCompletionClosure vK := by + 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + letI := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 - let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau - let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom vK hvK + 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 @@ -692,21 +694,21 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) - (htau : w.1 = absoluteValueExtension_pullback vK hvK tau) + (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 - absoluteValueExtension_localizationEmbeddingOfPullback vK hvK w tau htau + 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 := absoluteValueExtension_algebraicClosureCompletionAlgebra vK hvK + let := absoluteValueExtensionAlgebraicClosureCompletionAlgebra vK hvK let E := AbsoluteValue.algebraicLocalization vK w.1 w.2 - let F := absoluteValueExtension_embeddingCompletionAlgHom vK hvK w tau htau - let j := absoluteValueExtension_algebraicClosureToCompletionAlgHom vK hvK + 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), @@ -719,10 +721,10 @@ theorem absoluteValueExtension_localizationEmbeddingOfPullback_toLocalization F (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) by exact congrArg Subtype.val ((AlgEquiv.ofInjectiveField j).apply_symm_apply _)] - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + change absoluteValueExtensionEmbeddingCompletionMap vK hvK w tau htau (AbsoluteValue.toCompletion w.1 x) = - absoluteValueExtension_algebraicClosureToCompletionRingHom vK hvK (tau x) - change absoluteValueExtension_embeddingCompletionMap vK hvK w tau htau + 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 @@ -732,7 +734,7 @@ 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] [Algebra.IsAlgebraic F E] + [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 @@ -757,27 +759,28 @@ theorem absoluteValueExtension_algHom_conjugate_in_algClosure rw [hphi] at hx exact hx -/-- The difficult direction of clause (ii) of the valuation-extension theorem: equality of pullback absolute +/-- 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] absoluteValueExtension_algebraicCompletionClosure vK} - (h : absoluteValueExtension_pullback vK hvK tau = - absoluteValueExtension_pullback vK hvK tau') : + {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 := - ⟨absoluteValueExtension_pullback vK hvK tau, + ⟨absoluteValueExtensionPullback vK hvK tau, absoluteValueExtension_pullback_extends vK hvK tau⟩ - have htau : w.1 = absoluteValueExtension_pullback vK hvK tau := rfl - have htau' : w.1 = absoluteValueExtension_pullback vK hvK tau' := h + 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 := absoluteValueExtension_localizationEmbeddingOfPullback + let phi := absoluteValueExtensionLocalizationEmbeddingOfPullback vK hvK w tau htau - let phi' := absoluteValueExtension_localizationEmbeddingOfPullback + let phi' := absoluteValueExtensionLocalizationEmbeddingOfPullback vK hvK w tau' htau' let : Algebra.IsAlgebraic vK.Completion (AbsoluteValue.algebraicLocalization vK w.1 w.2) := @@ -791,15 +794,16 @@ theorem absoluteValueExtension_conjugate_of_pullback_eq 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 +/-- 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] absoluteValueExtension_algebraicCompletionClosure vK) : - absoluteValueExtension_pullback vK hvK tau = - absoluteValueExtension_pullback vK hvK tau' ↔ + (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 @@ -813,11 +817,11 @@ theorem absoluteValueExtension_extension_theorem [Algebra.IsAlgebraic K L] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : (∀ w : AbsoluteValueExtension vK L, - ∃ tau : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK, - w.1 = absoluteValueExtension_pullback vK hvK tau) ∧ - (∀ tau tau' : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK, - absoluteValueExtension_pullback vK hvK tau = - absoluteValueExtension_pullback vK hvK tau' ↔ + ∃ 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⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean index 8f50be6cbd..34bf9e7d7d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean @@ -26,7 +26,7 @@ universe u v open scoped TensorProduct /-- The product of the component maps `K_v ⊗_K L → L_w`. -/ -noncomputable def completionTensorMap_leftCanonicalHom +noncomputable def completionTensorMapLeftCanonicalHom {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] (vK : AbsoluteValue K ℝ) : letI : ∀ w : AbsoluteValueExtension vK L, @@ -38,7 +38,7 @@ noncomputable def completionTensorMap_leftCanonicalHom Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 exact AlgHom.pi fun w ↦ - absoluteValueExtension_localizationTensorHom vK w + absoluteValueExtensionLocalizationTensorHom vK w @[simp] theorem completionTensorMap_leftCanonicalHom_tmul_apply @@ -48,7 +48,7 @@ theorem completionTensorMap_leftCanonicalHom_tmul_apply letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - completionTensorMap_leftCanonicalHom vK (b ⊗ₜ[K] a) w = + 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, @@ -58,7 +58,7 @@ theorem completionTensorMap_leftCanonicalHom_tmul_apply /-- The canonical `K_v`-algebra map in the chosen tensor-factor order `L ⊗_K K_v`. -/ -noncomputable def completionTensorMap_canonicalHom +noncomputable def completionTensorMapCanonicalHom {K : Type u} {L : Type v} [Field K] [Field L] [Algebra K L] (vK : AbsoluteValue K ℝ) : letI := Algebra.TensorProduct.rightAlgebra @@ -76,7 +76,7 @@ noncomputable def completionTensorMap_canonicalHom let e := Algebra.TensorProduct.comm K L vK.Completion let h : vK.Completion ⊗[K] L →ₐ[vK.Completion] ∀ w : AbsoluteValueExtension vK L, w.1.Completion := - completionTensorMap_leftCanonicalHom vK + completionTensorMapLeftCanonicalHom vK exact { toRingHom := h.toRingHom.comp e.toRingEquiv.toRingHom commutes' := fun b ↦ by @@ -96,7 +96,7 @@ theorem completionTensorMap_canonicalHom_tmul_apply letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - completionTensorMap_canonicalHom vK (a ⊗ₜ[K] b) w = + 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 @@ -104,8 +104,8 @@ theorem completionTensorMap_canonicalHom_tmul_apply let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - simp only [completionTensorMap_canonicalHom] - change completionTensorMap_leftCanonicalHom (L := L) vK + 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean index e40537676f..9954537cfb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorPr /-! # Compatibility of local degree, norm, and trace -The canonical decomposition of the completion tensor-product decomposition gives the sum of the local +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`. -/ @@ -41,7 +42,7 @@ theorem completionModuleFinite inferInstance let : Module.Finite vK.Completion (∀ w : AbsoluteValueExtension vK L, w.1.Completion) := - Module.Finite.equiv (completionTensorDecomposition_left vK hvK).toLinearEquiv + Module.Finite.equiv (completionTensorDecompositionLeft vK hvK).toLinearEquiv exact moduleFiniteOfPi (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) w @@ -50,7 +51,7 @@ 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -60,7 +61,7 @@ theorem completionDegreeNormTrace_degree Module.finrank K L = ∑ w : AbsoluteValueExtension vK L, Module.finrank vK.Completion w.1.Completion := by - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -69,14 +70,14 @@ theorem completionDegreeNormTrace_degree fun w ↦ completionModuleFinite vK hvK w exact baseChange_pi_finrank_eq_sum (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) - (completionTensorDecomposition_left vK hvK) + (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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -87,7 +88,7 @@ theorem completionDegreeNormTrace_norm ∏ w : AbsoluteValueExtension vK L, Algebra.norm vK.Completion (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) := by - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -96,14 +97,14 @@ theorem completionDegreeNormTrace_norm fun w ↦ completionModuleFinite vK hvK w simpa using baseChange_pi_norm_eq_prod (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) - (completionTensorDecomposition_left vK hvK) x + (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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -114,7 +115,7 @@ theorem completionDegreeNormTrace_trace ∑ w : AbsoluteValueExtension vK L, Algebra.trace vK.Completion w.1.Completion (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) := by - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -123,7 +124,7 @@ theorem completionDegreeNormTrace_trace fun w ↦ completionModuleFinite vK hvK w simpa using baseChange_pi_trace_eq_sum (fun w : AbsoluteValueExtension vK L ↦ w.1.Completion) - (completionTensorDecomposition_left vK hvK) x + (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. -/ @@ -131,7 +132,7 @@ 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 @@ -151,7 +152,7 @@ theorem completionDegreeNormTrace ∑ w : AbsoluteValueExtension vK L, Algebra.trace vK.Completion w.1.Completion (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x)) := by - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean index e3098668c6..876ff907b8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean @@ -30,7 +30,7 @@ namespace Valuations universe u v /-- Base change of the chosen irreducible polynomial from `K` to its completion `K_v`. -/ -abbrev completionExtensionFactor_completionPolynomial +abbrev completionExtensionFactorCompletionPolynomial {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (f : K[X]) : vK.Completion[X] := f.map (algebraMap K vK.Completion) @@ -39,7 +39,7 @@ abbrev completionExtensionFactor_completionPolynomial 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 (completionExtensionFactor_completionPolynomial vK f) + 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 @@ -70,7 +70,7 @@ theorem completionExtensionFactor_completionFactors_eq_minpolyFactors (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) : polynomialDistinctNormalizedFactors - (completionExtensionFactor_completionPolynomial vK f) = + (completionExtensionFactorCompletionPolynomial vK f) = polynomialDistinctNormalizedFactors ((minpoly K α).map (algebraMap K vK.Completion)) := by exact polynomialDistinctNormalizedFactors_eq_of_associated @@ -79,7 +79,7 @@ theorem completionExtensionFactor_completionFactors_eq_minpolyFactors /-- Transport the factor set of the mapped minimal polynomial to the factor set of the particular chosen irreducible polynomial. -/ -noncomputable def completionExtensionFactor_minpolyFactorsEquivCompletionFactors +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) : @@ -98,18 +98,18 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) := + Setoid (L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) := Setoid.comap (simpleEmbeddingsEquivMappedMinpolyRoots (K' := vK.Completion) - (E := absoluteValueExtension_algebraicCompletionClosure vK) + (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 completionExtensionFactor_embeddingClassesEquivMinpolyFactors +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) = ⊤) : @@ -118,11 +118,11 @@ noncomputable def completionExtensionFactor_embeddingClassesEquivMinpolyFactors ((minpoly K α).map (algebraMap K vK.Completion)) := let e := simpleEmbeddingsEquivMappedMinpolyRoots (K' := vK.Completion) - (E := absoluteValueExtension_algebraicCompletionClosure vK) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) α hα hgen (Quotient.congr e (fun _ _ => Iff.rfl)).trans (rootClassesEquivDistinctNormalizedFactors - (E := absoluteValueExtension_algebraicCompletionClosure vK) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) ((Polynomial.map_ne_zero_iff (algebraMap K vK.Completion).injective).2 (minpoly.ne_zero hα))) @@ -132,7 +132,7 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) : + (τ τ' : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen).r τ τ' ↔ AbsoluteValueExtensionConjugateOverCompletion vK τ τ' := by let pb : PowerBasis K L := PowerBasis.ofAdjoinEqTop hα hgen @@ -142,7 +142,7 @@ theorem completionExtensionFactor_embeddingSetoid_rel_iff_conjugate · intro hconj obtain ⟨σ, hσ⟩ := IsConjRoot.exists_algEquiv hconj.symm refine ⟨σ, ?_⟩ - let στ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK := + let στ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := (σ.toAlgHom.restrictScalars K).comp τ have heq : τ' = στ := by apply pb.algHom_ext @@ -161,9 +161,9 @@ 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] absoluteValueExtension_algebraicCompletionClosure vK) : + (τ : L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK) : AbsoluteValueExtension vK L := - ⟨absoluteValueExtension_pullback vK hvK τ, + ⟨absoluteValueExtensionPullback vK hvK τ, absoluteValueExtension_pullback_extends vK hvK τ⟩ /-- In the simple-extension situation, equality of the two pullback @@ -175,9 +175,9 @@ theorem completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (α : L) (hα : IsIntegral K α) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) - (τ τ' : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK) : - absoluteValueExtension_pullback vK hvK τ = - absoluteValueExtension_pullback vK hvK τ' ↔ + (τ τ' : 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 @@ -193,13 +193,13 @@ theorem completionExtensionFactor_extension_eq_pullback_embeddingOfExtension [Algebra.IsAlgebraic K L] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (w : AbsoluteValueExtension vK L) : - w.1 = absoluteValueExtension_pullback vK hvK - (absoluteValueExtension_embeddingOfExtension vK w) := by + 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 completionExtensionFactor_extensionsEquivEmbeddingClasses +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 α) @@ -222,7 +222,7 @@ noncomputable def completionExtensionFactor_extensionsEquivEmbeddingClasses refine { toFun := fun w => Quotient.mk (CompletionExtensionFactorEmbeddingSetoid vK α hα hgen) - (absoluteValueExtension_embeddingOfExtension vK w) + (absoluteValueExtensionEmbeddingOfExtension vK w) invFun := fromClass left_inv := ?_ right_inv := ?_ } @@ -238,13 +238,13 @@ noncomputable def completionExtensionFactor_extensionsEquivEmbeddingClasses pullbackAbsoluteValueExtension vK hvK τ apply (completionExtensionFactor_pullback_eq_iff_embeddingSetoid_rel vK hvK α hα hgen - (absoluteValueExtension_embeddingOfExtension vK wτ) τ).1 + (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 completionExtensionFactor_extensionsEquivMinpolyFactors +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 α) @@ -252,14 +252,14 @@ noncomputable def completionExtensionFactor_extensionsEquivMinpolyFactors AbsoluteValueExtension vK L ≃ DistinctNormalizedFactors ((minpoly K α).map (algebraMap K vK.Completion)) := - (completionExtensionFactor_extensionsEquivEmbeddingClasses + (completionExtensionFactorExtensionsEquivEmbeddingClasses vK hvK α hα hgen).trans - (completionExtensionFactor_embeddingClassesEquivMinpolyFactors + (completionExtensionFactorEmbeddingClassesEquivMinpolyFactors vK α hα hgen) /-- Auxiliary form with the particular chosen irreducible polynomial `f` as target. -/ -noncomputable def completionExtensionFactor_extensionsEquivCompletionFactorsAux +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) @@ -268,14 +268,14 @@ noncomputable def completionExtensionFactor_extensionsEquivCompletionFactorsAux AbsoluteValueExtension vK L ≃ CompletionExtensionFactorCompletionFactors vK f := let hα := completionExtensionFactor_root_isIntegral hf hroot - (completionExtensionFactor_extensionsEquivMinpolyFactors + (completionExtensionFactorExtensionsEquivMinpolyFactors vK hvK α hα hgen).trans - (completionExtensionFactor_minpolyFactorsEquivCompletionFactors + (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 completionExtensionFactor_extensionFactor +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 @@ -292,9 +292,9 @@ theorem completionExtensionFactor_extensionFactor_mem (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) (w : AbsoluteValueExtension vK L) : - completionExtensionFactor_extensionFactor vK α w ∈ + completionExtensionFactorExtensionFactor vK α w ∈ polynomialDistinctNormalizedFactors - (completionExtensionFactor_completionPolynomial vK f) := by + (completionExtensionFactorCompletionPolynomial vK f) := by classical let hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 let : SMul K w.1.Completion := hK.toSMul @@ -311,29 +311,29 @@ theorem completionExtensionFactor_extensionFactor_mem (by ext x; simp) hα have haKv : IsIntegral vK.Completion a := IsIntegral.tower_top haK - have hp0 : completionExtensionFactor_completionPolynomial vK f ≠ 0 := + 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 - (completionExtensionFactor_completionPolynomial vK f) = 0 := by + (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 [completionExtensionFactor_extensionFactor, + 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 completionExtensionFactor_extensionToFactor +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 => ⟨completionExtensionFactor_extensionFactor vK α w, + 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 @@ -345,26 +345,26 @@ theorem completionExtensionFactor_embeddingOfExtension_minpoly (vK : AbsoluteValue K ℝ) (α : L) (w : AbsoluteValueExtension vK L) : minpoly vK.Completion - (absoluteValueExtension_embeddingOfExtension vK w α) = - completionExtensionFactor_extensionFactor vK α w := by + (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 - (absoluteValueExtension_embeddingOfExtension vK w α) = + (absoluteValueExtensionEmbeddingOfExtension vK w α) = minpoly vK.Completion a := minpoly.algHom_eq - (absoluteValueExtension_localizationEmbedding vK w) - (absoluteValueExtension_localizationEmbedding vK w).injective a + (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 - _ = completionExtensionFactor_extensionFactor vK α w := 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 @@ -433,7 +433,7 @@ theorem completionExtensionFactor_completion_adjoin_eq_top /-- The finite simple field cut out by the factor attached to `w` is the metric completion `L_w`. -/ -noncomputable def completionExtensionFactor_adjoinRootEquivCompletion +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 α) @@ -442,7 +442,7 @@ noncomputable def completionExtensionFactor_adjoinRootEquivCompletion 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 (completionExtensionFactor_extensionFactor vK α w) ≃ₐ[vK.Completion] + 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 @@ -479,8 +479,8 @@ theorem completionExtensionFactor_adjoinRootEquivCompletion_root letI hK := AbsoluteValue.extensionCompletionAlgebra (K := K) w.1 letI : SMul K w.1.Completion := hK.toSMul letI := AbsoluteValue.completionAlgebra vK w.1 w.2 - completionExtensionFactor_adjoinRootEquivCompletion vK hvK α hα hgen w - (AdjoinRoot.root (completionExtensionFactor_extensionFactor vK α w)) = + 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 @@ -503,16 +503,16 @@ theorem completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback (α : L) (hα : IsIntegral K α) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (w : AbsoluteValueExtension vK L) - (τ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK) - (hτ : w.1 = absoluteValueExtension_pullback vK hvK τ) : - completionExtensionFactor_extensionFactor vK α w = + (τ : 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 := absoluteValueExtension_embeddingOfExtension vK w - have hpull : absoluteValueExtension_pullback vK hvK τw = - absoluteValueExtension_pullback vK hvK τ := + 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 τ := @@ -533,32 +533,32 @@ theorem completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback /-- 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 completionExtensionFactor_completionEquivSimpleRoot +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] absoluteValueExtension_algebraicCompletionClosure vK) - (hτ : w.1 = absoluteValueExtension_pullback vK hvK τ) : + (τ : 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 (absoluteValueExtension_algebraicCompletionClosure vK)) := by + ({τ α} : 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 : completionExtensionFactor_extensionFactor vK α w = + 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 (completionExtensionFactor_adjoinRootEquivCompletion + exact (completionExtensionFactorAdjoinRootEquivCompletion vK hvK α hα hgen w).symm |>.trans ((AdjoinRoot.algEquivOfEq vK.Completion _ _ hfactor).trans (IntermediateField.adjoinRootEquivAdjoin vK.Completion hτα)) @@ -572,12 +572,12 @@ theorem completionExtensionFactor_completionEquivSimpleRoot_gen (α : L) (hα : IsIntegral K α) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (w : AbsoluteValueExtension vK L) - (τ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK) - (hτ : w.1 = absoluteValueExtension_pullback vK hvK τ) : + (τ : 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 - completionExtensionFactor_completionEquivSimpleRoot + completionExtensionFactorCompletionEquivSimpleRoot vK hvK α hα hgen w τ hτ (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = IntermediateField.AdjoinSimple.gen vK.Completion (τ α) := by @@ -586,9 +586,9 @@ theorem completionExtensionFactor_completionEquivSimpleRoot_gen 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 := completionExtensionFactor_adjoinRootEquivCompletion + let e0 := completionExtensionFactorAdjoinRootEquivCompletion vK hvK α hα hgen w - let hfactor : completionExtensionFactor_extensionFactor vK α w = + let hfactor : completionExtensionFactorExtensionFactor vK α w = minpoly vK.Completion (τ α) := completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback vK hvK α hα hgen w τ hτ @@ -598,7 +598,7 @@ theorem completionExtensionFactor_completionEquivSimpleRoot_gen let e2 := IntermediateField.adjoinRootEquivAdjoin vK.Completion hτα have hinv : e0.symm (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = - AdjoinRoot.root (completionExtensionFactor_extensionFactor vK α w) := by + AdjoinRoot.root (completionExtensionFactorExtensionFactor vK α w) := by apply e0.injective rw [e0.apply_symm_apply, completionExtensionFactor_adjoinRootEquivCompletion_root] @@ -616,18 +616,18 @@ theorem completionExtensionFactor_completionEquivSimpleRoot_coe (α : L) (hα : IsIntegral K α) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (w : AbsoluteValueExtension vK L) - (τ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK) - (hτ : w.1 = absoluteValueExtension_pullback vK hvK τ) + (τ : 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 - ((completionExtensionFactor_completionEquivSimpleRoot + ((completionExtensionFactorCompletionEquivSimpleRoot vK hvK α hα hgen w τ hτ (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : IntermediateField.adjoin vK.Completion - ({τ α} : Set (absoluteValueExtension_algebraicCompletionClosure vK))) : - absoluteValueExtension_algebraicCompletionClosure vK) = τ x := by + ({τ α} : 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 @@ -637,20 +637,20 @@ theorem completionExtensionFactor_completionEquivSimpleRoot_coe let : IsScalarTower K vK.Completion w.1.Completion := AbsoluteValue.completion_isScalarTower vK w.1 w.2 let E := IntermediateField.adjoin vK.Completion - ({τ α} : Set (absoluteValueExtension_algebraicCompletionClosure vK)) + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) let e : w.1.Completion ≃ₐ[vK.Completion] E := - completionExtensionFactor_completionEquivSimpleRoot + completionExtensionFactorCompletionEquivSimpleRoot vK hvK α hα hgen w τ hτ let ι : L →ₐ[K] w.1.Completion := AbsoluteValue.toCompletionAlgHom (K := K) w.1 - let φ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK := + 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) : - absoluteValueExtension_algebraicCompletionClosure vK) = τ α + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ α rw [completionExtensionFactor_completionEquivSimpleRoot_gen] rfl exact DFunLike.congr_fun hφ x @@ -664,23 +664,23 @@ theorem completionExtensionFactor_extensionsEquivCompletionFactorsAux_apply (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (w : AbsoluteValueExtension vK L) : - (completionExtensionFactor_extensionsEquivCompletionFactorsAux + (completionExtensionFactorExtensionsEquivCompletionFactorsAux vK hvK hf hroot hgen w).1 = - completionExtensionFactor_extensionFactor vK α w := by + 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 - (absoluteValueExtension_embeddingOfExtension vK w α) = - completionExtensionFactor_extensionFactor vK α w + (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 completionExtensionFactor_extensionEquivFactors +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) @@ -688,11 +688,11 @@ noncomputable def completionExtensionFactor_extensionEquivFactors (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : AbsoluteValueExtension vK L ≃ CompletionExtensionFactorCompletionFactors vK f := by - let e := completionExtensionFactor_extensionsEquivCompletionFactorsAux + let e := completionExtensionFactorExtensionsEquivCompletionFactorsAux vK hvK hf hroot hgen apply Equiv.ofBijective - (completionExtensionFactor_extensionToFactor vK hf hroot) - have heq : completionExtensionFactor_extensionToFactor vK hf hroot = e := by + (completionExtensionFactorExtensionToFactor vK hf hroot) + have heq : completionExtensionFactorExtensionToFactor vK hf hroot = e := by funext w apply Subtype.ext exact (completionExtensionFactor_extensionsEquivCompletionFactorsAux_apply @@ -732,11 +732,11 @@ theorem completionExtensionFactor_factorRoot_mem_mappedMinpoly (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : β ∈ ((minpoly K α).map (algebraMap K vK.Completion)).rootSet - (absoluteValueExtension_algebraicCompletionClosure vK) := by + (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 := @@ -748,20 +748,20 @@ theorem completionExtensionFactor_factorRoot_mem_mappedMinpoly /-- The embedding associated with a factor and a specifically chosen root of that factor. -/ -noncomputable def completionExtensionFactor_embeddingOfFactorRoot +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) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK := + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + L →ₐ[K] absoluteValueExtensionAlgebraicCompletionClosure vK := let hα := completionExtensionFactor_root_isIntegral hf hroot (simpleEmbeddingsEquivMappedMinpolyRoots (K' := vK.Completion) - (E := absoluteValueExtension_algebraicCompletionClosure vK) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) α hα hgen).symm ⟨β, completionExtensionFactor_factorRoot_mem_mappedMinpoly vK hf hroot g β hβ⟩ @@ -773,18 +773,18 @@ theorem completionExtensionFactor_embeddingOfFactorRoot_apply (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - completionExtensionFactor_embeddingOfFactorRoot + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ α = β := by let hα := completionExtensionFactor_root_isIntegral hf hroot let e := simpleEmbeddingsEquivMappedMinpolyRoots (K' := vK.Completion) - (E := absoluteValueExtension_algebraicCompletionClosure vK) + (E := absoluteValueExtensionAlgebraicCompletionClosure vK) α hα hgen let z : PolynomialRootsIn - (absoluteValueExtension_algebraicCompletionClosure vK) + (absoluteValueExtensionAlgebraicCompletionClosure vK) ((minpoly K α).map (algebraMap K vK.Completion)) := ⟨β, completionExtensionFactor_factorRoot_mem_mappedMinpoly vK hf hroot g β hβ⟩ @@ -793,19 +793,19 @@ theorem completionExtensionFactor_embeddingOfFactorRoot_apply /-- The valuation extension attached to the chosen root is the explicit pullback `bar v ∘ τ`. -/ -noncomputable def completionExtensionFactor_extensionOfFactorRoot +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) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : AbsoluteValueExtension vK L := pullbackAbsoluteValueExtension vK hvK - (completionExtensionFactor_embeddingOfFactorRoot + (completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ) theorem completionExtensionFactor_extensionOfFactorRoot_eq_pullback @@ -815,13 +815,13 @@ theorem completionExtensionFactor_extensionOfFactorRoot_eq_pullback (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - (completionExtensionFactor_extensionOfFactorRoot + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + (completionExtensionFactorExtensionOfFactorRoot vK hvK hf hroot hgen g β hβ).1 = - absoluteValueExtension_pullback vK hvK - (completionExtensionFactor_embeddingOfFactorRoot + absoluteValueExtensionPullback vK hvK + (completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ) := rfl @@ -834,16 +834,16 @@ theorem completionExtensionFactor_extensionOfFactorRoot_factor (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - completionExtensionFactor_extensionFactor vK α - (completionExtensionFactor_extensionOfFactorRoot + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorExtensionFactor vK α + (completionExtensionFactorExtensionOfFactorRoot vK hvK hf hroot hgen g β hβ) = g.1 := by let hα := completionExtensionFactor_root_isIntegral hf hroot - let τ := completionExtensionFactor_embeddingOfFactorRoot + let τ := completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ - let w := completionExtensionFactor_extensionOfFactorRoot + let w := completionExtensionFactorExtensionOfFactorRoot vK hvK hf hroot hgen g β hβ rcases completionExtensionFactor_factor_irreducible_monic_dvd_minpoly vK hf hroot g with ⟨hgirr, hgmonic, _⟩ @@ -852,7 +852,7 @@ theorem completionExtensionFactor_extensionOfFactorRoot_factor have hmp : g.1 = minpoly vK.Completion β := minpoly.eq_of_irreducible_of_monic hgirr hβeval hgmonic calc - completionExtensionFactor_extensionFactor vK α w = + completionExtensionFactorExtensionFactor vK α w = minpoly vK.Completion (τ α) := completionExtensionFactor_extensionFactor_eq_minpoly_of_pullback vK hvK α hα hgen w τ rfl @@ -869,14 +869,14 @@ theorem completionExtensionFactor_extensionOfFactorRoot_eq_equiv_symm (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - completionExtensionFactor_extensionOfFactorRoot + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : + completionExtensionFactorExtensionOfFactorRoot vK hvK hf hroot hgen g β hβ = - (completionExtensionFactor_extensionEquivFactors + (completionExtensionFactorExtensionEquivFactors vK hvK hf hroot hgen).symm g := by - let e := completionExtensionFactor_extensionEquivFactors + let e := completionExtensionFactorExtensionEquivFactors vK hvK hf hroot hgen apply e.injective rw [e.apply_symm_apply] @@ -891,9 +891,9 @@ theorem completionExtensionFactor_factor_eq_minpoly_root (vK : AbsoluteValue K ℝ) {α : L} {f : K[X]} (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : + (absoluteValueExtensionAlgebraicCompletionClosure vK)) : g.1 = minpoly vK.Completion β := by rcases completionExtensionFactor_factor_irreducible_monic_dvd_minpoly vK hf hroot g with ⟨hgirr, hgmonic, _⟩ @@ -902,38 +902,38 @@ theorem completionExtensionFactor_factor_eq_minpoly_root /-- The completed field belonging to a factor and a chosen root `β` is canonically `K_v(β)`. -/ -noncomputable def completionExtensionFactor_factorRootCompletionEquiv +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) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - let w := completionExtensionFactor_extensionOfFactorRoot + (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 (absoluteValueExtension_algebraicCompletionClosure vK)) := by + ({β} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) := by let hα := completionExtensionFactor_root_isIntegral hf hroot - let w := completionExtensionFactor_extensionOfFactorRoot + 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 : completionExtensionFactor_extensionFactor vK α w = g.1 := + 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 (completionExtensionFactor_adjoinRootEquivCompletion + exact (completionExtensionFactorAdjoinRootEquivCompletion vK hvK α hα hgen w).symm |>.trans ((AdjoinRoot.algEquivOfEq vK.Completion _ _ (hfactor.trans hmp)).trans (IntermediateField.adjoinRootEquivAdjoin vK.Completion hβint)) @@ -947,27 +947,27 @@ theorem completionExtensionFactor_factorRootCompletionEquiv_gen (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) : - let w := completionExtensionFactor_extensionOfFactorRoot + (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 - completionExtensionFactor_factorRootCompletionEquiv + 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 := completionExtensionFactor_extensionOfFactorRoot + 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 := completionExtensionFactor_adjoinRootEquivCompletion + let e0 := completionExtensionFactorAdjoinRootEquivCompletion vK hvK α hα hgen w - let hpoly : completionExtensionFactor_extensionFactor vK α w = + let hpoly : completionExtensionFactorExtensionFactor vK α w = minpoly vK.Completion β := (completionExtensionFactor_extensionOfFactorRoot_factor vK hvK hf hroot hgen g β hβ).trans @@ -978,7 +978,7 @@ theorem completionExtensionFactor_factorRootCompletionEquiv_gen let e2 := IntermediateField.adjoinRootEquivAdjoin vK.Completion hβint have hinv : e0.symm (AbsoluteValue.toCompletionAlgHom (K := K) w.1 α) = - AdjoinRoot.root (completionExtensionFactor_extensionFactor vK α w) := by + AdjoinRoot.root (completionExtensionFactorExtensionFactor vK α w) := by apply e0.injective rw [e0.apply_symm_apply, completionExtensionFactor_adjoinRootEquivCompletion_root] @@ -997,30 +997,30 @@ theorem completionExtensionFactor_factorRootCompletionEquiv_coe (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)) + (absoluteValueExtensionAlgebraicCompletionClosure vK)) (x : L) : - let τ := completionExtensionFactor_embeddingOfFactorRoot + let τ := completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ - let w := completionExtensionFactor_extensionOfFactorRoot + 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 - ((completionExtensionFactor_factorRootCompletionEquiv + ((completionExtensionFactorFactorRootCompletionEquiv vK hvK hf hroot hgen g β hβ (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : IntermediateField.adjoin vK.Completion - ({β} : Set (absoluteValueExtension_algebraicCompletionClosure vK))) : - absoluteValueExtension_algebraicCompletionClosure vK) = τ x := by + ({β} : 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 τ := completionExtensionFactor_embeddingOfFactorRoot + let τ := completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ - let w := completionExtensionFactor_extensionOfFactorRoot + 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 @@ -1028,20 +1028,20 @@ theorem completionExtensionFactor_factorRootCompletionEquiv_coe let : IsScalarTower K vK.Completion w.1.Completion := AbsoluteValue.completion_isScalarTower vK w.1 w.2 let E := IntermediateField.adjoin vK.Completion - ({β} : Set (absoluteValueExtension_algebraicCompletionClosure vK)) + ({β} : Set (absoluteValueExtensionAlgebraicCompletionClosure vK)) let e : w.1.Completion ≃ₐ[vK.Completion] E := - completionExtensionFactor_factorRootCompletionEquiv + completionExtensionFactorFactorRootCompletionEquiv vK hvK hf hroot hgen g β hβ let ι : L →ₐ[K] w.1.Completion := AbsoluteValue.toCompletionAlgHom (K := K) w.1 - let φ : L →ₐ[K] absoluteValueExtension_algebraicCompletionClosure vK := + 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) : - absoluteValueExtension_algebraicCompletionClosure vK) = τ α + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ α rw [completionExtensionFactor_factorRootCompletionEquiv_gen, completionExtensionFactor_embeddingOfFactorRoot_apply] rfl @@ -1061,33 +1061,33 @@ theorem completionExtensionFactor_classification {α : L} {f : K[X]} (hf : Irreducible f) (hroot : Polynomial.aeval α f = 0) (hgen : Algebra.adjoin K ({α} : Set L) = ⊤) : - Function.Bijective (completionExtensionFactor_extensionToFactor vK hf hroot) ∧ + Function.Bijective (completionExtensionFactorExtensionToFactor vK hf hroot) ∧ ∀ (g : CompletionExtensionFactorCompletionFactors vK f) - (β : absoluteValueExtension_algebraicCompletionClosure vK) + (β : absoluteValueExtensionAlgebraicCompletionClosure vK) (hβ : β ∈ g.1.rootSet - (absoluteValueExtension_algebraicCompletionClosure vK)), - let τ := completionExtensionFactor_embeddingOfFactorRoot + (absoluteValueExtensionAlgebraicCompletionClosure vK)), + let τ := completionExtensionFactorEmbeddingOfFactorRoot vK hf hroot hgen g β hβ - let w := completionExtensionFactor_extensionOfFactorRoot + 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 := completionExtensionFactor_factorRootCompletionEquiv + let e := completionExtensionFactorFactorRootCompletionEquiv vK hvK hf hroot hgen g β hβ τ α = β ∧ - w.1 = absoluteValueExtension_pullback vK hvK τ ∧ - w = (completionExtensionFactor_extensionEquivFactors + w.1 = absoluteValueExtensionPullback vK hvK τ ∧ + w = (completionExtensionFactorExtensionEquivFactors vK hvK hf hroot hgen).symm g ∧ - completionExtensionFactor_extensionFactor vK α w = g.1 ∧ + completionExtensionFactorExtensionFactor vK α w = g.1 ∧ ∀ x : L, ((e (AbsoluteValue.toCompletionAlgHom (K := K) w.1 x) : IntermediateField.adjoin vK.Completion ({β} : Set - (absoluteValueExtension_algebraicCompletionClosure vK))) : - absoluteValueExtension_algebraicCompletionClosure vK) = τ x := by + (absoluteValueExtensionAlgebraicCompletionClosure vK))) : + absoluteValueExtensionAlgebraicCompletionClosure vK) = τ x := by constructor - · exact (completionExtensionFactor_extensionEquivFactors + · exact (completionExtensionFactorExtensionEquivFactors vK hvK hf hroot hgen).bijective · intro g β hβ dsimp only diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean index f372ebe79a..abd7be8d96 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -37,7 +37,8 @@ absolute value `v` on `K`, this file proves the exact degree formula 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. +`[L_w : K_v] = e_w f_w`; summing and applying the local degree, norm, and trace formulas gives + the result. -/ noncomputable section @@ -434,11 +435,11 @@ theorem completionExtension_isSeparable (w : AbsoluteValueExtension a L) : letI := AbsoluteValue.completionAlgebra a w.1 w.2 Algebra.IsSeparable a.Completion w.1.Completion := by - let pb := completionTensorDecomposition_powerBasis K L + 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 τ := absoluteValueExtension_embeddingOfExtension a w + 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 @@ -451,26 +452,26 @@ theorem completionExtension_isSeparable (Algebra.IsSeparable.isSeparable K α) have hdvd : minpoly a.Completion (τ α) ∣ (minpoly K α).map (algebraMap K a.Completion) := by - let g := completionExtensionFactor_extensionToFactor a + 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, completionExtensionFactor_extensionToFactor] using hgdvd + simpa [g, completionExtensionFactorExtensionToFactor] using hgdvd have hτα : IsSeparable a.Completion (τ α) := hsepMapped.of_dvd hdvd let E := IntermediateField.adjoin a.Completion - ({τ α} : Set (absoluteValueExtension_algebraicCompletionClosure a)) + ({τ α} : Set (absoluteValueExtensionAlgebraicCompletionClosure a)) have hEsep : Algebra.IsSeparable a.Completion E := Iff.mpr (IntermediateField.isSeparable_adjoin_iff_isSeparable - a.Completion (absoluteValueExtension_algebraicCompletionClosure a)) (by + 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 - (completionExtensionFactor_completionEquivSimpleRoot + (completionExtensionFactorCompletionEquivSimpleRoot a ha α hα hgen w τ hτ).symm theorem completionExtensionInvariants_local_identity @@ -558,7 +559,7 @@ theorem completionExtensionInvariants (hdisc : LubinTate.Valuations.DiscreteExponentialValuation (absoluteValueExponentialValuation a ha)) : let ha0 := absoluteValue_isNontrivial_of_discrete a ha hdisc - letI := completionTensorDecomposition_extensionFintype (K := K) (L := L) a ha0 + 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 @@ -568,7 +569,7 @@ theorem completionExtensionInvariants exponentialRamificationIndex va vw * exponentialResidueDegree va vw hvw) = Module.finrank K L := by let ha0 := absoluteValue_isNontrivial_of_discrete a ha hdisc - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) a ha0 + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean index cc8cd129c6..546c4476d9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean @@ -29,7 +29,7 @@ open scoped TensorProduct /-- The nontriviality convention supplies the corresponding nontrivially normed field structure on `K_v`. -/ -@[reducible] noncomputable def absoluteValueExtension_completionNontriviallyNormedField +@[reducible] noncomputable def absoluteValueExtensionCompletionNontriviallyNormedField {K : Type u} [Field K] (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) : NontriviallyNormedField vK.Completion := @@ -40,7 +40,7 @@ nontrivially normed field structure on `K_v`. -/ /-- 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 absoluteValueExtension_completionNormedAlgebra +@[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 @@ -55,7 +55,7 @@ the isometric completion map supplied by the valuation-extension theorem. -/ (map_zero (AbsoluteValue.completionMap vK w.1 w.2))] /-- Multiplication gives the canonical map `K_v ⊗_K L → L_w`. -/ -noncomputable def absoluteValueExtension_localizationTensorHom +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 @@ -76,7 +76,7 @@ theorem absoluteValueExtension_localizationTensorHom_tmul (vK : AbsoluteValue K ℝ) (w : AbsoluteValueExtension vK L) (b : vK.Completion) (a : L) : letI := AbsoluteValue.completionAlgebra vK w.1 w.2 - absoluteValueExtension_localizationTensorHom vK w (b ⊗ₜ[K] a) = + 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 @@ -90,17 +90,17 @@ theorem absoluteValueExtension_localizationTensorHom_surjective (vK : AbsoluteValue K ℝ) (hvK : vK.IsNontrivial) (w : AbsoluteValueExtension vK L) : letI := AbsoluteValue.completionAlgebra vK w.1 w.2 - Function.Surjective (absoluteValueExtension_localizationTensorHom vK w) := by + 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 := - absoluteValueExtension_completionNontriviallyNormedField vK hvK + absoluteValueExtensionCompletionNontriviallyNormedField vK hvK let : NormedAlgebra vK.Completion w.1.Completion := - absoluteValueExtension_completionNormedAlgebra vK w + absoluteValueExtensionCompletionNormedAlgebra vK w let : Module.Finite vK.Completion (vK.Completion ⊗[K] L) := inferInstance - let f := absoluteValueExtension_localizationTensorHom vK w + 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) := @@ -197,7 +197,7 @@ theorem localizedCompletionModuleFinite (vK.Completion ⊗[K] L) := inferInstance let f := - absoluteValueExtension_localizationTensorHom vK w + absoluteValueExtensionLocalizationTensorHom vK w let : Module.Finite vK.Completion w.1.Completion := Module.Finite.of_surjective f.toLinearMap diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean index 875683413e..f96fc68633 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean @@ -34,22 +34,22 @@ universe u v /-- The primitive power basis used in the separable proof of the completion tensor-product decomposition. -/ -noncomputable def completionTensorDecomposition_powerBasis +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 completionTensorDecomposition_extensionFintype +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 := completionTensorDecomposition_powerBasis K L + let pb := completionTensorDecompositionPowerBasis K L let hf : Irreducible (minpoly K pb.gen) := minpoly.irreducible pb.isIntegral_gen - let e := completionExtensionFactor_extensionEquivFactors vK hvK hf + let e := completionExtensionFactorExtensionEquivFactors vK hvK hf (minpoly.aeval K pb.gen) pb.adjoin_gen_eq_top exact Fintype.ofEquiv _ e.symm @@ -59,19 +59,19 @@ 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - (minpoly K (completionTensorDecomposition_powerBasis K L).gen).map + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK + (minpoly K (completionTensorDecompositionPowerBasis K L).gen).map (algebraMap K vK.Completion) = ∏ w : AbsoluteValueExtension vK L, - completionExtensionFactor_extensionFactor vK - (completionTensorDecomposition_powerBasis K L).gen w := by + completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w := by classical - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - let pb := completionTensorDecomposition_powerBasis K L + 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 := completionExtensionFactor_extensionEquivFactors vK hvK hf + 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) @@ -83,7 +83,7 @@ theorem completionTensorDecomposition_mapped_minpoly_eq_prod_extensionFactors (g.1 : vK.Completion[X]) := separable_monic_eq_prod_distinctNormalizedFactors p hpmonic hpsep _ = ∏ w : AbsoluteValueExtension vK L, - completionExtensionFactor_extensionFactor vK pb.gen w := by + completionExtensionFactorExtensionFactor vK pb.gen w := by symm exact Fintype.prod_equiv e _ _ (fun _ ↦ rfl) @@ -92,19 +92,19 @@ 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 := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK + letI := completionTensorDecompositionExtensionFintype (K := K) (L := L) vK hvK ∀ w w' : AbsoluteValueExtension vK L, w ≠ w' → IsCoprime - (completionExtensionFactor_extensionFactor vK - (completionTensorDecomposition_powerBasis K L).gen w) - (completionExtensionFactor_extensionFactor vK - (completionTensorDecomposition_powerBasis K L).gen w') := by + (completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w) + (completionExtensionFactorExtensionFactor vK + (completionTensorDecompositionPowerBasis K L).gen w') := by classical - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - let pb := completionTensorDecomposition_powerBasis K L + 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 := completionExtensionFactor_extensionEquivFactors vK hvK hf + 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) @@ -114,7 +114,7 @@ theorem completionTensorDecomposition_extensionFactors_pairwise_coprime /-- The factorization/CRT equivalence in the left tensor order `K_v ⊗_K L`. -/ -noncomputable def completionTensorDecomposition_factorEquiv +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) : @@ -124,8 +124,8 @@ noncomputable def completionTensorDecomposition_factorEquiv vK.Completion ⊗[K] L ≃ₐ[vK.Completion] ∀ w : AbsoluteValueExtension vK L, w.1.Completion := by classical - letI := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - let pb := completionTensorDecomposition_powerBasis K L + 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, @@ -142,11 +142,11 @@ noncomputable def completionTensorDecomposition_factorEquiv let econgr := AdjoinRoot.algEquivOfEq vK.Completion _ _ hprod let ecrt := adjoinRootProdEquivPi (fun w : AbsoluteValueExtension vK L ↦ - completionExtensionFactor_extensionFactor vK pb.gen w) + completionExtensionFactorExtensionFactor vK pb.gen w) (completionTensorDecomposition_extensionFactors_pairwise_coprime (K := K) (L := L) vK hvK) let elocal := AlgEquiv.piCongrRight fun w ↦ - completionExtensionFactor_adjoinRootEquivCompletion + completionExtensionFactorAdjoinRootEquivCompletion vK hvK pb.gen hα hgen w exact ebase.trans (econgr.trans (ecrt.trans elocal)) @@ -161,13 +161,13 @@ theorem completionTensorDecomposition_factorEquiv_one_tmul_gen letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK - (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis K L).gen) w = + completionTensorDecompositionFactorEquiv (K := K) (L := L) vK hvK + (1 ⊗ₜ[K] (completionTensorDecompositionPowerBasis K L).gen) w = AbsoluteValue.toCompletionAlgHom (K := K) w.1 - (completionTensorDecomposition_powerBasis K L).gen := by + (completionTensorDecompositionPowerBasis K L).gen := by classical - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - let pb := completionTensorDecomposition_powerBasis K L + 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 @@ -177,7 +177,7 @@ theorem completionTensorDecomposition_factorEquiv_one_tmul_gen Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 let factors := fun w : AbsoluteValueExtension vK L ↦ - completionExtensionFactor_extensionFactor vK pb.gen w + completionExtensionFactorExtensionFactor vK pb.gen w let hcop := completionTensorDecomposition_extensionFactors_pairwise_coprime (K := K) (L := L) vK hvK let ebase := baseChangeEquivAdjoinRoot (A := vK.Completion) pb @@ -186,13 +186,13 @@ theorem completionTensorDecomposition_factorEquiv_one_tmul_gen let econgr := AdjoinRoot.algEquivOfEq vK.Completion _ _ hprod let ecrt := adjoinRootProdEquivPi factors hcop let elocal := AlgEquiv.piCongrRight fun w ↦ - completionExtensionFactor_adjoinRootEquivCompletion + 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 - (completionExtensionFactor_adjoinRootEquivCompletion + (completionExtensionFactorAdjoinRootEquivCompletion vK hvK pb.gen pb.isIntegral_gen pb.adjoin_gen_eq_top w) (adjoinRootProdEquivPi factors hcop (AdjoinRoot.mk (∏ w, factors w) X) w) = _ @@ -209,11 +209,11 @@ theorem completionTensorDecomposition_factorEquiv_toAlgHom letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - (completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK).toAlgHom = - completionTensorMap_leftCanonicalHom vK := by + (completionTensorDecompositionFactorEquiv (K := K) (L := L) vK hvK).toAlgHom = + completionTensorMapLeftCanonicalHom vK := by classical - let := completionTensorDecomposition_extensionFintype (K := K) (L := L) vK hvK - let pb := completionTensorDecomposition_powerBasis K L + 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 @@ -225,10 +225,10 @@ theorem completionTensorDecomposition_factorEquiv_toAlgHom apply (powerBasisBaseChange (A := vK.Completion) pb).algHom_ext funext w change - completionTensorDecomposition_factorEquiv (K := K) (L := L) vK hvK - (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis K L).gen) w = - completionTensorMap_leftCanonicalHom (K := K) (L := L) vK - (1 ⊗ₜ[K] (completionTensorDecomposition_powerBasis K L).gen) w + 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] @@ -243,19 +243,20 @@ theorem completionTensorDecomposition_leftCanonicalHom_bijective Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 Function.Bijective - (completionTensorMap_leftCanonicalHom (K := K) (L := L) vK) := by + (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 (completionTensorDecomposition_factorEquiv + 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 completionTensorDecomposition_left +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) : @@ -268,7 +269,7 @@ noncomputable def completionTensorDecomposition_left Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 exact AlgEquiv.ofBijective - (completionTensorMap_leftCanonicalHom (K := K) (L := L) vK) + (completionTensorMapLeftCanonicalHom (K := K) (L := L) vK) (completionTensorDecomposition_leftCanonicalHom_bijective (K := K) (L := L) vK hvK) @@ -282,13 +283,13 @@ theorem completionTensorDecomposition_left_tmul_apply letI : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - completionTensorDecomposition_left (K := K) (L := L) vK hvK (b ⊗ₜ[K] a) w = + 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 completionTensorMap_leftCanonicalHom (K := K) (L := L) vK + change completionTensorMapLeftCanonicalHom (K := K) (L := L) vK (b ⊗ₜ[K] a) w = _ exact completionTensorMap_leftCanonicalHom_tmul_apply vK b a w @@ -303,14 +304,14 @@ theorem completionTensorDecomposition_canonicalHom_bijective Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 Function.Bijective - (completionTensorMap_canonicalHom (K := K) (L := L) vK) := by + (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 := completionTensorMap_leftCanonicalHom (K := K) (L := L) vK + 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 @@ -335,7 +336,7 @@ noncomputable def completionTensorDecomposition Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 exact AlgEquiv.ofBijective - (completionTensorMap_canonicalHom (K := K) (L := L) vK) + (completionTensorMapCanonicalHom (K := K) (L := L) vK) (completionTensorDecomposition_canonicalHom_bijective (K := K) (L := L) vK hvK) @@ -351,7 +352,7 @@ theorem completionTensorDecomposition_toAlgHom Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 (completionTensorDecomposition (K := K) (L := L) vK hvK).toAlgHom = - completionTensorMap_canonicalHom vK := by + completionTensorMapCanonicalHom vK := by let := Algebra.TensorProduct.rightAlgebra (R := K) (A := L) (B := vK.Completion) let : ∀ w : AbsoluteValueExtension vK L, @@ -379,7 +380,7 @@ theorem completionTensorDecomposition_tmul_apply let : ∀ w : AbsoluteValueExtension vK L, Algebra vK.Completion w.1.Completion := fun w ↦ AbsoluteValue.completionAlgebra vK w.1 w.2 - change completionTensorMap_canonicalHom (K := K) (L := L) vK + change completionTensorMapCanonicalHom (K := K) (L := L) vK (a ⊗ₜ[K] b) w = _ exact completionTensorMap_canonicalHom_tmul_apply vK a b w @@ -400,7 +401,7 @@ noncomputable def localTensorUnitsEquivCompletionProduct fun w' ↦ AbsoluteValue.completionAlgebra vK w'.1 w'.2 exact (Units.mapEquiv - (completionTensorDecomposition_left + (completionTensorDecompositionLeft (K := K) (L := L) vK hvK).toMulEquiv).trans MulEquiv.piUnits @@ -418,7 +419,7 @@ theorem localTensorUnitsEquivCompletionProduct_apply_coe fun u ↦ AbsoluteValue.completionAlgebra vK u.1 u.2 (((localTensorUnitsEquivCompletionProduct vK hvK z) w' : w'.1.Completionˣ) : w'.1.Completion) = - completionTensorDecomposition_left (K := K) (L := L) vK hvK + completionTensorDecompositionLeft (K := K) (L := L) vK hvK (z : vK.Completion ⊗[K] L) w' := rfl diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean index 9ff5721217..c3098c1631 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean @@ -30,7 +30,7 @@ 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] - [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)] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean index c21109db59..5085b86652 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean @@ -10,7 +10,8 @@ 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 +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean index 1d374b3453..cefd3d17f2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean @@ -463,7 +463,7 @@ omit [FiniteDimensional K L] in omit [FiniteDimensional K L] in /-- The residue-field equivalence sends a source residue to the corresponding target residue. -/ -@[simp] theorem residueFieldEquivOfSurjective_apply_residue +theorem residueFieldEquivOfSurjective_apply_residue (hSurj : Function.Surjective (residueMap base target)) (a : base.valuationSubring) : residueFieldEquivOfSurjective base target hSurj (base.residueMap a) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index 7c5a1aca54..92dc72661e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -6,7 +6,8 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness -/-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension` Lean module. -/ +/-! Provides the public declarations in the + `ValuationTheory.DiscreteValuationField.FiniteExtension` Lean module. -/ namespace ValuationTheory @@ -311,7 +312,8 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv 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) + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + base target) hval (by let B := @@ -402,7 +404,8 @@ theorem IntegralClosureFiber.unique_of_includeRight_surjective_henselianRing_ker /-- 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 +theorem + hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_includeRight_henselianRing_ker [Algebra.IsSeparable K L] [HenselianRing (integralClosureIntegers base target) @@ -598,7 +601,7 @@ base valuation ring, any two such valuation subrings coincide. This is the packaging either side as a target `HenselianDVF`. -/ theorem valuationSubring_eq_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], diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index bddbeaf76e..f6be3831ad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -5,7 +5,8 @@ Authors: n-yamaguchi-0729 -/ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree -/-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension.Uniqueness` Lean module. -/ +/-! Provides the public declarations in the + `ValuationTheory.DiscreteValuationField.FiniteExtension.Uniqueness` Lean module. -/ namespace ValuationTheory @@ -363,7 +364,8 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv 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) + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_primes_over_base_maximal + base target) hval (by let B := @@ -554,7 +556,8 @@ 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 +theorem + hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_includeRight_henselianRing_ker [Algebra.IsSeparable K L] [HenselianRing (integralClosureIntegers base target) @@ -634,7 +637,7 @@ theorem henselian_hasUniqueValuationExtension_of_finite_separable closure of the base valuation ring is itself a valuation ring. -/ theorem integralClosure_mem_or_inv_of_finite_separable (target : CompleteDVF.{w, x} L) - [base.valuation.HasExtension target.valuation] + [Algebra.IsSeparable K L] : ∀ z : L, z ∈ (integralClosure base.valuationSubring L).toSubring ∨ @@ -684,7 +687,8 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte (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) + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_eq_maximalIdeal + base target) hval ?_ ?_ · let B := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv @@ -736,7 +740,8 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini (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) + (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_integral_inclusion base + target) hval ?_ ?_ · let B := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv @@ -1129,7 +1134,7 @@ actual integral closure of the base valuation ring in `L`. -/ theorem target_valuationSubring_isIntegralClosure_of_finite_separable [Algebra.IsSeparable K L] - [IsScalarTower base.valuationSubring target.valuationSubring L] : + : IsIntegralClosure target.valuationSubring base.valuationSubring L := by let hval := (integralClosure_mem_or_inv_of_finite_separable base target) let B := @@ -1218,7 +1223,8 @@ 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 + (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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean index c7cddf5e76..6ec06df702 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean @@ -293,7 +293,7 @@ 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) - [Algebra.IsSeparable K L] : + : base.maximalIdeal.map (algebraMap base.valuationSubring (integralClosure base.valuationSubring L)) ≠ ⊥ := by @@ -309,7 +309,7 @@ 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) - [Algebra.IsSeparable K L] : + : ¬ IsField (integralClosure base.valuationSubring L) := by let B := integralClosure base.valuationSubring L let : Algebra.IsIntegral base.valuationSubring B := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean index 659c2e0be4..c354fe67f9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -627,7 +627,7 @@ 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] - [IsScalarTower base.toDVF.valuationSubring target.toDVF.valuationSubring L] + [IsIntegralClosure target.toDVF.valuationSubring base.toDVF.valuationSubring L] : ∀ z : L, z ∈ (integralClosure base.toDVF.valuationSubring L).toSubring ∨ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean index c1d420ffbb..113ec43c33 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean @@ -283,7 +283,6 @@ theorem algEquivOfAlgEquiv_apply_residue /-- The inverse induced residue equivalence sends residues back along the inverse algebra equivalence. -/ -@[simp] theorem algEquivOfAlgEquiv_symm_apply_residue (e : R ≃ₐ[T] S) (x : S) : (algEquivOfAlgEquiv e).symm (IsLocalRing.residue S x) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean index b45d099cbc..47cfe74386 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean @@ -10,7 +10,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Algeb # 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 +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. diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean index f2c203541e..d8657a0cdb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean @@ -24,7 +24,7 @@ namespace Valuations /-- the directed adic Cauchy estimate for a coefficient sequence: later differences from stage `M` lie in `I^(M+1)`. -/ -def henselFactorization_adicCoeffCauchy +def henselFactorizationAdicCoeffCauchy {R : Type*} [CommRing R] (I : Ideal R) (x : ℕ → R) : Prop := ∀ {M N : ℕ}, M ≤ N → x N - x M ∈ I ^ (M + 1) @@ -36,15 +36,15 @@ theorem henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, (Pseq N - Pseq M).coeff i ∈ I ^ (M + 1)) (i : ℕ) : - henselFactorization_adicCoeffCauchy I (fun N : ℕ => (Pseq N).coeff i) := by + henselFactorizationAdicCoeffCauchy I (fun N : ℕ => (Pseq N).coeff i) := by intro M N hMN - simpa [henselFactorization_adicCoeffCauchy, Polynomial.coeff_sub] using hsub hMN i + 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 : henselFactorization_adicCoeffCauchy I x) : + (hx : henselFactorizationAdicCoeffCauchy I x) : AdicCompletion.IsAdicCauchy I R x := by intro M N hMN apply SModEq.sub_mem.mpr @@ -59,7 +59,7 @@ coefficient sequence satisfying the directed estimate. -/ theorem henselFactorization_exists_adicCoeffLimit {R : Type*} [CommRing R] (I : Ideal R) [IsPrecomplete I R] {x : ℕ → R} - (hx : henselFactorization_adicCoeffCauchy I x) : + (hx : henselFactorizationAdicCoeffCauchy I x) : ∃ L : R, ∀ n : ℕ, x n - L ∈ I ^ n := by obtain ⟨L, hL⟩ := IsPrecomplete.prec (show IsPrecomplete I R from inferInstance) @@ -70,7 +70,7 @@ theorem henselFactorization_exists_adicCoeffLimit /-- assemble finitely many coefficient limits into the polynomial supported in degrees at most `N`. -/ -def henselFactorization_polyOfLimitCoeffs +def henselFactorizationPolyOfLimitCoeffs {R : Type*} [Semiring R] (N : ℕ) (c : ℕ → R) : R[X] := Finset.sum (Finset.range (N + 1)) fun i => Polynomial.monomial i (c i) @@ -78,9 +78,9 @@ def henselFactorization_polyOfLimitCoeffs coefficient limits, inside the cutoff. -/ theorem henselFactorization_polyOfLimitCoeffs_coeff_of_le {R : Type*} [Semiring R] {N n : ℕ} (c : ℕ → R) (hn : n ≤ N) : - (henselFactorization_polyOfLimitCoeffs N c).coeff n = c n := by + (henselFactorizationPolyOfLimitCoeffs N c).coeff n = c n := by classical - unfold henselFactorization_polyOfLimitCoeffs + unfold henselFactorizationPolyOfLimitCoeffs rw [Polynomial.finsetSum_coeff] rw [Finset.sum_eq_single n] · simp @@ -93,9 +93,9 @@ theorem henselFactorization_polyOfLimitCoeffs_coeff_of_le 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) : - (henselFactorization_polyOfLimitCoeffs N c).coeff n = 0 := by + (henselFactorizationPolyOfLimitCoeffs N c).coeff n = 0 := by classical - unfold henselFactorization_polyOfLimitCoeffs + unfold henselFactorizationPolyOfLimitCoeffs rw [Polynomial.finsetSum_coeff] refine Finset.sum_eq_zero ?_ intro b hb @@ -109,7 +109,7 @@ theorem henselFactorization_polyOfLimitCoeffs_coeff_eq_zero_of_lt limits has the stated degree bound. -/ theorem henselFactorization_polyOfLimitCoeffs_natDegree_le {R : Type*} [Semiring R] (N : ℕ) (c : ℕ → R) : - (henselFactorization_polyOfLimitCoeffs N c).natDegree ≤ N := by + (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 @@ -121,7 +121,7 @@ theorem henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits {N : ℕ} {Pseq : ℕ → R[X]} (hdeg : ∀ n : ℕ, (Pseq n).natDegree ≤ N) (hcauchy : - ∀ i : ℕ, henselFactorization_adicCoeffCauchy I + ∀ 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 @@ -130,7 +130,7 @@ theorem henselFactorization_exists_limitPolynomial_of_bounded_coeffLimits fun i => Classical.choose (henselFactorization_exists_adicCoeffLimit (I := I) (hcauchy i)) - let P : R[X] := henselFactorization_polyOfLimitCoeffs N L + let P : R[X] := henselFactorizationPolyOfLimitCoeffs N L refine ⟨P, henselFactorization_polyOfLimitCoeffs_natDegree_le N L, ?_⟩ intro n i by_cases hi : i ≤ N diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean index 7e3e96dbf4..08858121bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean @@ -51,7 +51,7 @@ theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuatio (IsLocalRing.residue R) IsLocalRing.residue_surjective hcop hg0map hh0map with ⟨a, b, hbez⟩ - let S := henselFactorization_twoPolynomialCoeffFinset + 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 @@ -69,7 +69,7 @@ theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuatio hf hg0map hh0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd · have hSempty : - henselFactorization_twoPolynomialCoeffFinset + henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1) = ∅ := by apply Finset.eq_empty_iff_forall_notMem.mpr intro x hx @@ -112,7 +112,7 @@ theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuatio (IsLocalRing.residue R) IsLocalRing.residue_surjective hcop hg0map hh0map with ⟨a, b, hbez⟩ - let S := henselFactorization_twoPolynomialCoeffFinset + 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 @@ -134,7 +134,7 @@ theorem henselFactorization_exists_limit_factorization_of_coprime_lifts_valuatio hf hg0map hh0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd · have hSempty : - henselFactorization_twoPolynomialCoeffFinset + henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1) = ∅ := by apply Finset.eq_empty_iff_forall_notMem.mpr intro x hx diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean index f5012b8fac..9f94738b2b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean @@ -59,7 +59,7 @@ theorem henselFactorization_exists_mem_finset_dvd_all /-- the finite set of coefficients of two polynomials from which the construction chooses the minimum-value coefficient. -/ -def henselFactorization_twoPolynomialCoeffFinset +def henselFactorizationTwoPolynomialCoeffFinset {R : Type*} [Semiring R] (P Q : R[X]) : Finset R := by classical exact P.support.image (fun n => P.coeff n) ∪ @@ -70,9 +70,9 @@ coefficient set. -/ theorem henselFactorization_mem_twoPolynomialCoeffFinset_left {R : Type*} [Semiring R] {P Q : R[X]} {n : ℕ} (hn : n ∈ P.support) : - P.coeff n ∈ henselFactorization_twoPolynomialCoeffFinset P Q := by + P.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := by classical - unfold henselFactorization_twoPolynomialCoeffFinset + unfold henselFactorizationTwoPolynomialCoeffFinset exact Finset.mem_union.mpr (Or.inl (Finset.mem_image.mpr ⟨n, hn, rfl⟩)) @@ -81,9 +81,9 @@ 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 ∈ henselFactorization_twoPolynomialCoeffFinset P Q := by + Q.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := by classical - unfold henselFactorization_twoPolynomialCoeffFinset + unfold henselFactorizationTwoPolynomialCoeffFinset exact Finset.mem_union.mpr (Or.inr (Finset.mem_image.mpr ⟨n, hn, rfl⟩)) @@ -91,10 +91,10 @@ theorem henselFactorization_mem_twoPolynomialCoeffFinset_right nonzero coefficient. -/ theorem henselFactorization_ne_zero_of_mem_twoPolynomialCoeffFinset {R : Type*} [Semiring R] {P Q : R[X]} {x : R} - (hx : x ∈ henselFactorization_twoPolynomialCoeffFinset P Q) : + (hx : x ∈ henselFactorizationTwoPolynomialCoeffFinset P Q) : x ≠ 0 := by classical - unfold henselFactorization_twoPolynomialCoeffFinset at hx + 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⟩ @@ -106,13 +106,13 @@ theorem henselFactorization_ne_zero_of_mem_twoPolynomialCoeffFinset 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 : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : - ∃ π ∈ henselFactorization_twoPolynomialCoeffFinset P Q, + (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 := henselFactorization_twoPolynomialCoeffFinset P Q) hs with + (R := R) (s := henselFactorizationTwoPolynomialCoeffFinset P Q) hs with ⟨π, hπ, hπall⟩ refine ⟨π, hπ, ?_, ?_⟩ · intro n @@ -137,9 +137,9 @@ theorem henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials {P Q : R[X]} (hP : ∀ n : ℕ, P.coeff n ∈ I) (hQ : ∀ n : ℕ, Q.coeff n ∈ I) - (hs : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : + (hs : (henselFactorizationTwoPolynomialCoeffFinset P Q).Nonempty) : ∃ π ∈ I, - π ∈ henselFactorization_twoPolynomialCoeffFinset P Q ∧ + π ∈ henselFactorizationTwoPolynomialCoeffFinset P Q ∧ (∀ n : ℕ, π ∣ P.coeff n) ∧ (∀ n : ℕ, π ∣ Q.coeff n) := by classical @@ -147,7 +147,7 @@ theorem henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials (R := R) (P := P) (Q := Q) hs with ⟨π, hπcoeff, hπP, hπQ⟩ have hπI : π ∈ I := by - unfold henselFactorization_twoPolynomialCoeffFinset at hπcoeff + 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π⟩ @@ -167,9 +167,9 @@ theorem henselFactorization_exists_coeff_mem_ideal_minimum_factor_two_polynomial {P Q : R[X]} (hP : ∀ n : ℕ, P.coeff n ∈ I) (hQ : ∀ n : ℕ, Q.coeff n ∈ I) - (hs : (henselFactorization_twoPolynomialCoeffFinset P Q).Nonempty) : + (hs : (henselFactorizationTwoPolynomialCoeffFinset P Q).Nonempty) : ∃ π ∈ I, - π ∈ henselFactorization_twoPolynomialCoeffFinset P Q ∧ + π ∈ henselFactorizationTwoPolynomialCoeffFinset P Q ∧ (∃ P' : R[X], P = Polynomial.C π * P') ∧ (∃ Q' : R[X], Q = Polynomial.C π * Q') := by classical @@ -200,10 +200,10 @@ theorem henselFactorization_exists_pi_factor_initial_errors_of_nonempty (hbezerr : ∀ n : ℕ, (a * g0 + b * h0 - 1).coeff n ∈ IsLocalRing.maximalIdeal R) (hs : - (henselFactorization_twoPolynomialCoeffFinset + (henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : ∃ π ∈ IsLocalRing.maximalIdeal R, - π ∈ henselFactorization_twoPolynomialCoeffFinset + π ∈ henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1) ∧ (∃ f1 : R[X], f - g0 * h0 = Polynomial.C π * f1) ∧ (∃ e1 : R[X], @@ -226,10 +226,10 @@ theorem henselFactorization_exists_pi_factor_initial_errors_of_residue_lifts_of_ (hh0 : h0.map (IsLocalRing.residue R) = hbar) (hbez : (a * g0 + b * h0).map (IsLocalRing.residue R) = 1) (hs : - (henselFactorization_twoPolynomialCoeffFinset + (henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1)).Nonempty) : ∃ π ∈ IsLocalRing.maximalIdeal R, - π ∈ henselFactorization_twoPolynomialCoeffFinset + π ∈ henselFactorizationTwoPolynomialCoeffFinset (f - g0 * h0) (a * g0 + b * h0 - 1) ∧ (∃ f1 : R[X], f - g0 * h0 = Polynomial.C π * f1) ∧ (∃ e1 : R[X], @@ -245,12 +245,12 @@ theorem henselFactorization_exists_pi_factor_initial_errors_of_residue_lifts_of_ polynomial is zero. -/ theorem henselFactorization_left_eq_zero_of_twoPolynomialCoeffFinset_empty {R : Type*} [Semiring R] {P Q : R[X]} - (h : henselFactorization_twoPolynomialCoeffFinset P Q = ∅) : + (h : henselFactorizationTwoPolynomialCoeffFinset P Q = ∅) : P = 0 := by ext n by_cases hn : n ∈ P.support · have hmem : - P.coeff n ∈ henselFactorization_twoPolynomialCoeffFinset P Q := + P.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := henselFactorization_mem_twoPolynomialCoeffFinset_left (P := P) (Q := Q) hn rw [h] at hmem @@ -261,12 +261,12 @@ theorem henselFactorization_left_eq_zero_of_twoPolynomialCoeffFinset_empty polynomial is zero. -/ theorem henselFactorization_right_eq_zero_of_twoPolynomialCoeffFinset_empty {R : Type*} [Semiring R] {P Q : R[X]} - (h : henselFactorization_twoPolynomialCoeffFinset P Q = ∅) : + (h : henselFactorizationTwoPolynomialCoeffFinset P Q = ∅) : Q = 0 := by ext n by_cases hn : n ∈ Q.support · have hmem : - Q.coeff n ∈ henselFactorization_twoPolynomialCoeffFinset P Q := + Q.coeff n ∈ henselFactorizationTwoPolynomialCoeffFinset P Q := henselFactorization_mem_twoPolynomialCoeffFinset_right (P := P) (Q := Q) hn rw [h] at hmem @@ -277,7 +277,7 @@ theorem henselFactorization_right_eq_zero_of_twoPolynomialCoeffFinset_empty where both source polynomials are zero. -/ theorem henselFactorization_twoPolynomialCoeffFinset_empty_iff {R : Type*} [Semiring R] {P Q : R[X]} : - henselFactorization_twoPolynomialCoeffFinset P Q = ∅ ↔ P = 0 ∧ Q = 0 := by + henselFactorizationTwoPolynomialCoeffFinset P Q = ∅ ↔ P = 0 ∧ Q = 0 := by classical constructor · intro h @@ -287,7 +287,7 @@ theorem henselFactorization_twoPolynomialCoeffFinset_empty_iff henselFactorization_right_eq_zero_of_twoPolynomialCoeffFinset_empty (P := P) (Q := Q) h⟩ · rintro ⟨rfl, rfl⟩ - unfold henselFactorization_twoPolynomialCoeffFinset + unfold henselFactorizationTwoPolynomialCoeffFinset simp end Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean index adcd797397..d4208b624d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean @@ -42,59 +42,59 @@ theorem henselFactorization_extend_finite_prefix_one_step_of_mem_span (hprefix : ∀ r : ℕ, r ≤ n → ∃ fr : R[X], - f - henselFactorization_henselIterate π g0 pCorr r * - henselFactorization_henselIterate π h0 qCorr r = + f - henselFactorizationHenselIterate π g0 pCorr r * + henselFactorizationHenselIterate π h0 qCorr r = Polynomial.C (π ^ (r + 1)) * fr) {fn : R[X]} (hfactor : - f - henselFactorization_henselIterate π g0 pCorr n * - henselFactorization_henselIterate π h0 qCorr n = + f - henselFactorizationHenselIterate π g0 pCorr n * + henselFactorizationHenselIterate π h0 qCorr n = Polynomial.C (π ^ (n + 1)) * fn) - (hgDeg : (henselFactorization_henselIterate π g0 pCorr n).natDegree ≤ m) - (hhDeg : (henselFactorization_henselIterate π h0 qCorr n).natDegree ≤ d - m) : + (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 - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) r * - henselFactorization_henselIterate π h0 + henselFactorizationHenselIterate π h0 (Function.update qCorr (n + 1) q) r = Polynomial.C (π ^ (r + 1)) * fr) ∧ - f - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) (n + 1) * - henselFactorization_henselIterate π h0 + henselFactorizationHenselIterate π h0 (Function.update qCorr (n + 1) q) (n + 1) = Polynomial.C (π ^ (n + 2)) * fnNext ∧ - (henselFactorization_henselIterate π g0 + (henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) (n + 1)).natDegree ≤ m ∧ - (henselFactorization_henselIterate π h0 + (henselFactorizationHenselIterate π h0 (Function.update qCorr (n + 1) q) (n + 1)).natDegree ≤ d - m ∧ (∀ i : ℕ, - (henselFactorization_henselIterate π g0 + (henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) (n + 1) - g0).coeff i ∈ IsLocalRing.maximalIdeal R) ∧ (∀ i : ℕ, - (henselFactorization_henselIterate π h0 + (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 : ℕ, - (henselFactorization_henselIterate π g0 pCorr n - g0).coeff i ∈ + (henselFactorizationHenselIterate π g0 pCorr n - g0).coeff i ∈ Ideal.span ({π} : Set R) := henselFactorization_henselIterate_span_singleton (π := π) g0 pCorr n have hhSpan : ∀ i : ℕ, - (henselFactorization_henselIterate π h0 qCorr n - h0).coeff 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 := henselFactorization_henselIterate π g0 pCorr n) - (h := henselFactorization_henselIterate π h0 qCorr n) + (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 @@ -102,9 +102,9 @@ theorem henselFactorization_extend_finite_prefix_one_step_of_mem_span ⟨p, q, fnNext, hpDeg, hqDeg, hgNextDeg, hhNextDeg, _hgNextSpan, _hhNextSpan, hgNextRed, hhNextRed, hfactorNextRaw⟩ have hfactorNext : - f - (henselFactorization_henselIterate π g0 pCorr n + + f - (henselFactorizationHenselIterate π g0 pCorr n + Polynomial.C (π ^ (n + 1)) * p) * - (henselFactorization_henselIterate π h0 qCorr n + + (henselFactorizationHenselIterate π h0 qCorr n + Polynomial.C (π ^ (n + 1)) * q) = Polynomial.C (π ^ (n + 2)) * fnNext := by simpa [Nat.add_assoc] using hfactorNextRaw diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean index f67abe609f..f44927261c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean @@ -36,8 +36,8 @@ structure HenselFactorizationFinitePrefixState prefixFactor : ∀ r : ℕ, r ≤ N → ∃ fr : R[X], - f - henselFactorization_henselIterate π g0 pCorr r * - henselFactorization_henselIterate π h0 qCorr r = + 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 @@ -45,27 +45,27 @@ structure HenselFactorizationFinitePrefixState qCorrDeg : ∀ r : ℕ, (qCorr r).natDegree ≤ d - m /-- At stage `N`, the factorization error is `π ^ (N + 1)` times `fErr`. -/ factor : - f - henselFactorization_henselIterate π g0 pCorr N * - henselFactorization_henselIterate π h0 qCorr N = + 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 : (henselFactorization_henselIterate π g0 pCorr N).natDegree ≤ m + gDeg : (henselFactorizationHenselIterate π g0 pCorr N).natDegree ≤ m /-- The second approximate factor at stage `N` has degree at most `d - m`. -/ - hDeg : (henselFactorization_henselIterate π h0 qCorr N).natDegree ≤ d - m + hDeg : (henselFactorizationHenselIterate π h0 qCorr N).natDegree ≤ d - m /-- The first approximate factor remains congruent to `g0` modulo the maximal ideal. -/ gRed : ∀ i : ℕ, - (henselFactorization_henselIterate π g0 pCorr N - g0).coeff 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 : ℕ, - (henselFactorization_henselIterate π h0 qCorr N - h0).coeff 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 henselFactorization_initialPrefixState_of_factor +def henselFactorizationInitialPrefixStateOfFactor {R : Type*} [CommRing R] [IsLocalRing R] {π : R} {f g0 h0 f1 : R[X]} {m d : ℕ} (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) @@ -102,7 +102,7 @@ def henselFactorization_initialPrefixState_of_factor /-- Choose an extension of a prefix state by one Hensel correction in the displayed-factor form. -/ -def henselFactorization_chosenNextPrefixState_of_mem_span +def henselFactorizationChosenNextPrefixStateOfMemSpan {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] {π : R} (hπne : π ≠ 0) (hπmem : π ∈ IsLocalRing.maximalIdeal R) @@ -136,34 +136,34 @@ def henselFactorization_chosenNextPrefixState_of_mem_span have hprefixOld : ∀ r : ℕ, r ≤ N → ∃ fr : R[X], - f - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update s.pCorr (N + 1) p) r * - henselFactorization_henselIterate π h0 + henselFactorizationHenselIterate π h0 (Function.update s.qCorr (N + 1) q) r = Polynomial.C (π ^ (r + 1)) * fr := hspec.2.2.1 have hfactorNext : - f - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update s.pCorr (N + 1) p) (N + 1) * - henselFactorization_henselIterate π h0 + henselFactorizationHenselIterate π h0 (Function.update s.qCorr (N + 1) q) (N + 1) = Polynomial.C (π ^ (N + 2)) * fnNext := hspec.2.2.2.1 have hgNextDeg : - (henselFactorization_henselIterate π g0 + (henselFactorizationHenselIterate π g0 (Function.update s.pCorr (N + 1) p) (N + 1)).natDegree ≤ m := hspec.2.2.2.2.1 have hhNextDeg : - (henselFactorization_henselIterate π h0 + (henselFactorizationHenselIterate π h0 (Function.update s.qCorr (N + 1) q) (N + 1)).natDegree ≤ d - m := hspec.2.2.2.2.2.1 have hgNextRed : ∀ i : ℕ, - (henselFactorization_henselIterate π g0 + (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 : ℕ, - (henselFactorization_henselIterate π h0 + (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 @@ -207,13 +207,13 @@ theorem henselFactorization_chosenNextPrefixState_pCorr_of_ne_of_mem_span (hmd : m ≤ d) (s : HenselFactorizationFinitePrefixState π f g0 h0 m d N) (hr : r ≠ N + 1) : - (henselFactorization_chosenNextPrefixState_of_mem_span + (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 henselFactorization_chosenNextPrefixState_of_mem_span + unfold henselFactorizationChosenNextPrefixStateOfMemSpan simp [Function.update_of_ne hr] /-- in the displayed-factor prefix extension the `q` @@ -234,18 +234,18 @@ theorem henselFactorization_chosenNextPrefixState_qCorr_of_ne_of_mem_span (hmd : m ≤ d) (s : HenselFactorizationFinitePrefixState π f g0 h0 m d N) (hr : r ≠ N + 1) : - (henselFactorization_chosenNextPrefixState_of_mem_span + (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 henselFactorization_chosenNextPrefixState_of_mem_span + unfold henselFactorizationChosenNextPrefixStateOfMemSpan simp [Function.update_of_ne hr] /-- recursively chosen compatible finite Hensel prefixes in the displayed-factor displayed-factor form. -/ -def henselFactorization_prefixStateSeq_of_mem_span +def henselFactorizationPrefixStateSeqOfMemSpan {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] {π : R} (hπne : π ≠ 0) (hπmem : π ∈ IsLocalRing.maximalIdeal R) @@ -262,17 +262,17 @@ def henselFactorization_prefixStateSeq_of_mem_span (hmd : m ≤ d) : (N : ℕ) → HenselFactorizationFinitePrefixState π f g0 h0 m d N | 0 => - henselFactorization_initialPrefixState_of_factor + henselFactorizationInitialPrefixStateOfFactor (π := π) (f := f) (g0 := g0) (h0 := h0) (f1 := f1) (m := m) (d := d) hfactor0 hg0nat hh0deg | N + 1 => - henselFactorization_chosenNextPrefixState_of_mem_span + 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 - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -298,13 +298,13 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {M N : ℕ}, M ≤ N → - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -322,19 +322,19 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span rfl · have hMN' : M ≤ N := Nat.lt_succ_iff.mp (lt_of_le_of_ne hMN htop) calc - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - (henselFactorization_prefixStateSeq_of_mem_span + (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 [henselFactorization_prefixStateSeq_of_mem_span] using + simpa [henselFactorizationPrefixStateSeqOfMemSpan] using henselFactorization_chosenNextPrefixState_pCorr_of_ne_of_mem_span (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) @@ -342,7 +342,7 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span (gbar := gbar) (m := m) (d := d) (N := N) (r := M) hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -350,7 +350,7 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_of_le_of_mem_span hfactor0 hbezFactor hmd N) htop _ = - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -376,13 +376,13 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {M N : ℕ}, M ≤ N → - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -400,19 +400,19 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span rfl · have hMN' : M ≤ N := Nat.lt_succ_iff.mp (lt_of_le_of_ne hMN htop) calc - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - (henselFactorization_prefixStateSeq_of_mem_span + (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 [henselFactorization_prefixStateSeq_of_mem_span] using + simpa [henselFactorizationPrefixStateSeqOfMemSpan] using henselFactorization_chosenNextPrefixState_qCorr_of_ne_of_mem_span (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) @@ -420,7 +420,7 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span (gbar := gbar) (m := m) (d := d) (N := N) (r := M) hf hg0map hg0nat hgbar_nat hglead hh0deg hbezFactor hmd - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -428,7 +428,7 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span hfactor0 hbezFactor hmd N) htop _ = - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -437,7 +437,7 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_of_le_of_mem_span /-- the infinite `p`-correction sequence from the displayed-factor displayed-factor prefix construction. -/ -def henselFactorization_infinitePCorr_of_mem_span +def henselFactorizationInfinitePCorrOfMemSpan {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] {π : R} (hπne : π ≠ 0) (hπmem : π ∈ IsLocalRing.maximalIdeal R) @@ -452,7 +452,7 @@ def henselFactorization_infinitePCorr_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (n : ℕ) : R[X] := - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -461,7 +461,7 @@ def henselFactorization_infinitePCorr_of_mem_span /-- the infinite `q`-correction sequence from the displayed-factor displayed-factor prefix construction. -/ -def henselFactorization_infiniteQCorr_of_mem_span +def henselFactorizationInfiniteQCorrOfMemSpan {R : Type*} [CommRing R] [IsLocalRing R] [NoZeroDivisors R] {π : R} (hπne : π ≠ 0) (hπmem : π ∈ IsLocalRing.maximalIdeal R) @@ -476,7 +476,7 @@ def henselFactorization_infiniteQCorr_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (n : ℕ) : R[X] := - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -501,7 +501,7 @@ theorem henselFactorization_infinitePCorr_natDegree_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ n : ℕ, - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -509,9 +509,9 @@ theorem henselFactorization_infinitePCorr_natDegree_le_of_mem_span hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd n).natDegree ≤ m := by intro n - unfold henselFactorization_infinitePCorr_of_mem_span + unfold henselFactorizationInfinitePCorrOfMemSpan exact - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -536,7 +536,7 @@ theorem henselFactorization_infiniteQCorr_natDegree_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ n : ℕ, - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -544,9 +544,9 @@ theorem henselFactorization_infiniteQCorr_natDegree_le_of_mem_span hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd n).natDegree ≤ d - m := by intro n - unfold henselFactorization_infiniteQCorr_of_mem_span + unfold henselFactorizationInfiniteQCorrOfMemSpan exact - (henselFactorization_prefixStateSeq_of_mem_span + (henselFactorizationPrefixStateSeqOfMemSpan (π := π) (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) (gbar := gbar) (m := m) (d := d) @@ -572,13 +572,13 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_infinite_of_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {r N : ℕ}, r ≤ N → - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - henselFactorization_infinitePCorr_of_mem_span + henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -586,7 +586,7 @@ theorem henselFactorization_prefixStateSeq_pCorr_eq_infinite_of_le_of_mem_span hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd r := by intro r N hr - unfold henselFactorization_infinitePCorr_of_mem_span + 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) @@ -613,13 +613,13 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_infinite_of_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {r N : ℕ}, r ≤ N → - (henselFactorization_prefixStateSeq_of_mem_span + (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 = - henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -627,7 +627,7 @@ theorem henselFactorization_prefixStateSeq_qCorr_eq_infinite_of_le_of_mem_span hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd r := by intro r N hr - unfold henselFactorization_infiniteQCorr_of_mem_span + 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) @@ -655,16 +655,16 @@ theorem henselFactorization_infiniteCorr_factor_prefix_of_mem_span (hmd : m ≤ d) : ∀ N : ℕ, ∃ fN : R[X], - f - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + 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 * - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -674,16 +674,16 @@ theorem henselFactorization_infiniteCorr_factor_prefix_of_mem_span Polynomial.C (π ^ (N + 1)) * fN := by intro N let S := - henselFactorization_prefixStateSeq_of_mem_span + 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 : - henselFactorization_henselIterate π g0 S.pCorr N = - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + 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) @@ -701,9 +701,9 @@ theorem henselFactorization_infiniteCorr_factor_prefix_of_mem_span hπne hπmem hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd (r := k) (N := N) hk have hq : - henselFactorization_henselIterate π h0 S.qCorr N = - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + 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) @@ -741,16 +741,16 @@ theorem henselFactorization_infiniteCorr_error_coeff_mem_maximalIdeal_pow_of_mem (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N i : ℕ, - (f - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (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 * - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -788,8 +788,8 @@ theorem henselFactorization_infiniteGIter_natDegree_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N : ℕ, - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -799,7 +799,7 @@ theorem henselFactorization_infiniteGIter_natDegree_le_of_mem_span N).natDegree ≤ m := by exact henselFactorization_henselIterate_natDegree_le (π := π) (F0 := g0) - (corr := henselFactorization_infinitePCorr_of_mem_span + (corr := henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -834,8 +834,8 @@ theorem henselFactorization_infiniteHIter_natDegree_le_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N : ℕ, - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -845,7 +845,7 @@ theorem henselFactorization_infiniteHIter_natDegree_le_of_mem_span N).natDegree ≤ d - m := by exact henselFactorization_henselIterate_natDegree_le (π := π) (F0 := h0) - (corr := henselFactorization_infiniteQCorr_of_mem_span + (corr := henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -880,8 +880,8 @@ theorem henselFactorization_infiniteGIter_reduction_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N i : ℕ, - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -892,7 +892,7 @@ theorem henselFactorization_infiniteGIter_reduction_of_mem_span IsLocalRing.maximalIdeal R := henselFactorization_henselIterate_reduction_of_mem (π := π) hπmem g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -918,8 +918,8 @@ theorem henselFactorization_infiniteHIter_reduction_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N i : ℕ, - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -930,7 +930,7 @@ theorem henselFactorization_infiniteHIter_reduction_of_mem_span IsLocalRing.maximalIdeal R := henselFactorization_henselIterate_reduction_of_mem (π := π) hπmem h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -956,8 +956,8 @@ theorem henselFactorization_infiniteGIter_sub_coeff_mem_maximalIdeal_pow_of_le_o (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -965,8 +965,8 @@ theorem henselFactorization_infiniteGIter_sub_coeff_mem_maximalIdeal_pow_of_le_o hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) N - - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -977,7 +977,7 @@ theorem henselFactorization_infiniteGIter_sub_coeff_mem_maximalIdeal_pow_of_le_o IsLocalRing.maximalIdeal R ^ (M + 1) := henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem (π := π) hπmem g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -1003,8 +1003,8 @@ theorem henselFactorization_infiniteHIter_sub_coeff_mem_maximalIdeal_pow_of_le_o (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ {M N : ℕ}, M ≤ N → ∀ i : ℕ, - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -1012,8 +1012,8 @@ theorem henselFactorization_infiniteHIter_sub_coeff_mem_maximalIdeal_pow_of_le_o hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) N - - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -1024,7 +1024,7 @@ theorem henselFactorization_infiniteHIter_sub_coeff_mem_maximalIdeal_pow_of_le_o IsLocalRing.maximalIdeal R ^ (M + 1) := henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_of_mem (π := π) hπmem h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean index fd4ee96f6a..49af1ec1f5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean @@ -22,25 +22,25 @@ 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 henselFactorization_henselIterate {R : Type*} [CommRing R] +def henselFactorizationHenselIterate {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) : ℕ → R[X] | 0 => F0 | n + 1 => - henselFactorization_henselIterate π F0 corr n + + 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]) : - henselFactorization_henselIterate π F0 corr 0 = F0 := + henselFactorizationHenselIterate π F0 corr 0 = F0 := rfl @[simp] theorem henselFactorization_henselIterate_succ {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) (n : ℕ) : - henselFactorization_henselIterate π F0 corr (n + 1) = - henselFactorization_henselIterate π F0 corr n + + henselFactorizationHenselIterate π F0 corr (n + 1) = + henselFactorizationHenselIterate π F0 corr n + Polynomial.C (π ^ (n + 1)) * corr (n + 1) := rfl @@ -51,7 +51,7 @@ theorem henselFactorization_henselIterate_reduction_of_mem (hπ : π ∈ IsLocalRing.maximalIdeal R) (F0 : R[X]) (corr : ℕ → R[X]) : ∀ n i : ℕ, - (henselFactorization_henselIterate π F0 corr n - F0).coeff i ∈ + (henselFactorizationHenselIterate π F0 corr n - F0).coeff i ∈ IsLocalRing.maximalIdeal R := by intro n induction n with @@ -63,7 +63,7 @@ theorem henselFactorization_henselIterate_reduction_of_mem simpa [henselFactorization_henselIterate_succ] using (henselFactorization_update_preserves_reduction_of_mem (π := π) (n := n + 1) - (g := henselFactorization_henselIterate π F0 corr n) + (g := henselFactorizationHenselIterate π F0 corr n) (g0 := F0) (p := corr (n + 1)) (Nat.succ_pos n) hπ ih i) @@ -74,7 +74,7 @@ theorem henselFactorization_henselIterate_span_singleton {R : Type*} [CommRing R] {π : R} (F0 : R[X]) (corr : ℕ → R[X]) : ∀ n i : ℕ, - (henselFactorization_henselIterate π F0 corr n - F0).coeff i ∈ + (henselFactorizationHenselIterate π F0 corr n - F0).coeff i ∈ Ideal.span ({π} : Set R) := by intro n induction n with @@ -86,7 +86,7 @@ theorem henselFactorization_henselIterate_span_singleton simpa [henselFactorization_henselIterate_succ] using (henselFactorization_update_preserves_span_singleton (π := π) (n := n + 1) - (g := henselFactorization_henselIterate π F0 corr n) + (g := henselFactorizationHenselIterate π F0 corr n) (g0 := F0) (p := corr (n + 1)) (Nat.succ_pos n) ih i) @@ -97,7 +97,7 @@ 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 : ℕ, (henselFactorization_henselIterate π F0 corr n).natDegree ≤ M := by + ∀ n : ℕ, (henselFactorizationHenselIterate π F0 corr n).natDegree ≤ M := by intro n induction n with | zero => @@ -117,8 +117,8 @@ theorem henselFactorization_henselIterate_eq_of_corr_eq_le {corr corr' : ℕ → R[X]} : ∀ n : ℕ, (∀ k : ℕ, k ≤ n → corr k = corr' k) → - henselFactorization_henselIterate π F0 corr n = - henselFactorization_henselIterate π F0 corr' n := by + henselFactorizationHenselIterate π F0 corr n = + henselFactorizationHenselIterate π F0 corr' n := by intro n hcorr induction n with | zero => @@ -127,8 +127,8 @@ theorem henselFactorization_henselIterate_eq_of_corr_eq_le rw [henselFactorization_henselIterate_succ, henselFactorization_henselIterate_succ] have hprev : - henselFactorization_henselIterate π F0 corr n = - henselFactorization_henselIterate π F0 corr' n := + henselFactorizationHenselIterate π F0 corr n = + henselFactorizationHenselIterate π F0 corr' n := ih (by intro k hk exact hcorr k (Nat.le_trans hk (Nat.le_succ n))) @@ -139,8 +139,8 @@ 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) : - henselFactorization_henselIterate π F0 (Function.update corr k c) n = - henselFactorization_henselIterate π F0 corr n := by + henselFactorizationHenselIterate π F0 (Function.update corr k c) n = + henselFactorizationHenselIterate π F0 corr n := by induction n with | zero => rfl @@ -157,9 +157,9 @@ 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]) : - henselFactorization_henselIterate π F0 + henselFactorizationHenselIterate π F0 (Function.update corr (n + 1) c) (n + 1) = - henselFactorization_henselIterate π F0 corr n + + henselFactorizationHenselIterate π F0 corr n + Polynomial.C (π ^ (n + 1)) * c := by rw [henselFactorization_henselIterate_succ] rw [henselFactorization_henselIterate_update_of_lt @@ -173,12 +173,12 @@ theorem henselFactorization_henselIterate_update_preserves_factor_of_le {f g0 h0 : R[X]} (pCorr qCorr : ℕ → R[X]) {n r : ℕ} (hr : r ≤ n) (p q fn : R[X]) (hfactor : - f - henselFactorization_henselIterate π g0 pCorr r * - henselFactorization_henselIterate π h0 qCorr r = + f - henselFactorizationHenselIterate π g0 pCorr r * + henselFactorizationHenselIterate π h0 qCorr r = Polynomial.C (π ^ (r + 1)) * fn) : - f - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) r * - henselFactorization_henselIterate π h0 + 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 @@ -195,14 +195,14 @@ theorem henselFactorization_henselIterate_update_next_factor {f g0 h0 : R[X]} (pCorr qCorr : ℕ → R[X]) (n : ℕ) (p q fnNext : R[X]) (hfactorNext : - f - (henselFactorization_henselIterate π g0 pCorr n + + f - (henselFactorizationHenselIterate π g0 pCorr n + Polynomial.C (π ^ (n + 1)) * p) * - (henselFactorization_henselIterate π h0 qCorr n + + (henselFactorizationHenselIterate π h0 qCorr n + Polynomial.C (π ^ (n + 1)) * q) = Polynomial.C (π ^ (n + 2)) * fnNext) : - f - henselFactorization_henselIterate π g0 + f - henselFactorizationHenselIterate π g0 (Function.update pCorr (n + 1) p) (n + 1) * - henselFactorization_henselIterate π h0 + henselFactorizationHenselIterate π h0 (Function.update qCorr (n + 1) q) (n + 1) = Polynomial.C (π ^ (n + 2)) * fnNext := by rw [henselFactorization_henselIterate_update_next @@ -231,8 +231,8 @@ chosen `π^(n+1)`-multiple. -/ theorem henselFactorization_henselIterate_succ_sub_eq {R : Type*} [CommRing R] (π : R) (F0 : R[X]) (corr : ℕ → R[X]) (n : ℕ) : - henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n = + henselFactorizationHenselIterate π F0 corr (n + 1) - + henselFactorizationHenselIterate π F0 corr n = Polynomial.C (π ^ (n + 1)) * corr (n + 1) := by rw [henselFactorization_henselIterate_succ] ring @@ -242,8 +242,8 @@ 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 : ℕ) : - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n).coeff 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, ?_⟩ @@ -254,8 +254,8 @@ theorem henselFactorization_henselIterate_succ_sub_coeff_mem_span_singleton_pow theorem henselFactorization_henselIterate_succ_sub_coeff_mem_span_pow {R : Type*} [CommRing R] {π : R} (F0 : R[X]) (corr : ℕ → R[X]) (n i : ℕ) : - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n).coeff 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 @@ -267,8 +267,8 @@ theorem henselFactorization_henselIterate_succ_sub_coeff_mem_maximalIdeal_pow_of {R : Type*} [CommRing R] [IsLocalRing R] {π : R} (hπ : π ∈ IsLocalRing.maximalIdeal R) (F0 : R[X]) (corr : ℕ → R[X]) (n i : ℕ) : - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n).coeff 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π @@ -282,8 +282,8 @@ theorem henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_o (hπ : π ∈ IsLocalRing.maximalIdeal R) (F0 : R[X]) (corr : ℕ → R[X]) : ∀ {m n : ℕ}, m ≤ n → ∀ i : ℕ, - (henselFactorization_henselIterate π F0 corr n - - henselFactorization_henselIterate π F0 corr m).coeff 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 @@ -298,19 +298,19 @@ theorem henselFactorization_henselIterate_sub_coeff_mem_maximalIdeal_pow_of_le_o · have hmle : m ≤ n := Nat.lt_succ_iff.mp (lt_of_le_of_ne hmn hm) have hprev := ih hmle i have hincr : - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n).coeff i ∈ + (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 : - henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr m = - (henselFactorization_henselIterate π F0 corr n - - henselFactorization_henselIterate π F0 corr m) + - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n) := by + 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 @@ -321,8 +321,8 @@ 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 : ℕ, - (henselFactorization_henselIterate π F0 corr n - - henselFactorization_henselIterate π F0 corr m).coeff 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 @@ -337,19 +337,19 @@ theorem henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le · have hmle : m ≤ n := Nat.lt_succ_iff.mp (lt_of_le_of_ne hmn hm) have hprev := ih hmle i have hincr : - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n).coeff i ∈ + (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 : - henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr m = - (henselFactorization_henselIterate π F0 corr n - - henselFactorization_henselIterate π F0 corr m) + - (henselFactorization_henselIterate π F0 corr (n + 1) - - henselFactorization_henselIterate π F0 corr n) := by + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean index 78f3fa0ecf..76ae6310e4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean @@ -38,10 +38,10 @@ theorem henselFactorization_infiniteG_coeff_spanAdicCoeffCauchy_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (i : ℕ) : - henselFactorization_adicCoeffCauchy (Ideal.span ({π} : Set R)) + henselFactorizationAdicCoeffCauchy (Ideal.span ({π} : Set R)) (fun N : ℕ => - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -52,8 +52,8 @@ theorem henselFactorization_infiniteG_coeff_spanAdicCoeffCauchy_of_mem_span exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem (Ideal.span ({π} : Set R)) (Pseq := fun N : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -65,7 +65,7 @@ theorem henselFactorization_infiniteG_coeff_spanAdicCoeffCauchy_of_mem_span intro M N hMN i exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le (π := π) g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -95,8 +95,8 @@ theorem henselFactorization_exists_infiniteG_spanLimitPolynomial_of_mem_span (hmd : m ≤ d) : ∃ G : R[X], G.natDegree ≤ m ∧ ∀ n i : ℕ, - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -109,8 +109,8 @@ theorem henselFactorization_exists_infiniteG_spanLimitPolynomial_of_mem_span (Ideal.span ({π} : Set R)) (N := m) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -151,10 +151,10 @@ theorem henselFactorization_infiniteH_coeff_spanAdicCoeffCauchy_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (i : ℕ) : - henselFactorization_adicCoeffCauchy (Ideal.span ({π} : Set R)) + henselFactorizationAdicCoeffCauchy (Ideal.span ({π} : Set R)) (fun N : ℕ => - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -165,8 +165,8 @@ theorem henselFactorization_infiniteH_coeff_spanAdicCoeffCauchy_of_mem_span exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem (Ideal.span ({π} : Set R)) (Pseq := fun N : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -178,7 +178,7 @@ theorem henselFactorization_infiniteH_coeff_spanAdicCoeffCauchy_of_mem_span intro M N hMN i exact henselFactorization_henselIterate_sub_coeff_mem_span_pow_of_le (π := π) h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -208,8 +208,8 @@ theorem henselFactorization_exists_infiniteH_spanLimitPolynomial_of_mem_span (hmd : m ≤ d) : ∃ H : R[X], H.natDegree ≤ d - m ∧ ∀ n i : ℕ, - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -222,8 +222,8 @@ theorem henselFactorization_exists_infiniteH_spanLimitPolynomial_of_mem_span (Ideal.span ({π} : Set R)) (N := d - m) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -265,16 +265,16 @@ theorem henselFactorization_infiniteCorr_error_coeff_mem_span_pow_of_mem_span (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) : ∀ N i : ℕ, - (f - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (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 * - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -339,8 +339,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal apply henselFactorization_limit_factor_eq_of_approximants (I := I) (Gseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -349,8 +349,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal hfactor0 hbezFactor hmd) n) (Hseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -375,8 +375,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal henselFactorization_limit_reduction_of_approx_reduction (I := Ideal.span ({π} : Set R)) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -386,7 +386,7 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal n) (P := G) (P0 := g0) hGlim (henselFactorization_henselIterate_span_singleton g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -397,8 +397,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal henselFactorization_limit_reduction_of_approx_reduction (I := Ideal.span ({π} : Set R)) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -408,7 +408,7 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span_principal n) (P := H) (P0 := h0) hHlim (henselFactorization_henselIterate_span_singleton h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean index 92cc2e8c52..0763f6d38c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean @@ -87,18 +87,18 @@ theorem henselFactorization_one_step_update_from_division_data_of_mem_le (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) (hp : (p.map (IsLocalRing.residue R)).natDegree ≤ m) (hmd : m ≤ d) : - (henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + 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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)) = + 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) @@ -108,12 +108,12 @@ theorem henselFactorization_one_step_update_from_division_data_of_mem_le ⟨hqdeg, hcorrInitial⟩ have hcorrCurrent : ∀ i : ℕ, - (g * henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) + + (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 := henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)) + (q := henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) hg hh hcorrInitial refine ⟨hqdeg, ?_, ?_, ?_⟩ · exact henselFactorization_update_preserves_reduction_of_mem @@ -142,37 +142,37 @@ theorem henselFactorization_one_step_update_from_division_data_of_mem_span (hh0 : h0.natDegree ≤ d - m) (hp : p.natDegree ≤ m) (hmd : m ≤ d) : - (henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + 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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + 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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)) = + 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 * henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) + + (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 := henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)) + (q := henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv)) hg hh hcorrInitial have hgNext : ∀ i : ℕ, @@ -182,7 +182,7 @@ theorem henselFactorization_one_step_update_from_division_data_of_mem_span have hhNext : ∀ i : ℕ, (h + Polynomial.C (π ^ n) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ Ideal.span ({π} : Set R) := henselFactorization_update_preserves_span_singleton (π := π) hn hh have hspan_le : @@ -216,18 +216,18 @@ theorem henselFactorization_one_step_update_from_division_degree_lt_of_mem_le (hfn : (fn.map (IsLocalRing.residue R)).natDegree ≤ d) (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) (hmd : m ≤ d) : - (henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)).natDegree ≤ d - m ∧ + (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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv) - h0).coeff i ∈ + 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) * - henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv)) = + 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 @@ -290,7 +290,7 @@ theorem henselFactorization_exists_one_step_update_of_mem_le hbez hdiv hpdeg hfn hh0 hmd with ⟨hqdeg, hgNext, hhNext, hnext⟩ rcases hnext with ⟨fnNext, hfactorNext⟩ - exact ⟨p, henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv), fnNext, + exact ⟨p, henselFactorizationLowPart (d - m) (a * fn + h0 * qdiv), fnNext, hpNat, hqdeg, hgNext, hhNext, hfactorNext⟩ /-- existence of one recursive Hensel step from the current @@ -353,7 +353,7 @@ theorem henselFactorization_exists_one_step_update_of_mem_span hbezFactor hdiv hfn hh0 hpNat hmd with ⟨hqdeg, hgNext, hhNext, hgNextMax, hhNextMax, hnext⟩ rcases hnext with ⟨fnNext, hfactorNext⟩ - exact ⟨p, henselFactorization_lowPart (d - m) (a * fn + h0 * qdiv), fnNext, + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean index a4ed87732d..fe32b55d34 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean @@ -22,15 +22,15 @@ namespace AlgebraicNumberTheory namespace Valuations /-- low-degree part of a polynomial up to degree `N`. -/ -def henselFactorization_lowPart {R : Type*} [Semiring R] (N : ℕ) (P : R[X]) : R[X] := +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) : - (henselFactorization_lowPart N P).coeff n = P.coeff n := by + (henselFactorizationLowPart N P).coeff n = P.coeff n := by classical - unfold henselFactorization_lowPart + unfold henselFactorizationLowPart rw [Polynomial.finsetSum_coeff] rw [Finset.sum_eq_single n] · simp @@ -42,9 +42,9 @@ theorem henselFactorization_lowPart_coeff_of_le /-- 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) : - (henselFactorization_lowPart N P).coeff n = 0 := by + (henselFactorizationLowPart N P).coeff n = 0 := by classical - unfold henselFactorization_lowPart + unfold henselFactorizationLowPart rw [Polynomial.finsetSum_coeff] refine Finset.sum_eq_zero ?_ intro b hb @@ -57,7 +57,7 @@ theorem henselFactorization_lowPart_coeff_eq_zero_of_lt /-- `lowPart` has the intended degree bound. -/ theorem henselFactorization_lowPart_natDegree_le {R : Type*} [Semiring R] (N : ℕ) (P : R[X]) : - (henselFactorization_lowPart N P).natDegree ≤ N := by + (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 @@ -68,7 +68,7 @@ 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 φ) : - (henselFactorization_lowPart N P).map φ = P.map φ := by + (henselFactorizationLowPart N P).map φ = P.map φ := by ext n by_cases hn : n ≤ N · rw [Polynomial.coeff_map, Polynomial.coeff_map, @@ -84,7 +84,7 @@ theorem henselFactorization_lowPart_map_eq_of_high_coeff_mem_ker 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) : - (henselFactorization_lowPart N P).map (IsLocalRing.residue 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 @@ -100,9 +100,9 @@ theorem henselFactorization_correction_after_lowPart_ker (hcorr : ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ RingHom.ker φ) (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ RingHom.ker φ) : - (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).coeff n ∈ + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ RingHom.ker φ := by refine ⟨henselFactorization_lowPart_natDegree_le N Q, ?_⟩ have hmapQ := @@ -112,13 +112,13 @@ theorem henselFactorization_correction_after_lowPart_ker exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker φ (g0 * Q + h0 * p - fn)).2 hcorr have hmapNew : - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map φ = 0 := by + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map φ = 0 := by calc - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map φ = - g0.map φ * (henselFactorization_lowPart N Q).map φ + + (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 - (henselFactorization_lowPart N Q) p fn + (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 @@ -126,7 +126,7 @@ theorem henselFactorization_correction_after_lowPart_ker _ = 0 := hmapOld intro n exact (henselFactorization_map_eq_zero_iff_coeff_mem_ker - φ (g0 * henselFactorization_lowPart N Q + h0 * p - fn)).1 hmapNew n + φ (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 @@ -137,9 +137,9 @@ theorem henselFactorization_correction_after_lowPart_ideal (hcorr : ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ I) (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ I) : - (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).coeff n ∈ I := by + (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 @@ -168,9 +168,9 @@ theorem henselFactorization_correction_after_lowPart_span_singleton Ideal.span ({π} : Set R)) (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ Ideal.span ({π} : Set R)) : - (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).coeff 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 @@ -527,9 +527,9 @@ theorem henselFactorization_correction_after_degree_truncation_span_singleton (hAdeg : ((fn - h0 * p).map (Ideal.Quotient.mk (Ideal.span ({π} : Set R)))).natDegree ≤ d) : - (henselFactorization_lowPart (d - m) Q).natDegree ≤ d - m ∧ + (henselFactorizationLowPart (d - m) Q).natDegree ≤ d - m ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart (d - m) Q + h0 * p - fn).coeff 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 @@ -553,9 +553,9 @@ theorem henselFactorization_correction_after_division_degree_truncation_span_sin (hh0 : h0.natDegree ≤ d - m) (hp : p.natDegree ≤ m) (hmd : m ≤ d) : - (henselFactorization_lowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + (henselFactorizationLowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart (d - m) (a * fn + h0 * q) + + (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 @@ -586,9 +586,9 @@ theorem henselFactorization_correction_after_lowPart (hcorr : ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R) (hhigh : ∀ n : ℕ, N < n → Q.coeff n ∈ IsLocalRing.maximalIdeal R) : - (henselFactorization_lowPart N Q).natDegree ≤ N ∧ + (henselFactorizationLowPart N Q).natDegree ≤ N ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).coeff n ∈ + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R := by refine ⟨henselFactorization_lowPart_natDegree_le N Q, ?_⟩ have hmapQ := @@ -602,17 +602,17 @@ theorem henselFactorization_correction_after_lowPart have h := hcorr n rwa [IsLocalRing.ker_residue] have hmapNew : - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map (IsLocalRing.residue R) = 0 := by calc - (g0 * henselFactorization_lowPart N Q + h0 * p - fn).map + (g0 * henselFactorizationLowPart N Q + h0 * p - fn).map (IsLocalRing.residue R) = g0.map (IsLocalRing.residue R) * - (henselFactorization_lowPart N Q).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 - (henselFactorization_lowPart N Q) p fn + (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 @@ -624,7 +624,7 @@ theorem henselFactorization_correction_after_lowPart have hker := (henselFactorization_map_eq_zero_iff_coeff_mem_ker (IsLocalRing.residue R) - (g0 * henselFactorization_lowPart N Q + h0 * p - fn)).1 hmapNew n + (g0 * henselFactorizationLowPart N Q + h0 * p - fn)).1 hmapNew n rwa [IsLocalRing.ker_residue] at hker /-- one-step degree truncation of the provisional correction: @@ -640,9 +640,9 @@ theorem henselFactorization_correction_after_degree_truncation ∀ n : ℕ, (g0 * Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R) (hAdeg : ((fn - h0 * p).map (IsLocalRing.residue R)).natDegree ≤ d) : - (henselFactorization_lowPart (d - m) Q).natDegree ≤ d - m ∧ + (henselFactorizationLowPart (d - m) Q).natDegree ≤ d - m ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart (d - m) Q + h0 * p - fn).coeff n ∈ + (g0 * henselFactorizationLowPart (d - m) Q + h0 * p - fn).coeff n ∈ IsLocalRing.maximalIdeal R := by exact henselFactorization_correction_after_lowPart (N := d - m) hcorr @@ -665,9 +665,9 @@ theorem henselFactorization_correction_after_division_degree_truncation (hh0 : (h0.map (IsLocalRing.residue R)).natDegree ≤ d - m) (hp : (p.map (IsLocalRing.residue R)).natDegree ≤ m) (hmd : m ≤ d) : - (henselFactorization_lowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ + (henselFactorizationLowPart (d - m) (a * fn + h0 * q)).natDegree ≤ d - m ∧ ∀ n : ℕ, - (g0 * henselFactorization_lowPart (d - m) (a * fn + h0 * q) + + (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 ∈ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean index 811b2337d1..8cf6accb39 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean @@ -37,10 +37,10 @@ theorem henselFactorization_infiniteG_coeff_adicCoeffCauchy_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (i : ℕ) : - henselFactorization_adicCoeffCauchy (IsLocalRing.maximalIdeal R) + henselFactorizationAdicCoeffCauchy (IsLocalRing.maximalIdeal R) (fun N : ℕ => - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -51,8 +51,8 @@ theorem henselFactorization_infiniteG_coeff_adicCoeffCauchy_of_mem_span exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem (IsLocalRing.maximalIdeal R) (Pseq := fun N : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -91,8 +91,8 @@ theorem henselFactorization_exists_infiniteG_limitPolynomial_of_mem_span (hmd : m ≤ d) : ∃ G : R[X], G.natDegree ≤ m ∧ ∀ n i : ℕ, - (henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + (henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -105,8 +105,8 @@ theorem henselFactorization_exists_infiniteG_limitPolynomial_of_mem_span (IsLocalRing.maximalIdeal R) (N := m) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -147,10 +147,10 @@ theorem henselFactorization_infiniteH_coeff_adicCoeffCauchy_of_mem_span (hfactor0 : f - g0 * h0 = Polynomial.C π * f1) (hbezFactor : a * g0 + b * h0 - 1 = Polynomial.C π * e) (hmd : m ≤ d) (i : ℕ) : - henselFactorization_adicCoeffCauchy (IsLocalRing.maximalIdeal R) + henselFactorizationAdicCoeffCauchy (IsLocalRing.maximalIdeal R) (fun N : ℕ => - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -161,8 +161,8 @@ theorem henselFactorization_infiniteH_coeff_adicCoeffCauchy_of_mem_span exact henselFactorization_coeff_adicCoeffCauchy_of_sub_coeff_mem (IsLocalRing.maximalIdeal R) (Pseq := fun N : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -201,8 +201,8 @@ theorem henselFactorization_exists_infiniteH_limitPolynomial_of_mem_span (hmd : m ≤ d) : ∃ H : R[X], H.natDegree ≤ d - m ∧ ∀ n i : ℕ, - (henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + (henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -215,8 +215,8 @@ theorem henselFactorization_exists_infiniteH_limitPolynomial_of_mem_span (IsLocalRing.maximalIdeal R) (N := d - m) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -282,8 +282,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span apply henselFactorization_limit_factor_eq_of_approximants (I := IsLocalRing.maximalIdeal R) (Gseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -291,8 +291,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span hf hg0map hg0nat hgbar_nat hglead hh0deg hfactor0 hbezFactor hmd) n) (Hseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -314,8 +314,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span henselFactorization_limit_reduction_of_approx_reduction (I := IsLocalRing.maximalIdeal R) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π g0 - (henselFactorization_infinitePCorr_of_mem_span + henselFactorizationHenselIterate π g0 + (henselFactorizationInfinitePCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) @@ -333,8 +333,8 @@ theorem henselFactorization_exists_limit_factorization_of_mem_span henselFactorization_limit_reduction_of_approx_reduction (I := IsLocalRing.maximalIdeal R) (Pseq := fun n : ℕ => - henselFactorization_henselIterate π h0 - (henselFactorization_infiniteQCorr_of_mem_span + henselFactorizationHenselIterate π h0 + (henselFactorizationInfiniteQCorrOfMemSpan (π := π) hπne hπmem (f := f) (g0 := g0) (h0 := h0) (a := a) (b := b) (f1 := f1) (e := e) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean index 1670961855..c7b5e0847d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean @@ -10,7 +10,8 @@ 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 +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. diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean index cf7c370681..3e1ccec444 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean @@ -101,7 +101,8 @@ theorem irreduciblePolynomial_polynomial_ne_zero_of_eq_X_pow_mul_of_coeff_zero_n 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 +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean index eafd0f269f..b17322aa91 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -275,7 +275,8 @@ theorem residue_ne_zero_of_isPrimitive_valuationSubring have hp0 : p ≠ 0 := hp.ne_zero obtain ⟨n, hn⟩ := Polynomial.support_nonempty.mpr hp0 have hs : - (AlgebraicNumberTheory.Valuations.henselFactorization_twoPolynomialCoeffFinset p 0).Nonempty := by + (AlgebraicNumberTheory.Valuations.henselFactorizationTwoPolynomialCoeffFinset p + 0).Nonempty := by refine ⟨p.coeff n, ?_⟩ exact AlgebraicNumberTheory.Valuations.henselFactorization_mem_twoPolynomialCoeffFinset_left hn @@ -423,6 +424,118 @@ theorem residue_root_of_integral_root 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) @@ -595,94 +708,8 @@ theorem exists_mixed_residual_minpoly_of_irreducible_roots_unequal 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 - 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 + exact exists_monic_residue_polynomial_of_mixed_roots V B q hqmonic hqirr hqsplit + z zγ hzval hzγval hqz hqzγ hqrootsBound diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean index d48fb07229..6dbdf79c94 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean @@ -276,7 +276,8 @@ theorem partition_primitive_irreducible_factors_along_coprime_reduction · 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 +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean index 2d7d7553f0..47a100fef5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean @@ -63,7 +63,8 @@ theorem monicResidualCoprimeFactorLifting_of_unique_algebraic_extensions V hunique factors hfactors gbar hbar hgbar hhbar hredprod hcoprime exact ⟨G, H, hG, hH, hprod.symm.trans hGH, hGbar, hHbar⟩ -/-- the unique-extension criterion, forward direction. the primitive factorization definition, in its exact +/-- 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 @@ -131,7 +132,8 @@ theorem henselianUniqueExtension_unique_algebraic_valuationSubring_extensions_of 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 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean index 3247897f72..aff38d345d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -195,7 +195,8 @@ theorem primitiveIrreducibleReductionProperty_of_monicResidualCoprimeFactorLifti 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. -/ +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) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean index 4c1b29e8e2..8b4e95a751 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean @@ -68,7 +68,7 @@ theorem map_maximalIdeal_eq_pow_ramificationIdx {R S : Type*} [CommRing R] [IsDomain R] [CommRing S] [IsDomain S] [IsDiscreteValuationRing R] [IsDiscreteValuationRing S] - [Algebra R S] [IsLocalHom (algebraMap R S)] + [Algebra R S] (hi : Function.Injective (algebraMap R S)) : Ideal.map (algebraMap R S) (IsLocalRing.maximalIdeal R) = IsLocalRing.maximalIdeal S ^ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index 69aebb1dec..49f3ed1b15 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -175,8 +175,8 @@ def adicUnitInverseLimitRepresentation Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom) := (adicUnitInverseLimitCompatibleFamiliesEquiv I).mulEquiv -/-- Defines `adicUnitInverseLimit_mk`. -/ -def adicUnitInverseLimit_mk +/-- Defines `adicUnitInverseLimitMk`. -/ +def adicUnitInverseLimitMk {R : Type*} [CommRing R] (I : Ideal R) (x : ∀ n : ℕ, (R ⧸ I ^ n)ˣ) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -184,8 +184,8 @@ def adicUnitInverseLimit_mk adicUnitInverseLimit I := (adicUnitInverseLimitCompatibleFamiliesEquiv I).symm ⟨x, compatible⟩ -/-- Defines `adicUnitInverseLimit_eval`. -/ -def adicUnitInverseLimit_eval +/-- 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 @@ -200,7 +200,7 @@ theorem adicUnitInverseLimit_eval_mk (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), Units.map (Ideal.Quotient.factorPow I hmn).toMonoidHom (x n) = x m) (n : ℕ) : - adicUnitInverseLimit_eval I n (adicUnitInverseLimit_mk I x compatible) = + adicUnitInverseLimitEval I n (adicUnitInverseLimitMk I x compatible) = x n := by rfl @@ -209,8 +209,8 @@ theorem adicUnitInverseLimit_eval_mk theorem adicUnitInverseLimit_ext {R : Type*} [CommRing R] (I : Ideal R) {x y : adicUnitInverseLimit I} - (h : ∀ n : ℕ, adicUnitInverseLimit_eval I n x = - adicUnitInverseLimit_eval I n y) : + (h : ∀ n : ℕ, adicUnitInverseLimitEval I n x = + adicUnitInverseLimitEval I n y) : x = y := by apply (adicUnitInverseLimitCompatibleFamiliesEquiv I).injective apply Subtype.ext @@ -222,8 +222,8 @@ 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 - (adicUnitInverseLimit_eval I n x) = - adicUnitInverseLimit_eval I m x := + (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 @@ -232,20 +232,20 @@ def adicQuotientInverseLimitUnitsEquiv {R : Type*} [CommRing R] (I : Ideal R) : (adicQuotientInverseLimit I)ˣ ≃* adicUnitInverseLimit I where - toFun u := adicUnitInverseLimit_mk I - (fun n => Units.map (adicQuotientInverseLimit_eval I n).toMonoidHom u) + 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 := adicQuotientInverseLimit_mk I - (fun n => (adicUnitInverseLimit_eval I n u : R ⧸ I ^ n)) + { val := adicQuotientInverseLimitMk I + (fun n => (adicUnitInverseLimitEval I n u : R ⧸ I ^ n)) (fun hmn => congrArg Units.val (adicUnitInverseLimit_eval_transition I hmn u)) - inv := adicQuotientInverseLimit_mk I + inv := adicQuotientInverseLimitMk I (fun n => - (((adicUnitInverseLimit_eval I n u)⁻¹ : (R ⧸ I ^ n)ˣ) : + (((adicUnitInverseLimitEval I n u)⁻¹ : (R ⧸ I ^ n)ˣ) : R ⧸ I ^ n)) (fun hmn => by have h := congrArg Units.val @@ -254,10 +254,10 @@ def adicQuotientInverseLimitUnitsEquiv simpa using h) val_inv := by ext n - exact Units.mul_inv (adicUnitInverseLimit_eval I n u) + exact Units.mul_inv (adicUnitInverseLimitEval I n u) inv_val := by ext n - exact Units.inv_mul (adicUnitInverseLimit_eval I n u) } + exact Units.inv_mul (adicUnitInverseLimitEval I n u) } left_inv u := by ext n rfl @@ -274,7 +274,7 @@ def adicCompletionUnitsEquivUnitInverseLimit {R : Type*} [CommRing R] (I : Ideal R) : (AdicCompletion I R)ˣ ≃* adicUnitInverseLimit I := (Units.mapEquiv - (adicCompletion_equiv_quotientInverseLimit I).toMulEquiv).trans + (adicCompletionEquivQuotientInverseLimit I).toMulEquiv).trans (adicQuotientInverseLimitUnitsEquiv I) /-- The adic inverse-limit equivalence, unit projective-limit form for a complete ring. -/ @@ -289,7 +289,7 @@ reduction in each coordinate. -/ theorem unitsEquivUnitInverseLimit_apply {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] (u : Rˣ) (n : ℕ) : - adicUnitInverseLimit_eval I n (unitsEquivUnitInverseLimit I u) = + adicUnitInverseLimitEval I n (unitsEquivUnitInverseLimit I u) = unitReduction (I ^ n) u := by ext rfl @@ -332,8 +332,8 @@ def adicPositiveUnitInverseLimitRepresentation (Nat.succ_le_succ hmn)).toMonoidHom) := (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).mulEquiv -/-- Defines `adicPositiveUnitInverseLimit_mk`. -/ -def adicPositiveUnitInverseLimit_mk +/-- Defines `adicPositiveUnitInverseLimitMk`. -/ +def adicPositiveUnitInverseLimitMk {R : Type*} [CommRing R] (I : Ideal R) (x : ∀ n : ℕ, (R ⧸ I ^ (n + 1))ˣ) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -344,8 +344,8 @@ def adicPositiveUnitInverseLimit_mk (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).symm ⟨x, compatible⟩ -/-- Defines `adicPositiveUnitInverseLimit_eval`. -/ -def adicPositiveUnitInverseLimit_eval +/-- Defines `adicPositiveUnitInverseLimitEval`. -/ +def adicPositiveUnitInverseLimitEval {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : adicPositiveUnitInverseLimit I →* (R ⧸ I ^ (n + 1))ˣ where toFun x := @@ -363,8 +363,8 @@ theorem adicPositiveUnitInverseLimit_eval_mk (Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)).toMonoidHom (x n) = x m) (n : ℕ) : - adicPositiveUnitInverseLimit_eval I n - (adicPositiveUnitInverseLimit_mk I x compatible) = x n := by + adicPositiveUnitInverseLimitEval I n + (adicPositiveUnitInverseLimitMk I x compatible) = x n := by rfl /-- Positive adic unit families are determined by all of their components. -/ @@ -372,8 +372,8 @@ theorem adicPositiveUnitInverseLimit_eval_mk theorem adicPositiveUnitInverseLimit_ext {R : Type*} [CommRing R] (I : Ideal R) {x y : adicPositiveUnitInverseLimit I} - (h : ∀ n : ℕ, adicPositiveUnitInverseLimit_eval I n x = - adicPositiveUnitInverseLimit_eval I n y) : + (h : ∀ n : ℕ, adicPositiveUnitInverseLimitEval I n x = + adicPositiveUnitInverseLimitEval I n y) : x = y := by apply (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I).injective apply Subtype.ext @@ -387,30 +387,30 @@ theorem adicPositiveUnitInverseLimit_eval_transition Units.map (Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)).toMonoidHom - (adicPositiveUnitInverseLimit_eval I n x) = - adicPositiveUnitInverseLimit_eval I m x := + (adicPositiveUnitInverseLimitEval I n x) = + adicPositiveUnitInverseLimitEval I m x := (adicPositiveUnitInverseLimitCompatibleFamiliesEquiv I x).2 hmn -/-- Defines `adicUnitInverseLimit_toPositive`. -/ -def adicUnitInverseLimit_toPositive +/-- Defines `adicUnitInverseLimitToPositive`. -/ +def adicUnitInverseLimitToPositive {R : Type*} [CommRing R] (I : Ideal R) : adicUnitInverseLimit I → adicPositiveUnitInverseLimit I := fun u => - adicPositiveUnitInverseLimit_mk I - (fun n => adicUnitInverseLimit_eval I (n + 1) u) + adicPositiveUnitInverseLimitMk I + (fun n => adicUnitInverseLimitEval I (n + 1) u) (fun hmn => adicUnitInverseLimit_eval_transition I (Nat.succ_le_succ hmn) u) -/-- Defines `adicPositiveUnitInverseLimit_toAll`. -/ -def adicPositiveUnitInverseLimit_toAll +/-- Defines `adicPositiveUnitInverseLimitToAll`. -/ +def adicPositiveUnitInverseLimitToAll {R : Type*} [CommRing R] (I : Ideal R) : adicPositiveUnitInverseLimit I → adicUnitInverseLimit I := fun u => - adicUnitInverseLimit_mk I (fun n => match n with + adicUnitInverseLimitMk I (fun n => match n with | 0 => 1 - | k + 1 => adicPositiveUnitInverseLimit_eval I k u) + | k + 1 => adicPositiveUnitInverseLimitEval I k u) (by intro m n hmn cases m with @@ -431,8 +431,8 @@ def adicPositiveUnitInverseLimit_toAll theorem adicPositiveUnitInverseLimit_toPositive_toAll {R : Type*} [CommRing R] (I : Ideal R) (u : adicPositiveUnitInverseLimit I) : - adicUnitInverseLimit_toPositive I - (adicPositiveUnitInverseLimit_toAll I u) = u := by + adicUnitInverseLimitToPositive I + (adicPositiveUnitInverseLimitToAll I u) = u := by ext n rfl @@ -440,8 +440,8 @@ theorem adicPositiveUnitInverseLimit_toPositive_toAll theorem adicUnitInverseLimit_toAll_toPositive {R : Type*} [CommRing R] (I : Ideal R) (u : adicUnitInverseLimit I) : - adicPositiveUnitInverseLimit_toAll I - (adicUnitInverseLimit_toPositive I u) = u := by + adicPositiveUnitInverseLimitToAll I + (adicUnitInverseLimitToPositive I u) = u := by ext n cases n with | zero => @@ -459,8 +459,8 @@ def adicUnitInverseLimitEquivPositive {R : Type*} [CommRing R] (I : Ideal R) : adicUnitInverseLimit I ≃* adicPositiveUnitInverseLimit I where - toFun := adicUnitInverseLimit_toPositive I - invFun := adicPositiveUnitInverseLimit_toAll I + toFun := adicUnitInverseLimitToPositive I + invFun := adicPositiveUnitInverseLimitToAll I left_inv := adicUnitInverseLimit_toAll_toPositive I right_inv := adicPositiveUnitInverseLimit_toPositive_toAll I map_mul' u v := by @@ -479,7 +479,7 @@ coordinatewise reduction modulo `I^(n+1)`. -/ theorem unitsEquivPositiveUnitInverseLimit_apply {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] (u : Rˣ) (n : ℕ) : - adicPositiveUnitInverseLimit_eval I n + adicPositiveUnitInverseLimitEval I n (unitsEquivPositiveUnitInverseLimit I u) = unitReduction (I ^ (n + 1)) u := by exact unitsEquivUnitInverseLimit_apply I u (n + 1) @@ -545,8 +545,8 @@ def dvrPowerIdealUnitInverseLimitRepresentation (dvrPowerIdealUnitTransition π hmn).toMonoidHom) := (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).mulEquiv -/-- Defines `dvrPowerIdealUnitInverseLimit_mk`. -/ -def dvrPowerIdealUnitInverseLimit_mk +/-- Defines `dvrPowerIdealUnitInverseLimitMk`. -/ +def dvrPowerIdealUnitInverseLimitMk {O : Type*} [CommRing O] (π : O) (x : ∀ n : ℕ, (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -555,8 +555,8 @@ def dvrPowerIdealUnitInverseLimit_mk (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).symm ⟨x, compatible⟩ -/-- Defines `dvrPowerIdealUnitInverseLimit_eval`. -/ -def dvrPowerIdealUnitInverseLimit_eval +/-- Defines `dvrPowerIdealUnitInverseLimitEval`. -/ +def dvrPowerIdealUnitInverseLimitEval {O : Type*} [CommRing O] (π : O) (n : ℕ) : dvrPowerIdealUnitInverseLimit π →* (O ⧸ uniformizerPowerIdeal π (n + 1))ˣ where @@ -570,8 +570,8 @@ def dvrPowerIdealUnitInverseLimit_eval theorem dvrPowerIdealUnitInverseLimit_ext {O : Type*} [CommRing O] (π : O) {x y : dvrPowerIdealUnitInverseLimit π} - (h : ∀ n : ℕ, dvrPowerIdealUnitInverseLimit_eval π n x = - dvrPowerIdealUnitInverseLimit_eval π n y) : + (h : ∀ n : ℕ, dvrPowerIdealUnitInverseLimitEval π n x = + dvrPowerIdealUnitInverseLimitEval π n y) : x = y := by apply (dvrPowerIdealUnitInverseLimitCompatibleFamiliesEquiv π).injective apply Subtype.ext @@ -778,8 +778,8 @@ def dvrHigherUnitQuotientInverseLimitRepresentation (fun {_ _} hmn => dvrHigherUnitQuotientTransition π hmn) := (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).mulEquiv -/-- Defines `dvrHigherUnitQuotientInverseLimit_mk`. -/ -def dvrHigherUnitQuotientInverseLimit_mk +/-- Defines `dvrHigherUnitQuotientInverseLimitMk`. -/ +def dvrHigherUnitQuotientInverseLimitMk {O : Type*} [CommRing O] (π : O) (x : ∀ n : ℕ, Oˣ ⧸ higherUnitSubgroup π (n + 1)) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -788,8 +788,8 @@ def dvrHigherUnitQuotientInverseLimit_mk (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).symm ⟨x, compatible⟩ -/-- Defines `dvrHigherUnitQuotientInverseLimit_eval`. -/ -def dvrHigherUnitQuotientInverseLimit_eval +/-- Defines `dvrHigherUnitQuotientInverseLimitEval`. -/ +def dvrHigherUnitQuotientInverseLimitEval {O : Type*} [CommRing O] (π : O) (n : ℕ) : dvrHigherUnitQuotientInverseLimit π →* Oˣ ⧸ higherUnitSubgroup π (n + 1) where @@ -806,8 +806,8 @@ theorem dvrHigherUnitQuotientInverseLimit_eval_mk (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), dvrHigherUnitQuotientTransition π hmn (x n) = x m) (n : ℕ) : - dvrHigherUnitQuotientInverseLimit_eval π n - (dvrHigherUnitQuotientInverseLimit_mk π x compatible) = x n := by + dvrHigherUnitQuotientInverseLimitEval π n + (dvrHigherUnitQuotientInverseLimitMk π x compatible) = x n := by rfl /-- Higher-unit inverse-limit elements are determined by their evaluations at every level. -/ @@ -815,8 +815,8 @@ theorem dvrHigherUnitQuotientInverseLimit_eval_mk theorem dvrHigherUnitQuotientInverseLimit_ext {O : Type*} [CommRing O] (π : O) {x y : dvrHigherUnitQuotientInverseLimit π} - (h : ∀ n : ℕ, dvrHigherUnitQuotientInverseLimit_eval π n x = - dvrHigherUnitQuotientInverseLimit_eval π n y) : + (h : ∀ n : ℕ, dvrHigherUnitQuotientInverseLimitEval π n x = + dvrHigherUnitQuotientInverseLimitEval π n y) : x = y := by apply (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).injective apply Subtype.ext @@ -829,8 +829,8 @@ theorem dvrHigherUnitQuotientInverseLimit_eval_transition {m n : ℕ} (hmn : m ≤ n) (x : dvrHigherUnitQuotientInverseLimit π) : dvrHigherUnitQuotientTransition π hmn - (dvrHigherUnitQuotientInverseLimit_eval π n x) = - dvrHigherUnitQuotientInverseLimit_eval π m x := + (dvrHigherUnitQuotientInverseLimitEval π n x) = + dvrHigherUnitQuotientInverseLimitEval π m x := (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π x).2 hmn /-- The higher-unit inverse limit carries the topology induced by its discrete coordinates. -/ @@ -856,19 +856,19 @@ private noncomputable def exact (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).homeomorph -/-- Defines `dvrHigherUnitQuotientInverseLimit_discreteEval`. -/ -def dvrHigherUnitQuotientInverseLimit_discreteEval +/-- Defines `dvrHigherUnitQuotientInverseLimitDiscreteEval`. -/ +def dvrHigherUnitQuotientInverseLimitDiscreteEval {O : Type*} [CommRing O] (π : O) (n : ℕ) : dvrHigherUnitQuotientInverseLimit π → DiscreteHigherUnitQuotient π (n + 1) := fun x => DiscreteHigherUnitQuotient.of π (n + 1) - (dvrHigherUnitQuotientInverseLimit_eval π n x) + (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 (dvrHigherUnitQuotientInverseLimit_discreteEval π n) := by + Continuous (dvrHigherUnitQuotientInverseLimitDiscreteEval π n) := by let : (n : ℕ) → TopologicalSpace (Oˣ ⧸ higherUnitSubgroup π (n + 1)) := fun _ => ⊥ let representation := @@ -897,7 +897,7 @@ theorem dvrHigherUnitQuotientInverseLimit_continuous_iff (π : O) (f : α → dvrHigherUnitQuotientInverseLimit π) : Continuous f ↔ ∀ n : ℕ, Continuous fun x => - dvrHigherUnitQuotientInverseLimit_discreteEval π n (f x) := by + dvrHigherUnitQuotientInverseLimitDiscreteEval π n (f x) := by constructor · intro hf n exact @@ -916,7 +916,7 @@ theorem dvrHigherUnitQuotientInverseLimit_continuous_iff (DiscreteHigherUnitQuotient.homeomorph π (n + 1)).continuous.comp (h n) change Continuous fun x => - dvrHigherUnitQuotientInverseLimit_eval π n (f x) + dvrHigherUnitQuotientInverseLimitEval π n (f x) exact hraw) (fun x => by change ∀ {i j : ℕ} (hij : i ≤ j), @@ -936,7 +936,7 @@ theorem dvrHigherUnitQuotientInverseLimit_continuous_iff def unitsToHigherUnitQuotientInverseLimit {O : Type*} [CommRing O] (π : O) : Oˣ →* dvrHigherUnitQuotientInverseLimit π where - toFun u := dvrHigherUnitQuotientInverseLimit_mk π + toFun u := dvrHigherUnitQuotientInverseLimitMk π (fun _ => QuotientGroup.mk u) (fun {m n} hmn => dvrHigherUnitQuotientTransition_mk π (m := m) (n := n) hmn u) @@ -949,11 +949,11 @@ 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)) : - units_quotient_equiv hπ + unitsQuotientEquiv hπ (Nat.succ_pos m) (dvrHigherUnitQuotientTransition π hmn q) = Units.map (dvrPowerIdealUnitTransition π hmn).toMonoidHom - (units_quotient_equiv hπ + (unitsQuotientEquiv hπ (Nat.succ_pos n) q) := by refine QuotientGroup.induction_on q ?_ intro u @@ -977,7 +977,7 @@ def higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit (fun {_ _} hmn => Units.map (dvrPowerIdealUnitTransition π hmn).toMonoidHom) - (fun n => units_quotient_equiv hπ + (fun n => unitsQuotientEquiv hπ (Nat.succ_pos n)) (by intro m n hmn q @@ -1002,19 +1002,19 @@ theorem dvrUnitsEquivHigherUnitQuotientInverseLimit_apply {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] {π : O} (hπ : Irreducible π) [IsAdicComplete (uniformizerPowerIdeal π 1) O] (u : Oˣ) (n : ℕ) : - dvrHigherUnitQuotientInverseLimit_eval π n + dvrHigherUnitQuotientInverseLimitEval π n (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u) = QuotientGroup.mk u := by apply - (units_quotient_equiv hπ + (unitsQuotientEquiv hπ (Nat.succ_pos n)).injective - change units_quotient_equiv hπ (Nat.succ_pos n) - (dvrHigherUnitQuotientInverseLimit_eval π n + change unitsQuotientEquiv hπ (Nat.succ_pos n) + (dvrHigherUnitQuotientInverseLimitEval π n (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = - units_quotient_equiv hπ (Nat.succ_pos n) + unitsQuotientEquiv hπ (Nat.succ_pos n) (QuotientGroup.mk u) rw [units_quotient_equiv_mk] - change dvrPowerIdealUnitInverseLimit_eval π n + change dvrPowerIdealUnitInverseLimitEval π n ((higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ) (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = unitReduction (uniformizerPowerIdeal π (n + 1)) u @@ -1157,6 +1157,15 @@ theorem higherUnitQuotient_mk_continuous_adic (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 + private noncomputable def unitsCompatibleFamiliesHomeomorph {O : Type*} [CommRing O] [IsDomain O] [IsDiscreteValuationRing O] {π : O} (hπ : Irreducible π) [IsAdicComplete (uniformizerPowerIdeal π 1) O] : @@ -1210,9 +1219,8 @@ private noncomputable def unitsCompatibleFamiliesHomeomorph (by intro u m n hmn exact dvrHigherUnitQuotientTransition_mk π hmn u) - · apply Units.continuous_iff.mpr - constructor - · rw [continuous_iff_continuousAt] + · 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 @@ -1269,71 +1277,14 @@ private noncomputable def unitsCompatibleFamiliesHomeomorph (((e.symm q' : Oˣ) : O) - ((e.symm q : Oˣ) : O)) = ((e.symm q' : Oˣ) : O) ring) - · 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 hinv_mk : - (QuotientGroup.mk ((e.symm q')⁻¹ : Oˣ) : - Oˣ ⧸ higherUnitSubgroup π (n + 1)) = - QuotientGroup.mk ((e.symm q)⁻¹ : Oˣ) := by - simpa using congrArg Inv.inv hmk - have hinv_sub_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)⁻¹ : Oˣ) ((e.symm q')⁻¹ : Oˣ)).1 hinv_mk - have hinv_sub : - (((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) - hinv_sub_succ - refine - ⟨(((e.symm q')⁻¹ : Oˣ) : O) - (((e.symm q)⁻¹ : Oˣ) : O), - hinv_sub, ?_⟩ - 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. -/ @@ -1354,18 +1305,20 @@ noncomputable def unitsEquivHigherUnitQuotientInverseLimitHomeomorph let target := dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph π exact source.trans (algebraic.trans target.symm) -/-- Complete-DVF specialization of the adic inverse-limit equivalence: the valuation ring is canonically +/-- Complete-DVF specialization of the adic inverse-limit equivalence: the valuation ring is +canonically isomorphic to its maximal-ideal adic completion. -/ -def completeDVF_valuationSubring_adicCompletionAlgEquiv +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 +/-- 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 completeDVF_valuationSubring_quotientInverseLimitEquiv +def completeDVFValuationSubringQuotientInverseLimitEquiv {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : F.valuationSubring ≃+* @@ -1378,14 +1331,15 @@ theorem completeDVF_valuationSubring_quotientInverseLimitEquiv_apply {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) (x : F.valuationSubring) (n : ℕ) : - adicQuotientInverseLimit_eval F.maximalIdeal n - (completeDVF_valuationSubring_quotientInverseLimitEquiv F x) = + 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 +/-- Complete-DVF specialization of the adic inverse-limit equivalence, units of the valuation +ring agree with units of its maximal-ideal adic completion. -/ -def completeDVF_units_adicCompletionUnitsEquiv +def completeDVFUnitsAdicCompletionUnitsEquiv {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : F.valuationSubringˣ ≃* @@ -1398,13 +1352,14 @@ theorem completeDVF_units_adicCompletionUnitsEquiv_apply {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) (u : F.valuationSubringˣ) : - (completeDVF_units_adicCompletionUnitsEquiv F u : + (completeDVFUnitsAdicCompletionUnitsEquiv F u : AdicCompletion F.maximalIdeal F.valuationSubring) = - completeDVF_valuationSubring_adicCompletionAlgEquiv F + completeDVFValuationSubringAdicCompletionAlgEquiv F (u : F.valuationSubring) := by rfl -/-- Complete-DVF specialization of the adic inverse-limit equivalence, unit-coordinate injectivity. -/ +/-- 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) @@ -1417,22 +1372,24 @@ theorem completeDVF_units_coordinates_injective exact adicCompletion_units_coordinates_injective F.maximalIdeal h -/-- Complete-DVF specialization of the adic inverse-limit equivalence, unit-coordinate surjectivity against +/-- 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ˣ, - completeDVF_units_adicCompletionUnitsEquiv F u = z ∧ + 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 +/-- 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 completeDVF_unitsEquivUnitInverseLimit +def completeDVFUnitsEquivUnitInverseLimit {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) : F.valuationSubringˣ ≃* @@ -1445,14 +1402,14 @@ theorem completeDVF_unitsEquivUnitInverseLimit_apply {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) (u : F.valuationSubringˣ) (n : ℕ) : - adicUnitInverseLimit_eval F.maximalIdeal n - (completeDVF_unitsEquivUnitInverseLimit F u) = + 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 completeDVF_unitsModMaximalIdealPowEquiv +noncomputable def completeDVFUnitsModMaximalIdealPowEquiv {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) {n : ℕ} (hn : 1 ≤ n) : @@ -1468,7 +1425,7 @@ theorem completeDVF_unitsModMaximalIdealPowEquiv_mk {K : Type u} [Field K] (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) {n : ℕ} (hn : 1 ≤ n) (u : F.valuationSubringˣ) : - completeDVF_unitsModMaximalIdealPowEquiv F hn + completeDVFUnitsModMaximalIdealPowEquiv F hn (QuotientGroup.mk u) = unitReduction (F.maximalIdeal ^ n) u := by exact unitsModMaximalIdealPowEquiv_mk @@ -1512,7 +1469,7 @@ theorem completeDVF_units_quotient_coordinates_injective /-- 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 completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit +def completeValuedFieldValuationSubringEquivPositiveQuotientInverseLimit {K : Type u} [Field K] {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] [Valued K Gamma] @@ -1526,7 +1483,7 @@ def completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K := completeDVFOfCompleteValuedField (K := K) (Gamma := Gamma) exact - (completeDVF_valuationSubring_quotientInverseLimitEquiv F).trans + (completeDVFValuationSubringQuotientInverseLimitEquiv F).trans (adicQuotientInverseLimitEquivPositive F.maximalIdeal) /-- The direct valuation-ring equivalence is the canonical map, @@ -1538,10 +1495,10 @@ theorem completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit_ap [(Valued.v : Valuation K Gamma).IsRankOneDiscrete] [CompleteSpace K] (x : (Valued.v : Valuation K Gamma).valuationSubring) (n : ℕ) : - adicPositiveQuotientInverseLimit_eval + adicPositiveQuotientInverseLimitEval (IsLocalRing.maximalIdeal (Valued.v : Valuation K Gamma).valuationSubring) n - (completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit + (completeValuedFieldValuationSubringEquivPositiveQuotientInverseLimit (K := K) (Gamma := Gamma) x) = Ideal.Quotient.mk ((IsLocalRing.maximalIdeal @@ -1553,7 +1510,7 @@ theorem completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit_ap rankOneDiscreteValuationSubring_isAdicComplete (K := K) (Gamma := Gamma) change - adicPositiveQuotientInverseLimit_eval m n + adicPositiveQuotientInverseLimitEval m n (adicPositiveQuotientInverseLimitEquiv m x) = Ideal.Quotient.mk (m ^ (n + 1)) x exact adicPositiveQuotientInverseLimitEquiv_apply m x n @@ -1561,7 +1518,7 @@ theorem completeValuedField_valuationSubringEquivPositiveQuotientInverseLimit_ap /-- 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 completeValuedField_valuationSubringPositiveQuotientInverseLimitHomeomorph +def completeValuedFieldValuationSubringPositiveQuotientInverseLimitHomeomorph {K : Type u} [Field K] {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] [Valued K Gamma] @@ -1592,10 +1549,10 @@ def completeValuedField_valuationSubringPositiveQuotientInverseLimitHomeomorph in its valuation ring. -/ theorem completeValuedField_uniformizer_irreducible {K : Type u} [Field K] {Gamma : Type v} - [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [LinearOrderedCommGroupWithZero 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)) : Irreducible pi := by @@ -1613,10 +1570,10 @@ theorem completeValuedField_uniformizer_irreducible ideal of the valuation ring. -/ theorem completeValuedField_uniformizerPowerIdeal_one_eq_maximalIdeal {K : Type u} [Field K] {Gamma : Type v} - [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] + [LinearOrderedCommGroupWithZero 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)) : uniformizerPowerIdeal pi 1 = @@ -1670,7 +1627,7 @@ theorem completeValuedField_uniformizerIdeal_isAdic /-- The adic inverse-limit equivalence, direct unit-group endpoint from valued-field completeness: the canonical map `𝒪ˣ → lim 𝒪ˣ/U⁽ⁿ⁾` is a multiplicative equivalence. -/ -def completeValuedField_unitsEquivHigherUnitQuotientInverseLimit +def completeValuedFieldUnitsEquivHigherUnitQuotientInverseLimit {K : Type u} [Field K] {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] [Valued K Gamma] @@ -1700,8 +1657,8 @@ theorem completeValuedField_unitsEquivHigherUnitQuotientInverseLimit_apply {pi : (Valued.v : Valuation K Gamma).valuationSubring} (hpi : (Valued.v : Valuation K Gamma).IsUniformizer (pi : K)) (u : (Valued.v : Valuation K Gamma).valuationSubringˣ) (n : ℕ) : - dvrHigherUnitQuotientInverseLimit_eval pi n - (completeValuedField_unitsEquivHigherUnitQuotientInverseLimit + dvrHigherUnitQuotientInverseLimitEval pi n + (completeValuedFieldUnitsEquivHigherUnitQuotientInverseLimit hpi u) = QuotientGroup.mk u := by let O := (Valued.v : Valuation K Gamma).valuationSubring let : IsDiscreteValuationRing O := @@ -1715,7 +1672,7 @@ theorem completeValuedField_unitsEquivHigherUnitQuotientInverseLimit_apply /-- 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 completeValuedField_unitsHigherUnitQuotientInverseLimitHomeomorph +def completeValuedFieldUnitsHigherUnitQuotientInverseLimitHomeomorph {K : Type u} [Field K] {Gamma : Type v} [LinearOrderedCommGroupWithZero Gamma] [MulArchimedean Gamma] [Valued K Gamma] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean index 94a7c460bc..34b38fa305 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -192,7 +192,7 @@ def adicQuotientInverseLimitRepresentation (adicQuotientInverseLimitCompatibleFamiliesEquiv I).ringEquiv /-- Build an all-level adic inverse-limit point from a compatible family. -/ -def adicQuotientInverseLimit_mk +def adicQuotientInverseLimitMk {R : Type*} [CommRing R] (I : Ideal R) (x : ∀ n : ℕ, R ⧸ I ^ n) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -202,7 +202,7 @@ def adicQuotientInverseLimit_mk ⟨x, compatible⟩ /-- Coordinate evaluation from the explicit projective limit. -/ -def adicQuotientInverseLimit_eval +def adicQuotientInverseLimitEval {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : adicQuotientInverseLimit I →+* R ⧸ I ^ n where toFun x := (adicQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n @@ -219,8 +219,8 @@ theorem adicQuotientInverseLimit_eval_mk (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), Ideal.Quotient.factorPow I hmn (x n) = x m) (n : ℕ) : - adicQuotientInverseLimit_eval I n - (adicQuotientInverseLimit_mk I x compatible) = x n := by + adicQuotientInverseLimitEval I n + (adicQuotientInverseLimitMk I x compatible) = x n := by rfl /-- Adic inverse-limit elements are equal when all coordinate evaluations agree. -/ @@ -228,8 +228,8 @@ theorem adicQuotientInverseLimit_eval_mk theorem adicQuotientInverseLimit_ext {R : Type*} [CommRing R] (I : Ideal R) {x y : adicQuotientInverseLimit I} - (h : ∀ n : ℕ, adicQuotientInverseLimit_eval I n x = - adicQuotientInverseLimit_eval I n y) : + (h : ∀ n : ℕ, adicQuotientInverseLimitEval I n x = + adicQuotientInverseLimitEval I n y) : x = y := by apply (adicQuotientInverseLimitCompatibleFamiliesEquiv I).injective apply Subtype.ext @@ -243,8 +243,8 @@ theorem adicQuotientInverseLimit_eval_factorPow {m n : ℕ} (hmn : m ≤ n) (x : adicQuotientInverseLimit I) : Ideal.Quotient.factorPow I hmn - (adicQuotientInverseLimit_eval I n x) = - adicQuotientInverseLimit_eval I m x := + (adicQuotientInverseLimitEval I n x) = + adicQuotientInverseLimitEval I m x := (adicQuotientInverseLimitCompatibleFamiliesEquiv I x).2 hmn /-- The canonical prodiscrete topology on the all-level inverse limit. The @@ -267,16 +267,16 @@ private noncomputable def adicQuotientInverseLimitRepresentationHomeomorph /-- Coordinate evaluation into a type whose discreteness is recorded in the type itself. -/ -def adicQuotientInverseLimit_discreteEval +def adicQuotientInverseLimitDiscreteEval {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : adicQuotientInverseLimit I → DiscreteAdicQuotient I n := fun x => DiscreteAdicQuotient.of I n - (adicQuotientInverseLimit_eval I n x) + (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 (adicQuotientInverseLimit_discreteEval I n) := by + Continuous (adicQuotientInverseLimitDiscreteEval I n) := by let : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ let representation := adicQuotientInverseLimitRepresentationHomeomorph I have hraw : Continuous fun x : adicQuotientInverseLimit I => @@ -343,24 +343,24 @@ theorem adicCompletion_eval_factorPow /-- The map from the adic completion to the explicit projective limit `lim_n R/I^n`. -/ -def adicCompletion_toQuotientInverseLimit +def adicCompletionToQuotientInverseLimit {R : Type*} [CommRing R] (I : Ideal R) : AdicCompletion I R → adicQuotientInverseLimit I := fun z => - adicQuotientInverseLimit_mk I + 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 adicQuotientInverseLimit_toCompletion +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 - (adicQuotientInverseLimit_eval I n x), + (adicQuotientInverseLimitEval I n x), by intro m n hmn let hm : (I ^ m • ⊤ : Ideal R) = I ^ m := by ext r; simp @@ -376,19 +376,19 @@ theorem adicQuotientInverseLimit_toCompletion_eval {R : Type*} [CommRing R] (I : Ideal R) (x : adicQuotientInverseLimit I) (n : ℕ) : AdicCompletion.evalₐ I n - (adicQuotientInverseLimit_toCompletion I x) = - adicQuotientInverseLimit_eval I n x := by + (adicQuotientInverseLimitToCompletion I x) = + adicQuotientInverseLimitEval I n x := by change (Ideal.quotientEquivAlgOfEq R (by ext r; simp)) - ((adicQuotientInverseLimit_toCompletion I x).val n) = - adicQuotientInverseLimit_eval I n x - dsimp [adicQuotientInverseLimit_toCompletion] + ((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) : - adicQuotientInverseLimit_toCompletion I - (adicCompletion_toQuotientInverseLimit I z) = z := by + adicQuotientInverseLimitToCompletion I + (adicCompletionToQuotientInverseLimit I z) = z := by apply AdicCompletion.ext_evalₐ intro n rw [adicQuotientInverseLimit_toCompletion_eval] @@ -398,21 +398,21 @@ theorem adicQuotientInverseLimit_left_inverse theorem adicQuotientInverseLimit_right_inverse {R : Type*} [CommRing R] (I : Ideal R) (x : adicQuotientInverseLimit I) : - adicCompletion_toQuotientInverseLimit I - (adicQuotientInverseLimit_toCompletion I x) = x := by + adicCompletionToQuotientInverseLimit I + (adicQuotientInverseLimitToCompletion I x) = x := by ext n change AdicCompletion.evalₐ I n - (adicQuotientInverseLimit_toCompletion I x) = - adicQuotientInverseLimit_eval I n x + (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 adicCompletion_equiv_quotientInverseLimit +def adicCompletionEquivQuotientInverseLimit {R : Type*} [CommRing R] (I : Ideal R) : AdicCompletion I R ≃+* adicQuotientInverseLimit I where - toFun := adicCompletion_toQuotientInverseLimit I - invFun := adicQuotientInverseLimit_toCompletion I + toFun := adicCompletionToQuotientInverseLimit I + invFun := adicQuotientInverseLimitToCompletion I left_inv := adicQuotientInverseLimit_left_inverse I right_inv := adicQuotientInverseLimit_right_inverse I map_mul' x y := by @@ -428,10 +428,10 @@ def adicCompletion_equiv_quotientInverseLimit /-- The adic inverse-limit equivalence, canonical map from a ring to the explicit projective limit of its quotients. -/ -def adicQuotientInverseLimit_canonicalMap +def adicQuotientInverseLimitCanonicalMap {R : Type*} [CommRing R] (I : Ideal R) : R →+* adicQuotientInverseLimit I where - toFun x := adicQuotientInverseLimit_mk I + toFun x := adicQuotientInverseLimitMk I (fun n => Ideal.Quotient.mk (I ^ n) x) (fun _ => rfl) map_one' := by ext n; rfl @@ -445,14 +445,14 @@ def adicQuotientInverseLimitEquiv {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] : R ≃+* adicQuotientInverseLimit I := (adicCompletionAlgEquiv I).toRingEquiv.trans - (adicCompletion_equiv_quotientInverseLimit I) + (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 : ℕ) : - adicQuotientInverseLimit_eval I n + adicQuotientInverseLimitEval I n (adicQuotientInverseLimitEquiv I x) = Ideal.Quotient.mk (I ^ n) x := by change AdicCompletion.evalₐ I n @@ -627,8 +627,8 @@ def adicPositiveQuotientInverseLimitRepresentation Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn)) := (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).ringEquiv -/-- Defines `adicPositiveQuotientInverseLimit_mk`. -/ -def adicPositiveQuotientInverseLimit_mk +/-- Defines `adicPositiveQuotientInverseLimitMk`. -/ +def adicPositiveQuotientInverseLimitMk {R : Type*} [CommRing R] (I : Ideal R) (x : ∀ n : ℕ, R ⧸ I ^ (n + 1)) (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), @@ -637,8 +637,8 @@ def adicPositiveQuotientInverseLimit_mk (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).symm ⟨x, compatible⟩ -/-- Defines `adicPositiveQuotientInverseLimit_eval`. -/ -def adicPositiveQuotientInverseLimit_eval +/-- Defines `adicPositiveQuotientInverseLimitEval`. -/ +def adicPositiveQuotientInverseLimitEval {R : Type*} [CommRing R] (I : Ideal R) (n : ℕ) : adicPositiveQuotientInverseLimit I →+* R ⧸ I ^ (n + 1) where toFun x := @@ -656,8 +656,8 @@ theorem adicPositiveQuotientInverseLimit_eval_mk (compatible : ∀ {m n : ℕ} (hmn : m ≤ n), Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn) (x n) = x m) (n : ℕ) : - adicPositiveQuotientInverseLimit_eval I n - (adicPositiveQuotientInverseLimit_mk I x compatible) = x n := by + adicPositiveQuotientInverseLimitEval I n + (adicPositiveQuotientInverseLimitMk I x compatible) = x n := by rfl /-- Positive adic inverse-limit elements are determined by all of their components. -/ @@ -665,8 +665,8 @@ theorem adicPositiveQuotientInverseLimit_eval_mk theorem adicPositiveQuotientInverseLimit_ext {R : Type*} [CommRing R] (I : Ideal R) {x y : adicPositiveQuotientInverseLimit I} - (h : ∀ n : ℕ, adicPositiveQuotientInverseLimit_eval I n x = - adicPositiveQuotientInverseLimit_eval I n y) : + (h : ∀ n : ℕ, adicPositiveQuotientInverseLimitEval I n x = + adicPositiveQuotientInverseLimitEval I n y) : x = y := by apply (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).injective apply Subtype.ext @@ -679,8 +679,8 @@ theorem adicPositiveQuotientInverseLimit_eval_factorPow {m n : ℕ} (hmn : m ≤ n) (x : adicPositiveQuotientInverseLimit I) : Ideal.Quotient.factorPow I (Nat.succ_le_succ hmn) - (adicPositiveQuotientInverseLimit_eval I n x) = - adicPositiveQuotientInverseLimit_eval I m x := + (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. -/ @@ -703,17 +703,17 @@ private noncomputable def exact (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).homeomorph -/-- Defines `adicPositiveQuotientInverseLimit_discreteEval`. -/ -def adicPositiveQuotientInverseLimit_discreteEval +/-- 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) - (adicPositiveQuotientInverseLimit_eval I n x) + (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 (adicPositiveQuotientInverseLimit_discreteEval I n) := by + Continuous (adicPositiveQuotientInverseLimitDiscreteEval I n) := by let : (n : ℕ) → TopologicalSpace (R ⧸ I ^ (n + 1)) := fun _ => ⊥ let representation := adicPositiveQuotientInverseLimitRepresentationHomeomorph I @@ -728,27 +728,27 @@ theorem adicPositiveQuotientInverseLimit_discreteEval_continuous ((adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I x).1 n)) exact hmodel -/-- Defines `adicQuotientInverseLimit_toPositive`. -/ -def adicQuotientInverseLimit_toPositive +/-- Defines `adicQuotientInverseLimitToPositive`. -/ +def adicQuotientInverseLimitToPositive {R : Type*} [CommRing R] (I : Ideal R) : adicQuotientInverseLimit I → adicPositiveQuotientInverseLimit I := fun x => - adicPositiveQuotientInverseLimit_mk I - (fun n => adicQuotientInverseLimit_eval I (n + 1) x) + adicPositiveQuotientInverseLimitMk I + (fun n => adicQuotientInverseLimitEval I (n + 1) x) (fun hmn => adicQuotientInverseLimit_eval_factorPow I (Nat.succ_le_succ hmn) x) -/-- Defines `adicPositiveQuotientInverseLimit_toAll`. -/ -def adicPositiveQuotientInverseLimit_toAll +/-- Defines `adicPositiveQuotientInverseLimitToAll`. -/ +def adicPositiveQuotientInverseLimitToAll {R : Type*} [CommRing R] (I : Ideal R) : adicPositiveQuotientInverseLimit I → adicQuotientInverseLimit I := fun x => - adicQuotientInverseLimit_mk I (fun n => match n with + adicQuotientInverseLimitMk I (fun n => match n with | 0 => 0 - | k + 1 => adicPositiveQuotientInverseLimit_eval I k x) + | k + 1 => adicPositiveQuotientInverseLimitEval I k x) (by intro m n hmn cases m with @@ -768,8 +768,8 @@ def adicPositiveQuotientInverseLimit_toAll theorem adicPositiveQuotientInverseLimit_toPositive_toAll {R : Type*} [CommRing R] (I : Ideal R) (x : adicPositiveQuotientInverseLimit I) : - adicQuotientInverseLimit_toPositive I - (adicPositiveQuotientInverseLimit_toAll I x) = x := by + adicQuotientInverseLimitToPositive I + (adicPositiveQuotientInverseLimitToAll I x) = x := by ext n rfl @@ -777,8 +777,8 @@ theorem adicPositiveQuotientInverseLimit_toPositive_toAll theorem adicQuotientInverseLimit_toAll_toPositive {R : Type*} [CommRing R] (I : Ideal R) (x : adicQuotientInverseLimit I) : - adicPositiveQuotientInverseLimit_toAll I - (adicQuotientInverseLimit_toPositive I x) = x := by + adicPositiveQuotientInverseLimitToAll I + (adicQuotientInverseLimitToPositive I x) = x := by ext n cases n with | zero => @@ -795,8 +795,8 @@ def adicQuotientInverseLimitEquivPositive {R : Type*} [CommRing R] (I : Ideal R) : adicQuotientInverseLimit I ≃+* adicPositiveQuotientInverseLimit I where - toFun := adicQuotientInverseLimit_toPositive I - invFun := adicPositiveQuotientInverseLimit_toAll I + toFun := adicQuotientInverseLimitToPositive I + invFun := adicPositiveQuotientInverseLimitToAll I left_inv := adicQuotientInverseLimit_toAll_toPositive I right_inv := adicPositiveQuotientInverseLimit_toPositive_toAll I map_mul' x y := by @@ -808,10 +808,10 @@ def adicQuotientInverseLimitEquivPositive /-- The adic inverse-limit equivalence, canonical map from a ring to the positive-indexed projective limit of its quotients. -/ -def adicPositiveQuotientInverseLimit_canonicalMap +def adicPositiveQuotientInverseLimitCanonicalMap {R : Type*} [CommRing R] (I : Ideal R) : R →+* adicPositiveQuotientInverseLimit I where - toFun x := adicPositiveQuotientInverseLimit_mk I + toFun x := adicPositiveQuotientInverseLimitMk I (fun n => Ideal.Quotient.mk (I ^ (n + 1)) x) (fun _ => rfl) map_one' := by ext n; rfl @@ -832,7 +832,7 @@ modulo `I^(n+1)` in each coordinate. -/ theorem adicPositiveQuotientInverseLimitEquiv_apply {R : Type*} [CommRing R] (I : Ideal R) [IsAdicComplete I R] (x : R) (n : ℕ) : - adicPositiveQuotientInverseLimit_eval I n + adicPositiveQuotientInverseLimitEval I n (adicPositiveQuotientInverseLimitEquiv I x) = Ideal.Quotient.mk (I ^ (n + 1)) x := adicQuotientInverseLimitEquiv_apply I x (n + 1) @@ -850,7 +850,7 @@ private noncomputable def adicPositiveQuotientCompatibleFamiliesHomeomorph let e := (adicPositiveQuotientInverseLimitEquiv I).trans (adicPositiveQuotientInverseLimitRepresentation I) let c := (adicPositiveQuotientInverseLimitRepresentation I).toRingHom.comp - (adicPositiveQuotientInverseLimit_canonicalMap I) + (adicPositiveQuotientInverseLimitCanonicalMap I) refine { toFun := fun x => c x invFun := fun q => e.symm q @@ -875,7 +875,7 @@ private noncomputable def adicPositiveQuotientCompatibleFamiliesHomeomorph · change Continuous fun x : R => c x exact Continuous.subtype_mk (continuous_pi fun n => by - simpa [c, adicPositiveQuotientInverseLimit_canonicalMap] using + simpa [c, adicPositiveQuotientInverseLimitCanonicalMap] using (quotient_mk_continuous_adic_raw I (n + 1))) (by intro x m n hmn diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean index faef611e6e..0400a95820 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean @@ -9,7 +9,8 @@ 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 +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean index 3f75c6fcde..47ab1abaa1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean @@ -16,7 +16,8 @@ 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 +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. From eff7466a738a8b480da3915015c7b53efc810839 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 01:00:32 +0000 Subject: [PATCH 11/33] Refactor valuation and principal-unit constructions into reusable lemmas --- LeanPool.lean | 2 + LeanPool/ClassFieldTheory.lean | 2 + .../Idele/LocallyCompact.lean | 5 +- .../GlobalNormResidueNaturality.lean | 24 +- .../CompletedChangedStandardResidue.lean | 21 +- .../LogExpSeries/PrincipalUnitLog.lean | 1319 +---------------- .../LogExpSeries/PrincipalUnitLog/Core.lean | 892 +++++++++++ .../PrincipalUnitLog/Equivalences.lean | 461 ++++++ .../MixedCharacteristicStructure/Core.lean | 44 +- .../Unramified/ArithmeticFrobenius.lean | 235 ++- .../Ramification/LocalField/Core.lean | 24 +- 11 files changed, 1507 insertions(+), 1522 deletions(-) create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean create mode 100644 LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean diff --git a/LeanPool.lean b/LeanPool.lean index 1f5190ab18..947a86562e 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -2008,6 +2008,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSer import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean index 5444fa3695..9665dbeaca 100644 --- a/LeanPool/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory.lean @@ -1352,6 +1352,8 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSer import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean index 3dffae0e92..cce7303d56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean @@ -54,9 +54,8 @@ theorem exists_ringOfIntegers_approximation 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 := by - exact congrArg Subtype.val had + 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), diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index 3ea4c8dd06..8de1aadb3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -915,13 +915,11 @@ private theorem PEmbedded = P.toFiniteGaloisExtension := by dsimp only - let F := - abstractFixedField ℚ (SeparableClosure ℚ) H.field + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below - let j : E →ₐ[ℚ] SeparableClosure ℚ := - E.val.restrictScalars ℚ + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ let HEmbedded := numberFieldEmbeddedFiniteAbstractField F E j let PEmbedded : FiniteGaloisSubextension HEmbedded.field := @@ -945,13 +943,11 @@ private noncomputable def (abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below) / (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by - let F := - abstractFixedField ℚ (SeparableClosure ℚ) H.field + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below - let j : E →ₐ[ℚ] SeparableClosure ℚ := - E.val.restrictScalars ℚ + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ have hBase : numberFieldEmbeddedBaseSubgroup F E j = H.field := numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P @@ -1056,13 +1052,11 @@ private noncomputable def (abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below) / (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by - let F := - abstractFixedField ℚ (SeparableClosure ℚ) H.field + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below - let j : E →ₐ[ℚ] SeparableClosure ℚ := - E.val.restrictScalars ℚ + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ have hBase : numberFieldEmbeddedBaseSubgroup F E j = H.field := numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P @@ -1106,13 +1100,11 @@ private noncomputable def (σ : H.field.toSubgroup) (x : abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below) : SeparableClosure ℚ := by - let F := - abstractFixedField ℚ (SeparableClosure ℚ) H.field + let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below - let j : E →ₐ[ℚ] SeparableClosure ℚ := - E.val.restrictScalars ℚ + let j : E →ₐ[ℚ] SeparableClosure ℚ := E.val.restrictScalars ℚ have hBase : numberFieldEmbeddedBaseSubgroup F E j = H.field := numberFieldEmbeddedBaseSubgroup_abstractFixedFieldInclusion H P diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean index 983a0c6708..d2052122b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -322,11 +322,8 @@ noncomputable def padicCompletedChangedFieldResidueEmbedding 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 := by - ext x - exact D.val.commutes x + 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) := @@ -393,11 +390,8 @@ noncomputable def 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 := by - ext x - exact M.val.commutes x + 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) := @@ -637,11 +631,8 @@ theorem 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 := by - ext x - exact M.val.commutes x + 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) := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean index 1729e7dae9..33029436e6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -4,1317 +4,12 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp -/-! -Restricts the logarithm series to principal units and places its values in the corresponding -additive ideal. --/ - -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) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F n w = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow - F n hn ⟨w0, hw0⟩ := by - intro w w0 hw0eq hw0 - subst w0 - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply] - congr 1 - dsimp - apply Subtype.ext - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val] - apply Units.ext - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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_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) : - (((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_ofWithZeroValuationScaled - (v := v) (p := p) e n (π := π) hπ hπval hn hlevel - hnKlog hnvalLog hnKexp hnvalExp hcomplete u) +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences -/-- 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) - -/-- 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 +/-! +# Principal-unit logarithms and exponential–logarithm equivalences -end +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..8ef0806e09 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -0,0 +1,892 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp +/-! +Restricts the logarithm series to principal units and places its values in the corresponding +additive ideal. +-/ + +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) : + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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)) = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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, + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F n w = + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow + F n hn ⟨w0, hw0⟩ := by + intro w w0 hw0eq hw0 + subst w0 + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply] + congr 1 + dsimp + apply Subtype.ext + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val] + apply Units.ext + rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.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_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) : + (((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_ofWithZeroValuationScaled + (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..0ae1bc6843 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core +/-! +Packages inverse exponential and logarithm series as equivalences of deep principal units. +-/ + +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/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index 1c030ce2c5..d0ab5c785e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -412,6 +412,28 @@ noncomputable def mixedFirstPrincipalUnitFiniteQuotientSetup 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 @@ -466,28 +488,8 @@ noncomputable def chosenMixedFirstPrincipalUnitAlgebraicData letI hTModule : Module R T := Submodule.module T letI : Finite T := exactData.finiteTorsion letI hqAddGroup : AddGroup q := inferInstance - let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup - (F.toCompleteDVF) 1 - let valuationUnitsToFieldUnits := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits - F.toCompleteDVF - 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 := by - exact Units.val_injective.comp - (hvaluationUnitsToFieldUnits.comp Subtype.val_injective) have hcyclic : IsAddCyclic T := - isAddCyclic_of_injective_multiplicative_map - T.subtype.toAddMonoidHom principalToField - T.subtype_injective hprincipalToField + isAddCyclic_principalUnit_torsion F.toCompleteDVF R let tproj : T →ₗ[R] q := exactData.torsionProjection have hqP : IsPGroup p (Multiplicative q) := F.discretePrincipalUnitQuotient_isPGroup n diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index 28daf15202..588a4bc50b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -1274,6 +1274,87 @@ theorem padicCyclotomicUnramifiedArithmeticFrobenius_generates 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 @@ -1323,31 +1404,16 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top 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 := 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 - 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 + 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 := 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 : IsFractionRing W L := + inferInstanceAs (IsFractionRing Wv L) have hUnramified : FiniteUnramifiedExtension vK vL hExt := padicCyclotomicUnramified_finiteUnramifiedExtension vK vL hExt hhens hk hpn hζ hζgen @@ -1358,32 +1424,8 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top 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 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 + 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 @@ -1410,10 +1452,6 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top exact hresfin let : Algebra.IsAlgebraic k ell := @Algebra.IsAlgebraic.of_finite k ell _ _ _ _ hresfinAlgebra - have hfinTopAlgebra : - FiniteDimensional k (⊤ : IntermediateField k ell) := - @IntermediateField.finiteDimensional_left - k ell _ _ _ (⊤ : IntermediateField k ell) hresfinAlgebra have hn : 0 < n := padicCyclotomicUnramified_order_pos hpn have hζIntegralV : IsIntegral V ζ := padicCyclotomicUnramified_primitiveRoot_isIntegral hn hζ @@ -1446,15 +1484,9 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top 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) := by - refine ⟨?_⟩ - intro hzero - apply hnCastK - 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 + 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 @@ -1476,51 +1508,14 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := padicCyclotomicUnramified_finrank_eq_residueDegree vK hhens hk hpn hζ hζgen - have hfullResidueDegree : - @Module.finrank k ell _ _ residueModule = - padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by - have hdegree : - Module.finrank K L = - @Module.finrank k ell _ _ residueModule := by - change Module.finrank K L = exponentialResidueDegree vK vL hExt - exact hUnramified.2 - rw [← hdegree] - exact hfieldDegree have hfullResidueDegreeAlgebra : @Module.finrank k ell _ _ algebraModule = padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := by - calc - @Module.finrank k ell _ _ algebraModule = - @Module.finrank k ell _ _ residueModule := by - rw [hresidueModule] - _ = padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := - hfullResidueDegree - have halphaSubDegree : - Module.finrank k - (IntermediateField.adjoin k ({alpha} : Set ell)) = - padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := - padicCyclotomicUnramified_residue_adjoin_finrank hk hpn halphaPrimitive - have halphaTop : - IntermediateField.adjoin k ({alpha} : Set ell) = - (⊤ : IntermediateField k ell) := by - refine @IntermediateField.eq_of_le_of_finrank_eq - k ell _ _ _ - (IntermediateField.adjoin k ({alpha} : Set ell)) - (⊤ : IntermediateField k ell) hfinTopAlgebra le_top ?_ - calc - Module.finrank k - (IntermediateField.adjoin k ({alpha} : Set ell)) = - padicCyclotomicUnramifiedResidueDegree n (p ^ r) (hpn.pow_left r) := - halphaSubDegree - _ = @Module.finrank k ell _ _ algebraModule := - hfullResidueDegreeAlgebra.symm - _ = Module.finrank k (⊤ : IntermediateField k ell) := by - simp - have halphaAlgTop : - Algebra.adjoin k ({alpha} : Set ell) = - (⊤ : Subalgebra k ell) := - Algebra.adjoin_eq_top_of_primitive_element - (Algebra.IsAlgebraic.isAlgebraic alpha) halphaTop + 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 @@ -1578,42 +1573,8 @@ theorem padicCyclotomicUnramified_valuationSubring_adjoin_eq_top rw [hres, hP] rw [sub_eq_zero] simpa [alpha, Polynomial.aeval_def] using hfbar.symm - have htop : - (⊤ : Submodule V W) ≤ - A.toSubmodule ⊔ - IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := by - intro b _hb - rcases hcongr b with ⟨z, hzA, hdiff⟩ - have hdiffMap : - b - z ∈ Ideal.map i (IsLocalRing.maximalIdeal V) := by - simpa [hmapMaximal] using hdiff - have hdiffSmul : - b - z ∈ - IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := by - have hdiffMap' : - b - z ∈ Ideal.map (algebraMap V W) - (IsLocalRing.maximalIdeal V) := by - change b - z ∈ Ideal.map i (IsLocalRing.maximalIdeal V) - exact hdiffMap - simpa [Ideal.smul_top_eq_map] using hdiffMap' - have hsum : - z + (b - z) ∈ - A.toSubmodule ⊔ - IsLocalRing.maximalIdeal V • (⊤ : Submodule V W) := - Submodule.add_mem_sup hzA hdiffSmul - have hsum_eq : z + (b - z) = b := by ring - simpa [hsum_eq] using hsum - have hjac : - IsLocalRing.maximalIdeal V ≤ - Ideal.jacobson (⊥ : Ideal V) := by - exact IsLocalRing.maximalIdeal_le_jacobson (⊥ : Ideal V) - have hle : (⊤ : Submodule V W) ≤ A.toSubmodule := - Submodule.le_of_le_smul_of_le_jacobson_bot - (I := IsLocalRing.maximalIdeal V) (N := A.toSubmodule) - (N' := (⊤ : Submodule V W)) Module.Finite.fg_top hjac htop - have hA : A.toSubmodule = ⊤ := le_antisymm le_top hle refine ⟨a, rfl, ?_⟩ - exact Algebra.toSubmodule_eq_top.mp hA + 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(ζ)`. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index a039adba54..b43d5f43da 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -380,24 +380,12 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr exact (_root_.Valuation.mem_valuationSubring_iff targetM.valuation (a : M)).1 a.property⟩ - left_inv := by - intro a - apply Subtype.ext - exact e.symm_apply_apply (a : IntermediateField.fixedField H) - right_inv := by - intro a - apply Subtype.ext - exact e.apply_symm_apply (a : M) - map_mul' := by - intro a b - apply Subtype.ext - exact e.map_mul (a : IntermediateField.fixedField H) - (b : IntermediateField.fixedField H) - map_add' := by - intro a b - apply Subtype.ext - exact e.map_add (a : IntermediateField.fixedField H) - (b : IntermediateField.fixedField H) } + 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) = From 6a676d7631a2689711cad46409cd46be0f02a948 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 01:19:35 +0000 Subject: [PATCH 12/33] Factor norm transport and reciprocity proofs; isolate local instance names --- .../Construction/MainNaturality.lean | 48 ++-- .../Reciprocity/Core.lean | 88 +++--- .../AdeleBaseChange.lean | 272 +++++++++--------- .../Idele/NormTopology/ArchimedeanNorm.lean | 104 +++---- .../Idele/NormTopology/Continuity.lean | 131 +++------ .../Relative/FiniteIntegralNormPreimage.lean | 2 +- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 139 ++------- .../IdeleClassHerbrandSupportedFinal.lean | 28 +- .../Reciprocity/CyclotomicIdeleValue.lean | 4 +- .../Reciprocity/CyclotomicPrincipalIdele.lean | 5 +- .../Reciprocity/InfinitePlaceArtin.lean | 107 +++---- .../RationalCyclotomicArithmeticProduct.lean | 28 +- .../RationalCyclotomicCharacterRigidity.lean | 5 +- .../RationalCyclotomicFinitePlaceArtin.lean | 10 +- ...ationalCyclotomicPrincipalAwayProduct.lean | 11 +- ...ationalCyclotomicPrincipalPrimeFactor.lean | 5 +- .../RationalCyclotomicPrincipalProduct.lean | 5 +- .../RationalCyclotomicRayNorm.lean | 5 +- .../RationalCyclotomicZHatRigidity.lean | 5 +- .../RationalPrimeFactorization.lean | 5 +- .../RationalPrincipalLocalUnit.lean | 5 +- ...tionalCyclotomicArithmeticReciprocity.lean | 10 +- .../RationalRayClassFieldCyclotomic.lean | 15 +- .../LocalReciprocity/FixedFieldLocalData.lean | 209 +++++--------- 24 files changed, 498 insertions(+), 748 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index d32f11a91e..4fed670197 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -1040,6 +1040,28 @@ theorem finiteReciprocityNaturalityFrobeniusConjugationLift_coe 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 @@ -1376,12 +1398,6 @@ theorem finiteReciprocityNaturality_conjugation_commutes let Ks : FiniteAbstractField G := K.conjugate s let KRs : D.FiniteResidueAbstractField := Ks.toFiniteResidueAbstractField D - have hKRs_conjugate : KR.conjugate s = KRs := by - dsimp [KRs, Ks, KR] - unfold FiniteAbstractField.toFiniteResidueAbstractField - unfold FiniteAbstractField.conjugate - unfold DegreeData.FiniteResidueAbstractField.conjugate - rfl let hLsfiniteKs : Finite (Ks.field.toSubgroup ⧸ extensionSubgroup Ks.field (conjugateClosedSubgroup L s) @@ -1419,10 +1435,8 @@ theorem finiteReciprocityNaturality_conjugation_commutes let σ := D.chosenFiniteReciprocityFrobeniusLift KR L hLK q.toMul let σs : D.FrobeniusElements KRs (conjugateClosedSubgroup L s) - (conjugateClosedSubgroup_mono hLK s) := by - subst KRs - exact D.finiteReciprocityNaturalityFrobeniusConjugationLift - KR L hLK 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 @@ -1436,19 +1450,7 @@ theorem finiteReciprocityNaturality_conjugation_commutes (conjugateClosedSubgroup_mono hLK s) σs = finiteReciprocityNaturalityConjugation K.field L hLK s q.toMul rw [← hσ] - symm - change finiteReciprocityNaturalityConjugation K.field L hLK s - (D.extensionRestriction KR.field L hLK σ.1) = - D.extensionRestriction KRs.field - (conjugateClosedSubgroup L s) - (conjugateClosedSubgroup_mono hLK s) σs.1 - unfold σs - cases hKRs_conjugate - dsimp only [id] - rw [D.finiteReciprocityNaturalityFrobeniusConjugationLift_coe] - refine Quotient.inductionOn' σ.1 ?_ - intro k - rfl + exact D.frobeniusRestriction_conjugationLift KR L hLK s σ let S := D.frobeniusFixedField KR L hLK σ let Ss := D.frobeniusFixedField KRs (conjugateClosedSubgroup L s) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean index ae11cc8de1..2d46627e81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -174,6 +174,47 @@ private theorem classFieldAxiom_unramifiedUnits_hMinusOne 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) @@ -221,37 +262,13 @@ private theorem classFieldAxiom_unramifiedUnits_hZero have hcycleValNorm : LinearMap.range T.moduleCatToCycles ≤ LinearMap.ker cycleVal := by rintro x ⟨y, rfl⟩ - 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 - (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 hvalNorm : - v.valuationAt E.field - (extensionFixedRepresentationEquiv A K L hLK hnormal - (M.norm.hom y)) = - n • v.valuationAt E.field yL := by - rw [hnormM, - v.valuationAt_fixedFieldInclusion_of_unramified E hUnramified normK] - apply Subtype.ext - exact htower.symm change v.valueModulo n hn (v.valuationAt E.field (extensionFixedRepresentationEquiv A K L hLK hnormal (M.norm.hom y))) = 0 - rw [hvalNorm] - exact v.valueModulo_nsmul n hn (v.valuationAt E.field yL) + 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 @@ -283,8 +300,7 @@ private theorem classFieldAxiom_unramifiedUnits_hZero 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 + 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 := @@ -355,16 +371,13 @@ private theorem classFieldAxiom_unramifiedUnits_hZero 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 := by - exact (Submodule.Quotient.mk_eq_zero _).1 huClass + 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 := by - exact congrArg Subtype.val hy + 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 + 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 @@ -407,8 +420,7 @@ private theorem classFieldAxiom_unramifiedUnits_hZero (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 + have hzeroS : Limits.IsZero S.homology := (S.exact_iff_isZero_homology).1 hExact exact Limits.IsZero.of_iso hzeroS (TateCohomology.isoFiniteCyclicZero U g hg) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index 6e7a04c008..f7da0caaa8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -628,6 +628,146 @@ theorem adeleToRelativeAdele_finiteComponent 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 : @@ -706,136 +846,8 @@ noncomputable def relativeAdeleBaseChangeRingEquiv : (K := K) (L := L) y w] rw [(relativeFiniteTensorPiRingEquiv (K := K) (L := L)).apply_symm_apply] - map_add' x 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 - map_mul' x 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 + map_add' := relativeAdeleToAdele_map_add + map_mul' := relativeAdeleToAdele_map_mul /-- Finite-coordinate formula for scalar extension of a pure relative adele tensor. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean index 5afa12e7a6..70c255e04c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean @@ -53,6 +53,27 @@ private theorem nnnormUnitHom_real_normUnits_complex 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 @@ -95,41 +116,11 @@ private theorem nnnormUnitHom_normUnits_infinitePlace InfinitePlace.Completion.extensionEmbeddingOfIsReal_apply] using (InfinitePlace.Completion.liesOver_extensionEmbedding_apply W (v := v₀)).symm - have hNorm := - LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension - hCompatible x rw [InfinitePlace.mult_isReal ⟨v₀, hvReal⟩, - InfinitePlace.mult_isReal ⟨W, hWReal⟩, - pow_one, 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) := by - simp [LocalFieldTheory.normUnits] - _ = nnnormUnitHom W.Completion x := - nnnormUnitHom_map_ringEquiv_of_isometry - eExtension - (InfinitePlace.Completion.isometryEquivRealOfIsReal - hWReal).isometry x + 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 := @@ -190,45 +181,14 @@ private theorem nnnormUnitHom_normUnits_infinitePlace InfinitePlace.Completion.ringEquivComplexOfIsComplex hvComplex have hCore (eExtension : W.Completion ≃+* ℂ) - (hCompatible : - RingHom.comp (algebraMap ℂ ℂ) eBase.toRingHom = - RingHom.comp eExtension.toRingHom - (algebraMap v₀.Completion 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 := by - have hNorm := - LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension - hCompatible x - 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.isometryEquivComplexOfIsComplex - hvComplex).isometry _ - _ = - nnnormUnitHom ℂ - (LocalFieldTheory.normUnits ℂ ℂ - (Units.mapEquiv eExtension.toMulEquiv x)) := by - rw [hNorm] - _ = - nnnormUnitHom ℂ - (Units.mapEquiv eExtension.toMulEquiv x) := by - simp [LocalFieldTheory.normUnits] - _ = nnnormUnitHom W.Completion x := - nnnormUnitHom_map_ringEquiv_of_isometry - eExtension hExtensionIsometry x + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean index 1058824c85..510842a602 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -206,6 +206,29 @@ private noncomputable def integralInfiniteNormComponents 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 @@ -267,30 +290,9 @@ private theorem infinitePlace_normUnits_continuous intro x apply Units.ext rfl - have hNormEq : - (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - fun x => - eBaseUnits.symm - (LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x)) := by - funext x - apply eBaseUnits.injective - calc - eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x) := by - simpa only [eBaseUnits, eExtensionUnits] using - (LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension hCompatible x) - _ = eBaseUnits - (eBaseUnits.symm - (LocalFieldTheory.normUnits ℝ ℝ (eExtensionUnits x))) := by - simp - change Continuous (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) - rw [hNormEq] - exact hBaseUnitsContinuous.comp - ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℝ).comp - hExtensionUnitsContinuous) + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℝ) · let eBase := InfinitePlace.Completion.ringEquivRealOfIsReal hvReal let eExtension := @@ -323,30 +325,9 @@ private theorem infinitePlace_normUnits_continuous intro x apply Units.ext rfl - have hNormEq : - (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - fun x => - eBaseUnits.symm - (LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x)) := by - funext x - apply eBaseUnits.injective - calc - eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x) := by - simpa only [eBaseUnits, eExtensionUnits] using - (LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension hCompatible x) - _ = eBaseUnits - (eBaseUnits.symm - (LocalFieldTheory.normUnits ℝ ℂ (eExtensionUnits x))) := by - simp - change Continuous (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) - rw [hNormEq] - exact hBaseUnitsContinuous.comp - ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℝ ℂ).comp - hExtensionUnitsContinuous) + 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 := @@ -393,30 +374,9 @@ private theorem infinitePlace_normUnits_continuous intro x apply Units.ext rfl - have hNormEq : - (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - fun x => - eBaseUnits.symm - (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x)) := by - funext x - apply eBaseUnits.injective - calc - eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x) := by - simpa only [eBaseUnits, eExtensionUnits] using - (LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension hCompatible x) - _ = eBaseUnits - (eBaseUnits.symm - (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x))) := by - simp - change Continuous (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) - rw [hNormEq] - exact hBaseUnitsContinuous.comp - ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ).comp - hExtensionUnitsContinuous) + exact normUnits_continuous_of_ringEquivs eBase eExtension hCompatible + hBaseUnitsContinuous hExtensionUnitsContinuous + (LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ) · let eExtension := (InfinitePlace.Completion.ringEquivComplexOfIsComplex hWComplex).trans (starRingAut (R := ℂ)) @@ -449,30 +409,9 @@ private theorem infinitePlace_normUnits_continuous have hExtensionUnitsContinuous : Continuous eExtensionUnits := by change Continuous (Units.map eExtension.toMonoidHom) exact hExtensionContinuous.units_map _ - have hNormEq : - (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - fun x => - eBaseUnits.symm - (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x)) := by - funext x - apply eBaseUnits.injective - calc - eBaseUnits (LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) = - LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x) := by - simpa only [eBaseUnits, eExtensionUnits] using - (LocalClassFieldTheory.normUnits_map_ringEquiv - eBase eExtension hCompatible x) - _ = eBaseUnits - (eBaseUnits.symm - (LocalFieldTheory.normUnits ℂ ℂ (eExtensionUnits x))) := by - simp - change Continuous (fun x : W.1.Completionˣ => - LocalFieldTheory.normUnits v₀.Completion W.1.Completion x) - rw [hNormEq] - exact hBaseUnitsContinuous.comp - ((LocalFieldTheory.normUnits_continuous_of_finiteDimensional ℂ ℂ).comp - hExtensionUnitsContinuous) + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean index ad43bba025..4b41f39707 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -372,7 +372,7 @@ theorem prod_norm_finitePlaceLocalTensorDecompositionUnitsComponent_single_eq [∀ u : AbsoluteValueExtension (HeightOneSpectrum.adicAbv K v₀) L, - Module.Finite + Algebra (HeightOneSpectrum.adicAbv K v₀).Completion u.1.Completion] (hNorm : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index 85aad8b580..c0db0b6108 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -1220,20 +1220,8 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card obtain ⟨hExtended, hExtendedValue⟩ := extendedFullLogLattice_herbrandQuotient_eq_stabilizerProduct K L hS σ hgen - let extendedH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (Multiplicative - (extendedFullLogLattice L S))) := - hExtended.1 - let extendedHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (Multiplicative - (extendedFullLogLattice L S)) σ) := - hExtended.2 + let extendedH0Finite := hExtended.1 + let extendedHMinusOneFinite := hExtended.2 let e := extendedFullLogLatticeMulEquivProdInt L S have he : @@ -1250,35 +1238,15 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card ⟨herbrandH0Finite_of_equivariantMulEquiv e he, herbrandHMinusOneFinite_of_equivariantMulEquiv e he σ⟩ - let productH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S × ℤ))) := - hProduct.1 - let productHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ) := - hProduct.2 + let productH0Finite := hProduct.1 + let productHMinusOneFinite := hProduct.2 let hInteger : HerbrandQuotientDefined (L ≃ₐ[K] L) (Multiplicative ℤ) σ := ⟨trivialIntHerbrandH0Finite, trivialIntHerbrandHMinusOneFinite σ⟩ - let integerH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) (Multiplicative ℤ)) := - hInteger.1 - let integerHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) (Multiplicative ℤ) σ) := - hInteger.2 + let integerH0Finite := hInteger.1 + let integerHMinusOneFinite := hInteger.2 let hLattice := herbrandQuotientDefined_left_of_middle_right (fullLogLatticeProdIntIncl L S) @@ -1289,32 +1257,9 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (fullLogLatticeProdIntIncl_injective L S) (fullLogLatticeProdIntProj_surjective L S) σ hgen hProduct hInteger - let latticeH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S))) := - hLattice.1 - let latticeHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S)) σ) := - hLattice.2 - have hMultiplicative : - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative - (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ = - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative - (SUnitGroup.fullLogLattice (K := L) S)) σ * - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative ℤ) σ := + let latticeH0Finite := hLattice.1 + let latticeHMinusOneFinite := hLattice.2 + have hMultiplicative := herbrandQuotient_multiplicative_of_shortExact (fullLogLatticeProdIntIncl L S) (fullLogLatticeProdIntProj L S) @@ -1324,24 +1269,8 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (fullLogLatticeProdIntIncl_injective L S) (fullLogLatticeProdIntProj_surjective L S) σ hgen - have hIntegerValue : - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative ℤ) σ = - (Fintype.card (L ≃ₐ[K] L) : ℚ) := - trivialInt_herbrandQuotient_eq_card σ - have hExtendedProduct : - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative - (extendedFullLogLattice L S)) σ = - herbrandQuotient - (G := L ≃ₐ[K] L) - (A := Multiplicative - (SUnitGroup.fullLogLattice (K := L) S × ℤ)) σ := by - exact - herbrandQuotient_eq_of_equivariantMulEquiv - e he σ + 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 @@ -1483,40 +1412,16 @@ theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card obtain ⟨hLattice, hLatticeValue⟩ := fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card K L hS σ hgen - let latticeH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S))) := - hLattice.1 - let latticeHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (Multiplicative - (SUnitGroup.fullLogLattice (K := L) S)) σ) := - hLattice.2 + let latticeH0Finite := hLattice.1 + let latticeHMinusOneFinite := hLattice.2 let hTorsion : HerbrandQuotientDefined (L ≃ₐ[K] L) (CommGroup.torsion (SUnitGroup (K := L) S)) σ := ⟨inferInstance, inferInstance⟩ - let torsionH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (CommGroup.torsion - (SUnitGroup (K := L) S))) := - hTorsion.1 - let torsionHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (CommGroup.torsion - (SUnitGroup (K := L) S)) σ) := - hTorsion.2 + let torsionH0Finite := hTorsion.1 + let torsionHMinusOneFinite := hTorsion.2 let hSUnit := herbrandQuotientDefined_middle_of_left_right (CommGroup.torsion @@ -1532,18 +1437,8 @@ theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card (SUnitGroup (K := L) S)).subtype_injective (sUnitFullLogMulHom_surjective L S) σ hgen hTorsion hLattice - let sUnitH0Finite : - Finite - (HerbrandH0 - (L ≃ₐ[K] L) - (SUnitGroup (K := L) S)) := - hSUnit.1 - let sUnitHMinusOneFinite : - Finite - (HerbrandHMinusOne - (L ≃ₐ[K] L) - (SUnitGroup (K := L) S) σ) := - hSUnit.2 + let sUnitH0Finite := hSUnit.1 + let sUnitHMinusOneFinite := hSUnit.2 have hMultiplicative : herbrandQuotient (G := L ≃ₐ[K] L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index be509b6960..55037198f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -1210,30 +1210,10 @@ theorem relativeIdeleLocalTensorDecompositionSupportedSubgroupAction (K := K) (L := L) S let classAction := ideleClassMulDistribMulAction K L - let hU0 : - Finite - (HerbrandH0 (L ≃ₐ[K] L) - (SUnitGroup (K := L) - (finitePlacesAbove (K := K) (L := L) S))) := - hUnitDefined.1 - let hUm : - Finite - (HerbrandHMinusOne (L ≃ₐ[K] L) - (SUnitGroup (K := L) - (finitePlacesAbove (K := K) (L := L) S)) σ) := - hUnitDefined.2 - let hS0 : - Finite - (HerbrandH0 (L ≃ₐ[K] L) - (relativeIdeleLocalTensorDecompositionSupportedSubgroup - (K := K) (L := L) S)) := - hSupportedDefined.1 - let hSm : - Finite - (HerbrandHMinusOne (L ≃ₐ[K] L) - (relativeIdeleLocalTensorDecompositionSupportedSubgroup - (K := K) (L := L) S) σ) := - hSupportedDefined.2 + 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) →* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean index 137dc46216..abd95e044a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -574,9 +574,7 @@ theorem σ.1 * (1 : F.fixingSubgroup).1 = σ.1 by exact congrArg Subtype.val (mul_one σ)] exact hσU₀ - have hVnhds : - V ∈ 𝓝 ((1 : F.fixingSubgroup).1) := - hVopen.mem_nhds hVone + have hVnhds := hVopen.mem_nhds hVone have hkrull := InfiniteGalois.krullTopology_mem_nhds_one_iff_of_isGalois (k := ℚ) (K := rationalCyclotomicZHatField) V diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean index 3c442f1771..84c54fc842 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -68,10 +68,11 @@ local instance rationalCyclotomicPrimePowerIsAbelianGalois attribute [local instance] rationalCyclotomicPrimePowerIsAbelianGalois open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] cyclotomicPrincipalIdelePrimeFact open scoped Classical in noncomputable local instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean index ba6c321ea7..e3a2838fca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -538,6 +538,23 @@ theorem infinitePlace_normUnits_real_real 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 @@ -658,29 +675,8 @@ theorem infinitePlaceArtinMonoidHomOfPlace_norm_restriction let phi : L →+* ℂ := (InfinitePlace.embedding w').comp (algebraMap L L') - have hphi : - NumberField.ComplexEmbedding.IsConj - phi sigmaRestricted := by - apply RingHom.ext - intro x - change - star - (InfinitePlace.embedding w' - (algebraMap L L' x)) = - InfinitePlace.embedding w' - (algebraMap L L' (sigmaRestricted x)) - rw [show - algebraMap L L' (sigmaRestricted x) = - sigmaUpper (algebraMap L L' x) by - dsimp [sigmaRestricted] - change - algebraMap L L' - ((AlgEquiv.restrictNormal - (AlgEquiv.restrictScalars K sigmaUpper) L) x) = - sigmaUpper (algebraMap L L' x) - rw [AlgEquiv.restrictNormal_commutes] - rfl] - exact (hSigmaUpper.eq (algebraMap L L' x)).symm + 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 @@ -1016,6 +1012,29 @@ theorem chosenInfinitePlaceArtinMonoidHom_eq_one_of_real_pos 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 @@ -1146,44 +1165,10 @@ theorem chosenInfinitePlaceArtinMonoidHom_ker LocalClassFieldTheory.ringEquiv_compat_symm eRealField eComplexField hCompletionCompatible have hRealComplexNormTransport : - (localNormSubgroup ℝ ℂ).map - completionUnitsEquivRealUnits.symm.toMonoidHom = - localNormSubgroup - v.Completion w.Completion := by - ext x - constructor - · rintro ⟨_, ⟨z, rfl⟩, rfl⟩ - refine ⟨eComplexUnits.symm z, ?_⟩ - simpa [completionUnitsEquivRealUnits, - eComplexUnits] using - (LocalClassFieldTheory.normUnits_map_ringEquiv - eRealField.symm eComplexField.symm - hCompletionCompatibleSymm z).symm - · rintro ⟨z, rfl⟩ - refine - ⟨normUnits ℝ ℂ (eComplexUnits z), - ⟨eComplexUnits z, rfl⟩, ?_⟩ - have hInverse : - Units.mapEquiv eComplexField.symm.toMulEquiv - (eComplexUnits z) = z := by - change - (Units.mapEquiv eComplexField.toMulEquiv).symm - (eComplexUnits z) = z - change eComplexUnits.symm (eComplexUnits z) = z - exact eComplexUnits.symm_apply_apply z - calc - completionUnitsEquivRealUnits.symm - (normUnits ℝ ℂ (eComplexUnits z)) = - normUnits v.Completion w.Completion - (Units.mapEquiv eComplexField.symm.toMulEquiv - (eComplexUnits z)) := by - simpa [completionUnitsEquivRealUnits] using - LocalClassFieldTheory.normUnits_map_ringEquiv - eRealField.symm eComplexField.symm - hCompletionCompatibleSymm - (eComplexUnits z) - _ = normUnits v.Completion w.Completion z := by - rw [hInverse] + (localNormSubgroup ℝ ℂ).map completionUnitsEquivRealUnits.symm.toMonoidHom = + localNormSubgroup v.Completion w.Completion := + localNormSubgroup_map_ringEquivs eRealField.symm eComplexField.symm + hCompletionCompatibleSymm simp only [chosenInfinitePlaceArtinMonoidHom, infinitePlaceArtinMonoidHomOfPlace, w, hUnramified] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean index 10df400c70..766c8fa701 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean @@ -26,16 +26,18 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicArithmeticProductPrimeFact open scoped Classical in -local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +local instance rationalCyclotomicArithmeticProductPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ -attribute [local instance] localNeZeroInstance1 +attribute [local instance] rationalCyclotomicArithmeticProductPositiveLevelNeZero section ArbitraryCyclotomicLevel @@ -240,34 +242,40 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime] open scoped Classical in -local instance localPrimesInstance2 (p : Nat.Primes) (k : ℕ) : +/-- 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] localPrimesInstance2 +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelNumberField open scoped Classical in -local instance localPrimesInstance3 (p : Nat.Primes) (k : ℕ) : +/-- 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] localPrimesInstance3 +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelFiniteDimensional open scoped Classical in -local instance localPrimesInstance4 (p : Nat.Primes) (k : ℕ) : +/-- 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] localPrimesInstance4 +attribute [local instance] rationalCyclotomicArithmeticProductPrimePowerLevelAbelianGalois open scoped Classical in /-- Pointwise inversion of the chosen local characters, assembled before diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean index 65ef0d5257..fed835ba4c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean @@ -22,10 +22,11 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicCharacterRigidityPrimeFact open scoped Classical in /-- An automorphism of the full rational cyclotomic field has square one diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index ec6a0b23bb..44b3499230 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -98,16 +98,18 @@ private theorem mappedAbelianLocalArtin_eq_frobenius_zpow map_zpow] open scoped Classical in -local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := +/-- The prime subtype supplies the primality instance used at this local factor. -/ +local instance rationalCyclotomicFinitePlaceArtinPrimeFact (q : Nat.Primes) : Fact q.1.Prime := ⟨q.2⟩ -attribute [local instance] localPrimesInstance1 +attribute [local instance] rationalCyclotomicFinitePlaceArtinPrimeFact open scoped Classical in -local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +local instance rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ -attribute [local instance] localNeZeroInstance1 +attribute [local instance] rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero open scoped Classical in noncomputable local instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 5659c82863..193e3fd880 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -29,16 +29,19 @@ namespace Reciprocity open Function open scoped Classical in -local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicPrincipalAwayProductPrimeFact open scoped Classical in -local instance localNeZeroInstance1 (m : ℕ+) : NeZero (m : ℕ) := +/-- The positive cyclotomic level has nonzero underlying natural number. -/ +local instance rationalCyclotomicPrincipalAwayProductPositiveLevelNeZero + (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ -attribute [local instance] localNeZeroInstance1 +attribute [local instance] rationalCyclotomicPrincipalAwayProductPositiveLevelNeZero open scoped Classical in local instance rationalCyclotomicPrincipalPrimePowerNumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean index 90e7591226..079183cdcc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean @@ -21,10 +21,11 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicPrincipalPrimeFactorPrimeFact open scoped Classical in /-- The chosen finite-place factor at the ramified prime `p` is the direct diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean index cfc66b8def..eb04054a68 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean @@ -26,10 +26,11 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicPrincipalProductPrimeFact open scoped Classical in local instance rationalCyclotomicPrincipalProductPrimePowerNumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index 4b3e6eb8ed..2ab3dc474f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -45,10 +45,11 @@ open LocalFieldTheory.DiscreteValuationField.Examples.Qp open LubinTate open scoped Classical in -local instance localPrimesInstance1 (q : Nat.Primes) : Fact q.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicRayNormPrimeFact attribute [local instance] rationalCyclotomicPrincipalPrimeLevelFiniteDimensional diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean index fdcb53f489..6bd356afbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean @@ -24,10 +24,11 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalCyclotomicZHatRigidityPrimeFact open scoped Classical in /-- If all prime-power character reductions of the full cyclotomic diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean index d9a8a18ddf..b17c06ddf3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean @@ -24,10 +24,11 @@ namespace GlobalClassFieldTheory namespace Reciprocity open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalPrimeFactorizationPrimeFact open scoped Classical in /-- A finite set containing every prime occurring in the numerator or diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index 65571440f0..234f37eae7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -37,10 +37,11 @@ namespace Reciprocity open LocalFieldTheory.DiscreteValuationField.Examples.Qp open scoped Classical in -local instance localPrimesInstance1 (p : Nat.Primes) : Fact p.1.Prime := +/-- 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] localPrimesInstance1 +attribute [local instance] rationalPrincipalLocalUnitPrimeFact open scoped Classical in /-- The rational `p`-unit has value one for the height-one valuation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 8b51c00178..f8643bcc64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -69,20 +69,22 @@ section NonzeroOrder variable (m : ℕ) [NeZero m] open scoped Classical in -local instance localNeZeroInstance1 : NeZero (m : ℚ) := +/-- 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] localNeZeroInstance1 +attribute [local instance] rationalCyclotomicArithmeticReciprocityRationalLevelNeZero open scoped Classical in -noncomputable local instance localNumberFieldInstance1 : +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] localNumberFieldInstance1 +attribute [local instance] rationalCyclotomicArithmeticReciprocityLevelNumberField open scoped Classical in noncomputable local instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index c4ea6940a8..93538fce5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -202,30 +202,33 @@ section NonzeroOrder variable (m : ℕ) [NeZero m] open scoped Classical in -local instance localNeZeroInstance1 : NeZero (m : ℚ) := +/-- 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] localNeZeroInstance1 +attribute [local instance] rationalRayClassFieldCyclotomicRationalLevelNeZero open scoped Classical in -noncomputable local instance localNumberFieldInstance1 : +noncomputable /-- The rational cyclotomic level is a number field. -/ +local instance rationalRayClassFieldCyclotomicLevelNumberField : NumberField (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := KummerTheory.rationalCyclotomicLevel_numberField ⟨m, NeZero.pos m⟩ -attribute [local instance] localNumberFieldInstance1 +attribute [local instance] rationalRayClassFieldCyclotomicLevelNumberField open scoped Classical in -noncomputable local instance localIsAbelianGaloisInstance1 : +noncomputable /-- The rational cyclotomic level is an abelian Galois extension of the rationals. -/ +local instance rationalRayClassFieldCyclotomicLevelAbelianGalois : IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := rationalCyclotomicLevelIsAbelianGalois ⟨m, NeZero.pos m⟩ -attribute [local instance] localIsAbelianGaloisInstance1 +attribute [local instance] rationalRayClassFieldCyclotomicLevelAbelianGalois open scoped Classical in noncomputable local instance rationalCyclotomicLevelIsCyclotomicExtensionAtOrder : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 7c2ef9fb80..4ba20beb22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -1092,6 +1092,62 @@ theorem localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv 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. -/ +private 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 @@ -1120,39 +1176,8 @@ theorem (Gal(SeparableClosure K / K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) - H₀ (le_baseField H₀)) := by - 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)) + H₀ (le_baseField H₀)) := + finite_absoluteFixingQuotient_fieldRange K F i let H : FiniteAbstractField (Gal(SeparableClosure K / K)) := ⟨H₀, hHabsolute⟩ @@ -1165,33 +1190,12 @@ theorem let phi : F ≃+* F₀ := ((i.equivFieldRange).trans (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv - let rho : Gal(SeparableClosure K / F₀) := - { e.symm.toRingEquiv.trans - (sigma.toRingEquiv.trans e.toRingEquiv) with - commutes' := fun x => by - change e (sigma (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, sigma.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] } + 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 @@ -1211,39 +1215,8 @@ theorem (Gal(SeparableClosure K / K))).toSubgroup ⧸ extensionSubgroup (baseField (Gal(SeparableClosure K / K))) - H₀ (le_baseField H₀)) := by - 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)) + H₀ (le_baseField H₀)) := + finite_absoluteFixingQuotient_fieldRange K F i let H : FiniteAbstractField (Gal(SeparableClosure K / K)) := ⟨H₀, hHabsolute⟩ @@ -1306,46 +1279,14 @@ theorem e x ∈ localSeparableValuationSubring K ↔ e₀ (e₀.symm (e x)) ∈ localSeparableValuationSubring K rw [e₀.apply_symm_apply] - let sigma₀ : Gal(SeparableClosure F₀ / F₀) := - { 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 hc' : - 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 [hc', sigma.commutes, hc, phi.apply_symm_apply] } - let rho : Gal(SeparableClosure K / F₀) := - { e.symm.toRingEquiv.trans - (sigma.toRingEquiv.trans e.toRingEquiv) with - commutes' := fun x => by - change e (sigma (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, sigma.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] } + 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 @@ -1366,7 +1307,7 @@ theorem have hdegree : localResidueDegree F₀ sigma₀ = localResidueDegree F sigma := by - simpa only [sigma₀] using + simpa only [sigma₀, semilinearGaloisTransport] using localResidueDegree_semilinear_conjugation F F₀ phi c hc hvaluation sigma have hfixedDegree : From ec392378c8fe8a92c61e8b8eed4552b36b0ddf02 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 02:00:23 +0000 Subject: [PATCH 13/33] Refactor class field comparisons and clarify local imports --- .../Degree/FrobeniusFixedField.lean | 1 - .../FrobeniusClosureCommutation.lean | 1 - .../Construction/MainFiniteReciprocity.lean | 1 - .../FrobeniusActionRemainder.lean | 2 +- .../Construction/MainNaturality.lean | 2 +- .../Construction/MainTransfer.lean | 172 ++++----- .../Reciprocity/Core.lean | 3 +- .../Reciprocity/IntermediateExtension.lean | 2 +- .../Reciprocity/MaximalUnramifiedSymbol.lean | 11 +- .../IntegralTensorSupport/AbsoluteValue.lean | 1 - .../FinitePlaceCompletion.lean | 3 - .../IntegralTensorSupport/IdeleSupport.lean | 1 - .../Adele/IntegralTensorSupport/Lattice.lean | 3 - .../LocalTensorDecomposition.lean | 3 - .../Adele/LocalComponents.lean | 5 +- .../RamificationIndex.lean | 7 +- .../CompositumEmbedding.lean | 4 - .../FiniteAbelianCompositum.lean | 4 - .../Galois/AbsoluteAbelianization.lean | 24 +- .../Galois/FixedFieldLattice.lean | 4 +- .../Galois/MathlibAbsoluteAbelianization.lean | 2 +- .../Galois/MaximalAbelianSubextension.lean | 10 +- .../Galois/RelativeAbelianization.lean | 14 +- .../Idele/Cohomology/Decomposition.lean | 22 +- .../OutsideIntegralInduced/ChosenPlace.lean | 5 +- .../ChosenPlaceAction.lean | 17 +- .../LocalInduction/Action.lean | 2 +- .../LocalInduction/Inclusion.lean | 4 +- .../Idele/Extension/BaseChange.lean | 1 - .../Idele/Extension/GaloisDescent.lean | 1 - .../Idele/Relative/SPlaces.lean | 4 +- .../NumberField/TameDifferentTrace.lean | 2 +- .../HasseArf/InverseHerbrandFunction.lean | 3 - .../ClassFieldAxiom/IdeleClassFormation.lean | 10 +- .../FinitePlacePowerIndex.lean | 19 +- .../LocalResidueArithmetic.lean | 33 +- .../FinitePlaceDecomposition.lean | 1 - .../ArithmeticClassFieldCorrespondence.lean | 4 +- ...rithmeticHilbertClassFieldReciprocity.lean | 8 +- .../ArithmeticRayClassFieldReciprocity.lean | 2 +- .../ClassFieldRealization.lean | 2 +- .../Algebraic/Construction.lean | 2 +- .../Topological/Construction.lean | 2 +- .../EmbeddedAbelianSubextension.lean | 4 +- .../BigActual.lean | 6 +- .../BigOriginal.lean | 4 +- .../SmallActual.lean | 6 +- .../SmallOriginal.lean | 4 +- .../Transport.lean | 4 +- ...finiteAbelianClassFieldCorrespondence.lean | 8 +- .../GlobalClassFields/NormLimitation.lean | 22 +- .../RayClassFieldRealization.lean | 4 +- .../AbstractFixedFieldGlobalNormResidue.lean | 34 +- .../Reciprocity/ArithmeticNormalization.lean | 52 +-- .../InfinitePlaceCompatibility.lean | 19 +- .../NumberFieldComplexification.lean | 21 +- .../OverextensionArtin.lean | 11 +- .../RamifiedOverextension.lean | 14 +- .../CyclotomicAbstractFixedFieldArtin.lean | 68 ++-- .../CyclotomicIdeleClassValuation.lean | 8 +- .../CyclotomicTorsionFixedField.lean | 7 +- ...lotomicUnramifiedGeometricRestriction.lean | 9 +- .../CyclotomicUnramifiedRestriction.lean | 8 +- .../Reciprocity/CyclotomicZHatBaseChange.lean | 9 +- .../FiniteGaloisRealizationCore.lean | 22 +- .../FiniteGaloisRealizationSubextension.lean | 10 +- .../FinitePlaceArtin/Construction.lean | 1 - .../CrossLocalRestriction.lean | 2 - .../FinitePlaceArtin/TowerRestriction.lean | 102 ++--- .../FinitePlaceCyclotomicFrobeniusLift.lean | 20 +- .../Reciprocity/GlobalNormResidue.lean | 32 +- .../GlobalNormResidueAbelianization.lean | 56 +-- ...alNormResidueAbelianizationNaturality.lean | 24 +- .../GlobalNormResidueNaturality.lean | 64 ++-- .../IdeleClassDirectLimitExtension.lean | 1 - ...leClassDirectLimitFiniteTowerNormCore.lean | 4 - .../IdeleClassDirectLimitNormQuotient.lean | 26 +- .../Reciprocity/InfiniteGlobalArtin.lean | 2 +- .../InfiniteHilbertFactorNaturality.lean | 2 +- .../IntermediateNormAbelianization.lean | 22 +- .../Factorization.lean | 20 +- .../FinitePadicAuxiliaryField.lean | 15 +- .../FinitePadicCyclicData.lean | 16 +- .../SeparableClosurePadicLift.lean | 28 +- .../MathlibTopologicalGlobalReciprocity.lean | 8 +- .../MaximalAbelianGlobalArtin.lean | 2 +- .../Reciprocity/MaximalAbelianKernel.lean | 4 +- .../RationalCyclotomicFinitePlaceArtin.lean | 23 +- ...ationalCyclotomicPrincipalAwayProduct.lean | 6 +- .../RationalCyclotomicRayNorm.lean | 4 +- .../RationalPrincipalLocalUnit.lean | 39 +- .../TopologicalGlobalNormResidue.lean | 8 +- ...ogicalGlobalNormResidueAbelianization.lean | 20 +- .../ClassFieldTheory/HasseArf.lean | 72 +++- .../KroneckerWeber/Final.lean | 4 - ...GlobalCompositumLocalizationEmbedding.lean | 4 - .../LocalCyclotomicEmbedding.lean | 4 - ...tionalCyclotomicArithmeticReciprocity.lean | 6 +- .../RationalRayClassFieldCyclotomic.lean | 12 +- .../UnramifiedCompositumSupport.lean | 5 - .../FiniteRadicalSupport.lean | 1 - .../SimpleExtensionLocalBehavior.lean | 1 - .../ClassFormation/CohomologyBridge.lean | 106 +++--- .../ClassFormation/FieldUnitsHerbrand.lean | 42 +- .../ClassFormation/Hilbert90.lean | 2 +- .../ClassFormation/IntegerUnitsHerbrand.lean | 58 +-- .../LocalBlocks/FamilyClassAxiom.lean | 251 +++--------- .../ClassFormation/Main.lean | 28 +- .../ClassFormation/NormalBasis.lean | 92 +++-- .../ClassFormation/NormalBasisCohomology.lean | 18 +- .../NormalBasisGaloisAction.lean | 22 +- .../NormalBasisGradedLifting.lean | 114 +++--- .../NormalBasisInfiniteProduct.lean | 15 +- .../NormalBasisRecursiveLifting.lean | 34 +- .../ClassFormation/PrincipalUnitGraded.lean | 1 - .../ClassFormation/Valuation.lean | 6 +- .../ClassFormation/ValuationHerbrand.lean | 42 +- .../ClassFormation/ValueGroupCohomology.lean | 70 ++-- .../Finite/CyclotomicNorm/PrincipalUnits.lean | 37 +- .../Finite/CyclotomicNorm/Unramified.lean | 24 +- .../Existence/CyclotomicKummerDescent.lean | 9 - .../Finite/Existence/LocalAbsoluteData.lean | 4 +- .../LubinTateUniformizerDiagonal.lean | 72 ++-- .../Finite/Existence/MaximalKummerNorm.lean | 2 +- .../Existence/NormSubgroupOrderEmbedding.lean | 8 +- .../Finite/Existence/OrderReversal.lean | 8 +- .../UnramifiedLubinTateDiagonal.lean | 2 +- .../Existence/UnramifiedNormContainment.lean | 8 +- .../AbsoluteUnitsFixedField.lean | 6 +- .../AbstractFixedFieldNorm.lean | 14 +- .../AbstractFixedFieldUnits.lean | 6 +- .../ConcreteReciprocityCanonical.lean | 3 +- .../ConcreteReciprocityTransport.lean | 20 +- .../ConjugationNaturality.lean | 14 +- .../Filtered/AbstractUnramified.lean | 11 +- .../LocalReciprocity/Filtered/Core.lean | 4 +- .../Filtered/EqualCharacteristic.lean | 2 +- .../Filtered/FiniteAbelian.lean | 21 +- .../Filtered/InertiaUnramifiedExtension.lean | 12 +- ...niteAbelianFamilyUnramifiedCompositum.lean | 2 +- .../FiniteAbstractFixedField.lean | 54 +-- .../FiniteExtensionClassFieldAxiom.lean | 10 +- .../FiniteGaloisRealization.lean | 12 +- .../FiniteResidueFinrankTransfer.lean | 21 +- .../FiniteSubgroupResidueDegree.lean | 12 +- .../FixedFieldContinuousNaturality.lean | 132 ++++--- .../AmbientNormResidue.lean | 38 +- .../AmbientPrimeComparison.lean | 10 +- .../AmbientPrimeNormTransport.lean | 18 +- .../AmbientPrimeSymbolSetup.lean | 18 +- .../AmbientPrimeWitness.lean | 14 +- .../AmbientPrimeWitnessComparison.lean | 22 +- .../EmbeddedExtensionQuotient.lean | 2 +- .../EmbeddedInertiaComparison.lean | 6 +- .../FixedFieldNormQuotient.lean | 30 +- .../FixedFieldSpecialization.lean | 20 +- .../IntrinsicBaseEquivalence.lean | 56 +-- .../EmbeddedFrobeniusTransport.lean | 272 ++++--------- .../IntrinsicFrobeniusArtinComparison.lean | 8 +- .../IntrinsicFrobeniusClosure.lean | 20 +- .../IntrinsicFrobeniusFixedField.lean | 28 +- .../IntrinsicFrobeniusQuotientTransport.lean | 44 +-- .../NormRestriction.lean | 58 +-- .../PrimeComparison.lean | 37 +- .../LocalReciprocity/FixedFieldLocalData.lean | 51 +-- .../FixedFieldNormResidueNaturality.lean | 95 +++-- .../FixedFieldRelativeNorm.lean | 3 +- .../GaloisExtensionQuotient.lean | 12 +- .../GeneralTowerNaturality.lean | 34 +- .../HenselianValuationBase.lean | 2 +- ...ntermediateFieldNormResidueNaturality.lean | 36 +- .../IntrinsicAbsoluteData.lean | 2 +- .../LocalClassFieldAxiom.lean | 11 +- .../LocalHenselianValuation.lean | 13 +- .../LocalReciprocity/LocalResidueDatum.lean | 29 +- .../Finite/LocalReciprocity/Main.lean | 4 +- .../Finite/LocalReciprocity/NormResidue.lean | 22 +- .../NormResidueNaturality.lean | 2 +- .../SemilinearNaturality.lean | 18 +- .../SeparableFixedFieldNorm.lean | 2 - .../SeparableNormProduct.lean | 1 - .../LocalReciprocity/SeparableUnitsNorm.lean | 6 +- .../TopologicalReciprocity.lean | 40 +- .../UnramifiedComparison.lean | 29 +- .../UnramifiedNormComparison.lean | 20 +- .../UnramifiedNormalization.lean | 6 +- .../UnramifiedReciprocity.lean | 8 +- .../LocalReciprocity/ValuationSemilinear.lean | 7 +- .../Finite/Unramified/Cohomology.lean | 100 ++--- .../Unramified/PrincipalUnits/Basic.lean | 4 +- .../Unramified/PrincipalUnits/Lift.lean | 1 - .../Unramified/PrincipalUnits/NormSide.lean | 20 +- .../Unramified/PrincipalUnits/Trace.lean | 10 +- .../Finite/Unramified/ResidueNorm.lean | 8 +- .../Finite/UnramifiedConductor.lean | 16 +- .../Infinite/AbsoluteFiniteQuotients.lean | 4 +- .../AbsoluteGaloisAbelianization.lean | 4 +- .../FiniteAbelianQuotientKernels.lean | 6 +- .../Infinite/FiniteReciprocityDiagram.lean | 2 +- .../Infinite/ProfiniteLocalReciprocity.lean | 2 +- .../Kummer/LocalHilbertPairing.lean | 4 +- .../LocalHilbertPairingNondegeneracy.lean | 2 +- .../Kummer/PowerResidueTameFormula.lean | 6 +- ...risticTransportedFixedFieldComparison.lean | 2 +- ...alCharacteristicTransportedLevelTower.lean | 8 +- ...sticTransportedRealFilteredComparison.lean | 2 +- ...cteristicTransportedUpperRamification.lean | 4 +- .../LubinTateTransport.lean | 8 +- .../PadicMultiplicativeArtinComparison.lean | 10 +- .../StandardArtinComparison.lean | 8 +- .../StandardFixedFieldComparison.lean | 2 +- .../Unramified/CanonicalExtension.lean | 25 +- .../CompletedLevel/ChangedCompletedLevel.lean | 1 - .../ChangedCompletedPrimitiveAction.lean | 1 - .../ChangedPolynomialEvaluation.lean | 1 - .../FiniteLevel/DivisionPolynomial.lean | 2 - .../FiniteLevel/LevelAbelian.lean | 15 +- .../FiniteLevel/LevelAutomorphisms.lean | 15 +- .../FiniteLevel/UnitQuotientGalois.lean | 9 +- .../Frobenius/LaurentSeriesFrobenius.lean | 2 +- .../Ramification/Core.lean | 23 +- .../Ramification/DisplacementValuation.lean | 13 +- .../Ramification/GaloisAction.lean | 3 +- .../Ramification/LowerGroups.lean | 12 +- .../Ramification/PrimitivePoint.lean | 38 +- .../GaloisParameterFiltration.lean | 2 +- .../FiniteLevel/HigherUnitLevelEquiv.lean | 11 +- .../LubinTate/FiniteLevel/LevelAbelian.lean | 6 +- .../FiniteLevel/LevelAutomorphisms.lean | 14 +- .../FiniteLevel/LocalUpperRamification.lean | 16 +- .../FiniteLevel/LowerRamification.lean | 2 +- .../FiniteLevel/PrimitiveAction.lean | 5 +- .../FiniteLevel/UpperRamification.lean | 4 +- .../CompletedChangedStandardFixedField.lean | 2 +- .../CompletedChangedStandardUnramified.lean | 21 +- .../Padic/CompletedUnramifiedField.lean | 7 +- .../FiniteLevelPrimitiveRoot.lean | 6 +- .../Dedekind/PadicValuationInertia.lean | 7 +- .../PadicCyclotomicInertiaBound.lean | 25 +- .../RealLowerRamificationGroupCanonical.lean | 3 - ...initeAbelianLocalReciprocityFamilyExt.lean | 7 +- .../Cyclic/GaloisCohomology.lean | 4 +- .../HerbrandLowDegree/Cardinality.lean | 6 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 22 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 1 - .../PrincipalUnits/QuotientTower.lean | 110 +++--- .../GroupTheory/Quotient.lean | 9 +- .../Abstract/KummerAbelianAssembly.lean | 1 - .../Abstract/KummerAbelianCyclicFactors.lean | 2 +- .../ProfiniteUnitDecomposition/Swap.lean | 7 +- .../TorsionQuotientEquiv.lean | 7 +- .../Concrete/LocalUnitKummerUnramified.lean | 7 +- .../Kummer/Concrete/RadicalExtension.lean | 2 - .../Kummer/Concrete/SimpleExtensionNorm.lean | 20 +- .../Analytic/ContinuousFieldUnitLog.lean | 47 ++- .../LocalField/Analytic/LogExpContinuity.lean | 1 - .../PowerSeriesComposition.lean | 2 +- .../Analytic/LogExpSeries/Homomorphisms.lean | 95 +++-- .../LogExpSeries/InverseEstimates.lean | 9 +- .../LogExpSeries/PrincipalUnitExp.lean | 9 +- .../LogExpSeries/PrincipalUnitLog/Core.lean | 41 +- .../Analytic/LogExpSeries/SeriesTerms.lean | 4 +- .../EqualCharacteristicLaurent.lean | 37 +- .../FieldUnitDecomposition.lean | 131 ++++--- .../FieldUnitFactors.lean | 47 ++- .../IwasawaPrincipalUnits.lean | 358 ++++++++++-------- .../MixedCharacteristicQp.lean | 51 +-- .../MixedCharacteristicStructure/Core.lean | 7 +- .../DeepPrincipalUnits.lean | 7 +- .../IntegralLattice.lean | 27 +- .../Norm/Quotients.lean | 1 - .../DiscreteValuationField/PowerIndex.lean | 118 +++--- .../PrincipalUnits/Core.lean | 1 - .../RamificationInvariants.lean | 33 +- .../DiscreteValuationField/Units.lean | 1 - .../IntegerValuationUniformizer.lean | 7 +- .../LocalFieldRangeRestriction.lean | 13 +- .../RangeRestrictedTopology.lean | 7 +- .../WithZeroValuationTopology.lean | 17 +- .../FiniteUnramified.lean | 24 +- .../GaloisIntegerRing.lean | 50 +-- .../NormalizedIntegerValuation.lean | 7 +- .../PowerClassFiniteness.lean | 21 +- .../ResidueGalois.lean | 24 +- .../UniformizerPrincipalQuotient.lean | 13 +- .../UnramifiedFrobenius.lean | 18 +- .../Cyclotomic/TotallyRamified/Existence.lean | 7 +- .../TotallyRamified/IntegralClosure.lean | 7 +- .../TotallyRamified/RamificationIndex.lean | 7 +- .../TotallyRamified/ValuationRingEquiv.lean | 1 - .../Unramified/ArithmeticFrobenius.lean | 4 +- .../LocalField/Padic/PrincipalUnits.lean | 95 +++-- .../LocalField/Padic/UnitDecomposition.lean | 31 +- .../LocalField/Unramified/BaseChange.lean | 12 +- .../LocalField/Unramified/Definitions.lean | 3 - .../LocalField/Unramified/ResidueLifting.lean | 2 - .../LocalField/Unramified/Separable.lean | 3 - .../Ramification/Different.lean | 3 - .../AbsoluteGalois/AbsoluteRamification.lean | 87 +++-- .../FiniteExtensionCorrespondence.lean | 163 ++++---- .../FiniteLevelValuationRestriction.lean | 3 +- .../InfiniteGaloisCorrespondence.lean | 195 +++++----- .../Ramification/Herbrand/Average.lean | 55 ++- .../Ramification/Herbrand/FixedField.lean | 85 +++-- .../Ramification/Herbrand/Quotient.lean | 44 ++- .../HilbertRamification/BaseChange.lean | 9 +- .../DecompositionFieldLocalization.lean | 7 +- .../Dedekind/CompositumUnramified.lean | 2 - .../Dedekind/FixedFieldUnramified.lean | 5 - .../FiniteGaloisLevel.lean | 14 +- .../FiniteGaloisLevelIndependence.lean | 9 +- .../FixedFieldRamificationIndex.lean | 17 +- .../FixedFieldValuationRing.lean | 5 +- .../HilbertRamification/GaloisStabilizer.lean | 2 +- .../HilbertRamification/HerbrandFunction.lean | 39 +- .../HilbertRamification/HerbrandTheorem.lean | 43 ++- .../LocalizationDensity.lean | 9 +- .../RamificationNumberFormula.lean | 46 ++- .../UniformizerGradedHom.lean | 2 +- .../Ramification/LocalField/BaseChange.lean | 15 +- .../Ramification/LocalField/Core.lean | 44 ++- .../NormFormulaExtension.lean | 7 +- .../RamificationInvariants.lean | 3 - .../Completion/ExtensionInvariants.lean | 7 +- .../Completion/PolynomialFactors.lean | 2 +- .../TensorProductProductFormulas.lean | 1 - .../FiniteExtension/Core.lean | 109 +++--- .../FiniteExtension/Uniqueness.lean | 177 +++++---- .../DiscreteValuationField/Henselian.lean | 8 +- .../HenselianFinite.lean | 8 +- .../IntegralClosure.lean | 1 - .../Henselian/UniqueExtensionReduction.lean | 7 +- .../ValuationExtensionCriterion.lean | 7 +- .../Topology/AdicCompletionInverseLimit.lean | 7 +- .../Valuation/UniqueRing.lean | 15 +- .../Valuation/ValuedAdicComplete.lean | 9 +- 336 files changed, 3930 insertions(+), 3493 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index 74d5960412..e8f63c2d72 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -442,7 +442,6 @@ theorem extensionDegreeKernelRestriction_injective (D : DegreeData G) /-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean index 431366ba7f..0a53debd2b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean @@ -37,7 +37,6 @@ namespace DegreeData 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean index 66fd21a3fa..4c6eff5354 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -1019,7 +1019,6 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean index 64c56d1ef3..2f5ac78584 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean @@ -332,7 +332,7 @@ theorem frobeniusActionRemainder_mul (D : DegreeData G) (D.frobeniusActionConjugate K L hLK φ σ₂ (D.frobeniusExponent K L hLK σ₁)) * D.frobeniusActionRemainder K L hLK φ σ₁ := by - simp [frobeniusActionRemainder, frobeniusExponent_mul, + simp? [frobeniusActionRemainder, frobeniusExponent_mul, frobeniusActionConjugate_coe, frobeniusExponent_actionConjugate, frobeniusMul_coe, pow_add, mul_assoc] have hp : φ.1 ^ D.frobeniusExponent K L hLK σ₁ * diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index 4fed670197..50b9fc68d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -311,7 +311,7 @@ theorem finiteReciprocityNaturalityFrobeniusFixedField_le 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 [DegreeData.frobeniusClosure] + simp? [DegreeData.frobeniusClosure] change f (QuotientGroup.mk k') ∈ (closedSubgroupGenerated ({f σ.1} : Set _) : Subgroup _) exact hmap diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index 96b5300f14..fb5f310016 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -929,6 +929,49 @@ theorem transferNormNaturality_normQuotientInclusion_finiteNormClass 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 identity between the underlying values gives the corresponding subgroup sum identity. -/ +private theorem addSubgroup_eq_sum_of_coe_eq + {B : Type*} [AddCommGroup B] {H : AddSubgroup B} {ι : Type*} [Fintype ι] + (x : H) (f : ι → H) (h : (x : B) = ∑ i, (f i : B)) : x = ∑ i, f i := by + apply Subtype.ext + exact h.trans (map_sum H.subtype f Finset.univ).symm + /-- 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 @@ -992,44 +1035,27 @@ theorem transferNormNaturality_generator_square 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 := 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 + (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)) := by - change Finite (F.base.field.toSubgroup ⧸ - extensionSubgroup F.base.field L (hL.trans F.below)) - exact hLbasefinite + extensionSubgroup E.base.field L (hL.trans E.below)) := + hLbasefinite let hL'finiteE : 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 hL'finite + 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 := by - change S.toSubgroup ≤ E.base.field.toSubgroup - exact hSK + 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) := by - change Finite (E.base.field.toSubgroup ⧸ - extensionSubgroup E.base.field S hSK) - infer_instance + extensionSubgroup F.base.field S hSKF) := + D.frobeniusFixedField_finite 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) σ } + 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 @@ -1047,10 +1073,7 @@ theorem transferNormNaturality_generator_square 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 := by - change (Sβ q).toSubgroup ≤ E.field.field.toSubgroup - exact hSβK' 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 @@ -1074,8 +1097,8 @@ theorem transferNormNaturality_generator_square let Sβfinite (q : Ω) : FiniteAbstractField G := { field := Sβ q finite := inferInstance } - have hPrime (q : Ω) : v.IsPrimeElement (Sβfinite q) (πβ q) := by - exact D.transferNormNaturalityTransferFrobenius_conjugatePrime_isPrime + 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 @@ -1131,17 +1154,6 @@ theorem transferNormNaturality_generator_square (Abelianization.of (D.frobeniusRestriction E.field L hL (β q)))) = _ rw [map_sum] - let hLnormalF : - (extensionSubgroup F.base.field L (hL.trans F.below)).Normal := - hLnormal - let hL'normalF : (extensionSubgroup F.field.field L hL).Normal := - hL'normal - let hLbasefiniteF : Finite (F.base.field.toSubgroup ⧸ - extensionSubgroup F.base.field L (hL.trans F.below)) := - hLbasefinite - let hL'finiteF : Finite (F.field.field.toSubgroup ⧸ - extensionSubgroup F.field.field L hL) := - hL'finite have hLeft : (∑ q : Ω, D.transferNormNaturalityAbelianizedReciprocity A v hAxiom @@ -1153,43 +1165,14 @@ theorem transferNormNaturality_generator_square (relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q)) := by apply Fintype.sum_congr intro q - have hReciprocity : - D.finiteReciprocityHom A v hAxiom F.field L hL - (Additive.ofMul - (D.frobeniusRestriction E.field L hL (β q))) = - finiteNormClass A F.field.field L hL - (relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q)) := - D.finiteReciprocityHom_apply_eq_primeNormClass - A v hAxiom F.field L hL - (Additive.ofMul - (D.frobeniusRestriction E.field L hL (β q))) - (β q) rfl (πβ q) (by - simpa [Sβfinite, Sβ, E, - FiniteAbstractFieldExtension.toFiniteResidueAbstractExtension, - FiniteAbstractField.toFiniteResidueAbstractField] using hPrime q) - exact (D.transferNormNaturalityAbelianizedReciprocity_of - A v hAxiom F.field L hL - (D.frobeniusRestriction E.field L hL (β q))).trans hReciprocity + 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 : - 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) σ))) = - finiteNormClass A F.base.field L (hL.trans F.below) - (relativeNorm A F.base.field S hSKF π) := - (D.transferNormNaturalityAbelianizedReciprocity_of - A v hAxiom F.base L (hL.trans F.below) - (D.frobeniusRestriction (F.base.toFiniteResidueAbstractField D) L - (hL.trans F.below) σ)).trans - (D.finiteReciprocityHom_apply_eq_primeNormClass - A v hAxiom F.base L (hL.trans F.below) - (Additive.ofMul - (D.frobeniusRestriction (F.base.toFiniteResidueAbstractField D) L - (hL.trans F.below) σ)) - σ rfl π (v.chosenPrimeElement_isPrime Sfinite)) + 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 @@ -1200,30 +1183,11 @@ theorem transferNormNaturality_generator_square fixedFieldInclusion A E.base.field E.field.field E.below (relativeNorm A E.base.field S hSK π) = ∑ q : Ω, - relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q) := by - apply Subtype.ext - let valHom : ambientFixedAddSubgroup A E.field.field →+ A.V := - { toFun := fun x => x.1 - map_zero' := rfl - map_add' := fun _ _ => rfl } - change valHom (fixedFieldInclusion A E.base.field E.field.field E.below - (relativeNorm A E.base.field S hSK π)) = - valHom (∑ q : Ω, - relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q)) - rw [map_sum] - exact hNorm - have hNormSubF : - fixedFieldInclusion A F.base.field F.field.field F.below - (relativeNorm A F.base.field S hSKF π) = - ∑ q : Ω, - relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q) := by - change fixedFieldInclusion A F.base.field F.field.field F.below - (relativeNorm A F.base.field S hSKF π) = - ∑ q : Ω, - relativeNorm A F.field.field (Sβ q) (hSβK'F q) (πβ q) at hNormSub - exact hNormSub + relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q) := + addSubgroup_eq_sum_of_coe_eq _ _ hNorm + have hNormClasses := congrArg - (finiteNormClassHom A F.field.field L hL) hNormSubF + (finiteNormClassHom A F.field.field L hL) hNormSub rw [map_sum] at hNormClasses exact hNormClasses.symm.trans hRight.symm diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean index 2d46627e81..fb312cfd27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -184,7 +184,8 @@ private theorem valuationAt_unramified_representation_norm ∀ 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)) = + ((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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean index fb139053e4..9ec8c2eae6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean @@ -202,7 +202,7 @@ theorem extensionSubgroup_intermediateField_eq (L.intermediateField_le_base S) = L.intermediateSubgroup S := by ext x - simp [extensionSubgroup, intermediateField] + simp only [extensionSubgroup, intermediateField, mem_intermediateSubgroup_iff] rw [Subgroup.mem_subgroupOf] constructor · rintro ⟨y, hy, hxy⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean index a72b00c654..30be6d383d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -119,9 +119,10 @@ theorem finiteUnramifiedRestriction_mk finiteUnramifiedRestriction D K L hUnramified (QuotientGroup.mk k) = L.extensionQuotientMk k := by apply L.extensionQuotientMulEquiv.injective - simp [finiteUnramifiedRestriction, - maximalUnramifiedExtensionRestriction_mk, - FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv] + 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 /-- @@ -139,7 +140,8 @@ theorem finiteUnramifiedRestriction_frobenius rw [finiteUnramifiedRestriction, MonoidHom.comp_apply, maximalUnramifiedRestriction_frobenius] apply L.extensionQuotientMulEquiv.injective - simp [FiniteGaloisSubextension.toGaloisExtensionQuotientMulEquiv] + 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) @@ -377,7 +379,6 @@ isomorphisms. This is the generator calculation in the unramified norm-quotient 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 ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean index 0dd5880fbd..591a0e9c0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean @@ -78,7 +78,6 @@ noncomputable def realAbsoluteValueValuation 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean index 97fa5fd5e1..6b71d5f964 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean @@ -39,7 +39,6 @@ noncomputable def relativeFinitePlaceCompletionBaseMap (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)) @@ -78,7 +77,6 @@ noncomputable def relativeFinitePlaceCompletionRingHom (relativeFinitePlaceCompletionBaseMap_isometry w).continuous /-- Coercion, isometry, and surjectivity facts for the canonical ring homomorphism. -/ - @[simp] theorem relativeFinitePlaceCompletionRingHom_coe (w : HeightOneSpectrum (𝓞 K)) @@ -224,7 +222,6 @@ theorem basis_coord_isIntegral_of_integral_traces [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean index ee6a19cd40..045eaa9c80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean @@ -41,7 +41,6 @@ noncomputable def relativeIdeleLocalTensorDecompositionSupport (K := K) (L := L) /-- The support is exposed through this membership characterization. -/ - @[simp] theorem mem_relativeIdeleLocalTensorDecompositionSupport_iff (z : RelativeIdeleGroup K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean index 17cdb234d1..e914c40653 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean @@ -116,7 +116,6 @@ noncomputable def scaledRelativeExtensionBasis : (K := K) (L := L) /-- Evaluation and integrality properties of the scaled relative basis. -/ - @[simp] theorem scaledRelativeExtensionBasis_apply (i : RelativeAdeleBasisIndex (K := K) (L := L)) : @@ -165,7 +164,6 @@ noncomputable def scaledRelativeExtensionInteger (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)) : @@ -433,7 +431,6 @@ noncomputable def integralTensorBadPlaces : (K := K) (L := L))).toFinset /-- Membership in the finite bad-place set is ideal membership. -/ - @[simp] theorem mem_integralTensorBadPlaces_iff (w : HeightOneSpectrum (𝓞 K)) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean index f5a2ea5862..f114f33255 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -92,7 +92,6 @@ noncomputable def scaledRelativeBasisDiscriminantInteger : (K := K) (L := L) i⟩ /-- Coercion and nonvanishing properties of the discriminant control element. -/ - @[simp] theorem scaledRelativeBasisDiscriminantInteger_coe : (scaledRelativeBasisDiscriminantInteger @@ -135,7 +134,6 @@ noncomputable def scaledRelativeBasisDiscriminantBadPlaces : (K := K) (L := L))).toFinset /-- Membership in the discriminant bad-place set is ideal membership. -/ - @[simp] theorem mem_scaledRelativeBasisDiscriminantBadPlaces_iff (w : HeightOneSpectrum (𝓞 K)) : @@ -195,7 +193,6 @@ noncomputable def integralTensorComparisonBadPlaces : (K := K) (L := L) /-- Membership in the combined comparison bad-place set is componentwise. -/ - @[simp] theorem mem_integralTensorComparisonBadPlaces_iff (w : HeightOneSpectrum (𝓞 K)) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean index 69012586cc..323e29e5cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean @@ -67,7 +67,10 @@ theorem relativeAdeleInfiniteComponent_basis_repr (K := K) (L := L) z i).1 w := by classical rw [relativeAdeleInfiniteComponent_eq_sum_tmul_coefficients] - simp [relativeExtensionBasis, Finsupp.single_apply] + 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 * diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean index 601d23179a..3bd2e48f98 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean @@ -17,6 +17,11 @@ its valuation in the completed target is the global ramification index, and its image generates the completed base maximal ideal. -/ +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 @@ -133,7 +138,7 @@ theorem chosenFinitePlace_completed_ramificationIdx'_eq_centre exact h have hπConcreteMem (n : ℕ) : πConcrete ∈ targetDVF.maximalIdeal ^ n ↔ n ≤ eGlobal := by - rw [ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean index adb726b2be..2d54ff5e15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean @@ -103,7 +103,6 @@ noncomputable def finiteGaloisCompositumEmbeddingOfEmbeddings 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) := @@ -117,7 +116,6 @@ noncomputable def finiteGaloisCompositumEmbeddingOfEmbeddings 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⟩ @@ -127,7 +125,6 @@ noncomputable def finiteGaloisCompositumEmbeddingOfEmbeddings 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 @@ -169,7 +166,6 @@ theorem exists_finiteGaloisCompositumEmbeddingOfEmbeddings_left_eq 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean index 0e9183eaea..d1934b6dd6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -69,7 +69,6 @@ theorem isAbelianGalois_sup 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 @@ -84,7 +83,6 @@ theorem isAbelianGalois_sup 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 := @@ -92,7 +90,6 @@ theorem isAbelianGalois_sup 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') := @@ -114,7 +111,6 @@ theorem isAbelianGalois_sup rw [IntermediateField.fixingSubgroup_sup] exact ⟨hmemA, hmemB⟩ simpa [hsup] using hmem - exact { is_comm.comm := fun sigma tau ↦ by apply hr diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean index f410a134b1..c88cd4e2e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean @@ -26,16 +26,16 @@ 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 + ClosedSubgroup Gal(SeparableClosure K/K) where toSubgroup := - (commutator Gal(SeparableClosure K / K)).topologicalClosure + (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 + ((commutator Gal(SeparableClosure K/K)).topologicalClosure).Normal infer_instance /-- The maximal abelian subextension of the separable closure. -/ @@ -58,8 +58,8 @@ instance maximalAbelianExtension_isGalois : /-- 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) := + TopologicalAbelianization Gal(SeparableClosure K/K) ≃* + Gal(maximalAbelianExtension K/K) := InfiniteGalois.normalAutEquivQuotient (absoluteCommutatorClosure K) /-- The algebraic equivalence sends a quotient class to restriction to the @@ -86,13 +86,13 @@ theorem absoluteAbelianizationMulEquivMaximalAbelianGalois_continuous : /-- 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) := + 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) := + TopologicalAbelianization Gal(SeparableClosure K/K) ≃ₜ + Gal(maximalAbelianExtension K/K) := Continuous.homeoOfEquivCompactToT2 (f := (absoluteAbelianizationMulEquivMaximalAbelianGalois K).toEquiv) (absoluteAbelianizationMulEquivMaximalAbelianGalois_continuous K) @@ -104,7 +104,7 @@ noncomputable def absoluteTopologicalAbelianizationEquivMaximalAbelianGalois : /-- The absolute topological abelianization is totally disconnected. -/ instance absoluteTopologicalAbelianization_totallyDisconnectedSpace : TotallyDisconnectedSpace - (TopologicalAbelianization Gal(SeparableClosure K / K)) := + (TopologicalAbelianization Gal(SeparableClosure K/K)) := Homeomorph.totallyDisconnectedSpace (absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K).symm.toHomeomorph @@ -125,7 +125,7 @@ theorem finiteAbelianIntermediateField_le_maximalAbelianExtension E ≤ maximalAbelianExtension K := by rw [maximalAbelianExtension, IntermediateField.le_iff_le] change - (commutator Gal(SeparableClosure K / K)).topologicalClosure ≤ + (commutator Gal(SeparableClosure K/K)).topologicalClosure ≤ E.fixingSubgroup apply Subgroup.topologicalClosure_minimal · rw [← E.restrictNormalHom_ker] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean index a52db3d716..d56f72185e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean @@ -29,8 +29,8 @@ theorem fixedField_sup_eq_inf · intro x hx rw [IntermediateField.mem_fixedField_iff] intro σ hσ - let stabilizer : Subgroup (Gal(Ω / k)) := - MulAction.stabilizer (Gal(Ω / k)) x + let stabilizer : Subgroup (Gal(Ω/k)) := + MulAction.stabilizer (Gal(Ω/k)) x have hS : S ≤ stabilizer := by intro τ hτ change τ x = x diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean index ea3a0d3f1e..d808006312 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean @@ -25,7 +25,7 @@ topological abelianization are canonically isomorphic as topological groups. -/ noncomputable def absoluteGaloisGroupAbelianizationEquivSeparable (K : Type u) [Field K] : Field.absoluteGaloisGroupAbelianization K ≃ₜ* - TopologicalAbelianization Gal(SeparableClosure K / K) := + TopologicalAbelianization Gal(SeparableClosure K/K) := LocalClassFieldTheory.topologicalAbelianizationCongr (RamificationTheory.Field.absoluteGaloisGroup.separableClosureContinuousMulEquiv K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean index b7e0e722dc..df73090212 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean @@ -30,18 +30,16 @@ variable /-- 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) := + 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) ≃* + Gal(finiteNormalClosure K L/finiteNormalClosureOriginalField K L) ≃* finiteNormalClosureOriginalFixingSubgroup K L := by change - Gal(finiteNormalClosure K L / - finiteNormalClosureOriginalField K L) ≃* + Gal(finiteNormalClosure K L/finiteNormalClosureOriginalField K L) ≃* (finiteNormalClosureOriginalField K L).fixingSubgroup exact (IntermediateField.fixingSubgroupEquiv @@ -53,7 +51,7 @@ noncomputable def finiteNormalClosureMaximalAbelianSubfield : IntermediateField K (finiteNormalClosure K L) := IntermediateField.fixedField (finiteNormalClosureOriginalFixingSubgroup K L ⊔ - _root_.commutator Gal(finiteNormalClosure K L / K)) + _root_.commutator Gal(finiteNormalClosure K L/K)) /-- The maximal abelian subfield is contained in the distinguished copy of the original extension. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean index f83ac42ac7..462dd18391 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean @@ -26,13 +26,13 @@ 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 +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 + change ((commutator Gal(M/F)).topologicalClosure).Normal infer_instance /-- Maximal abelian intermediate field of a relative Galois extension. -/ @@ -56,8 +56,8 @@ local instance relativeMaximalAbelianSubextension.instIsGalois : /-- Algebraic quotient equivalence for relative abelianization. -/ noncomputable def relativeAbelianizationMulEquiv : - TopologicalAbelianization Gal(M / F) ≃* - Gal(relativeMaximalAbelianSubextension F M / F) := + TopologicalAbelianization Gal(M/F) ≃* + Gal(relativeMaximalAbelianSubextension F M/F) := InfiniteGalois.normalAutEquivQuotient (relativeCommutatorClosure F M) /-- The quotient equivalence sends a class to restriction. -/ @@ -80,8 +80,8 @@ theorem relativeAbelianizationMulEquiv_continuous : /-- 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 + TopologicalAbelianization Gal(M/F) ≃ₜ* + Gal(relativeMaximalAbelianSubextension F M/F) := by let h := Continuous.homeoOfEquivCompactToT2 (relativeAbelianizationMulEquiv_continuous F M) exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean index 1a9ab1c322..172f260815 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -358,16 +358,16 @@ theorem unramifiedLocalIntegerUnitsHerbrand_subsingleton [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension k ell] (g : Gal(ell/k)) - (hg : ∀ σ : Gal(ell / k), + (hg : ∀ σ : Gal(ell/k), σ ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure k ell Subsingleton - (HerbrandH0 (Gal(ell / k)) 𝒪[ell]ˣ) ∧ + (HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ) ∧ Subsingleton (HerbrandHMinusOne - (Gal(ell / k)) 𝒪[ell]ˣ g) := by + (Gal(ell/k)) 𝒪[ell]ˣ g) := by exact (unramified_units_tateCohomology_and_norm_surjective_for_generator k ell g hg).1 @@ -393,10 +393,10 @@ theorem unramifiedLocalIntegerUnitsHerbrand_subsingleton_frobenius galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure k ell Subsingleton - (HerbrandH0 (Gal(ell / k)) 𝒪[ell]ˣ) ∧ + (HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ) ∧ Subsingleton (HerbrandHMinusOne - (Gal(ell / k)) 𝒪[ell]ˣ φ) := by + (Gal(ell/k)) 𝒪[ell]ˣ φ) := by exact (unramified_units_tateCohomology_and_norm_surjective k ell).1 @@ -424,7 +424,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandH0Equiv MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom letI : Fintype H := Fintype.ofFinite H HerbrandH0 G (InducedModule (B := 𝒪[ell]ˣ) H) ≃* - HerbrandH0 (Gal(ell / k)) 𝒪[ell]ˣ := by + HerbrandH0 (Gal(ell/k)) 𝒪[ell]ˣ := by letI : MulDistribMulAction H 𝒪[ell]ˣ := MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom letI : Fintype H := Fintype.ofFinite H @@ -449,7 +449,7 @@ noncomputable def unramifiedInducedIntegerUnitsHerbrandHMinusOneEquiv letI : Fintype H := Fintype.ofFinite H HerbrandHMinusOne G (InducedModule (B := 𝒪[ell]ˣ) H) σ ≃* - HerbrandHMinusOne (Gal(ell / k)) 𝒪[ell]ˣ + HerbrandHMinusOne (Gal(ell/k)) 𝒪[ell]ˣ (e (subgroupGeneratorOfGenerator H σ hσ)) := by letI : MulDistribMulAction H 𝒪[ell]ˣ := MulDistribMulAction.compHom 𝒪[ell]ˣ e.toMonoidHom @@ -479,10 +479,10 @@ theorem unramifiedInducedIntegerUnitsHerbrand_subsingleton [Module.Finite 𝒪[k] 𝒪[ell]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension k ell] - (e : H ≃* Gal(ell / k)) + (e : H ≃* Gal(ell/k)) (σ : G) (hσ : ∀ τ : G, τ ∈ Subgroup.zpowers σ) : - letI : MulDistribMulAction (Gal(ell / k)) 𝒪[ell]ˣ := + letI : MulDistribMulAction (Gal(ell/k)) 𝒪[ell]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure k ell letI : MulDistribMulAction H 𝒪[ell]ˣ := @@ -494,14 +494,14 @@ theorem unramifiedInducedIntegerUnitsHerbrand_subsingleton Subsingleton (HerbrandHMinusOne G (InducedModule (B := 𝒪[ell]ˣ) H) σ) := by - let _ : MulDistribMulAction (Gal(ell / k)) 𝒪[ell]ˣ := + 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), + have hδ : ∀ τ : Gal(ell/k), τ ∈ Subgroup.zpowers (e δ) := by intro τ have hmem : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean index c8141b3a6c..c08fd19baa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean @@ -50,8 +50,7 @@ private noncomputable def (w₀ : HeightOneSpectrum (𝓞 K)) : MulDistribMulAction (Gal( - ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀ / - ChosenFinitePlaceBaseCompletion (K := K) w₀)) + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure @@ -177,7 +176,7 @@ private theorem chosenFinitePlaceDecompositionGroupEquivProvider (K := K) (L := L) w₀ let : MulDistribMulAction - (Gal(E / vK.Completion)) 𝒪[E]ˣ := + (Gal(E/vK.Completion)) 𝒪[E]ˣ := chosenFinitePlaceLocalizedIntegerUnitsGaloisActionProvider (K := K) (L := L) w₀ let : Fintype H := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean index ba48a49f07..aa4ddc5369 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean @@ -167,7 +167,7 @@ theorem (RayClass.adicAbv_isNontrivial w₀) w letI : MulDistribMulAction - (Gal(E / vK.Completion)) 𝒪[E]ˣ := + (Gal(E/vK.Completion)) 𝒪[E]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure vK.Completion E ∀ (σ : absoluteValueDecompositionGroup K w.1) @@ -189,18 +189,15 @@ canonical instances exported by `ChosenLocalization`. -/ theorem chosenFinitePlaceLocalizedIntegerUnits_unramifiedHerbrand_subsingleton (w₀ : HeightOneSpectrum (𝓞 K)) (g : Gal( - ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀ / - ChosenFinitePlaceBaseCompletion (K := K) w₀)) + ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) (hg : ∀ τ : Gal( - ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀ / - ChosenFinitePlaceBaseCompletion (K := K) w₀), + 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₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure (ChosenFinitePlaceBaseCompletion (K := K) w₀) @@ -208,14 +205,12 @@ theorem chosenFinitePlaceLocalizedIntegerUnits_unramifiedHerbrand_subsingleton Subsingleton (HerbrandH0 (Gal( - ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀ / - ChosenFinitePlaceBaseCompletion (K := K) w₀)) + 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₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ g) := by let vK := HeightOneSpectrum.adicAbv K w₀ let E := ChosenFinitePlaceLocalizedCompletion 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 index 69396625cb..f44edc6639 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean @@ -76,7 +76,7 @@ noncomputable def decompositionGroupLocalizedIntegerUnitsAction : letI := LocalInductionInternal.isIntegralClosure vK w hvK hvKna letI : MulDistribMulAction - (Gal(LocalizedCompletion vK w / vK.Completion)) + (Gal(LocalizedCompletion vK w/vK.Completion)) 𝒪[LocalizedCompletion vK w]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure vK.Completion (LocalizedCompletion vK w) 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 index 71826ab397..ebd08241c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean @@ -95,12 +95,12 @@ noncomputable def inducedIntegerUnitsToLocalPlaceBlock : (LocalizedCompletion vK w) (f.1 g) rw [f.2 h g] let : MulDistribMulAction - (Gal(LocalizedCompletion vK w / vK.Completion)) + (Gal(LocalizedCompletion vK w/vK.Completion)) 𝒪[LocalizedCompletion vK w]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure vK.Completion (LocalizedCompletion vK w) let : MulDistribMulAction - (Gal(LocalizedCompletion vK w / vK.Completion)) + (Gal(LocalizedCompletion vK w/vK.Completion)) (LocalizedCompletion vK w)ˣ := galoisGroupFieldUnitsMulDistribMulAction vK.Completion (LocalizedCompletion vK w) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean index 9880cd1339..129fc864ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -324,7 +324,6 @@ def galoisAverage omit [NumberField L] in theorem galoisAverage_eq_of_fixed - (z : RelativeAdeleRing K L) (hz : ∀ σ : L ≃ₐ[K] L, conjugation K L σ z = z) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean index 95d1a5a36b..9a5a629f20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -106,7 +106,6 @@ 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean index 19b00aea7b..fb3e6727d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean @@ -192,7 +192,9 @@ theorem relativeBasisIntegralAt_repr_mem w.adicCompletionIntegers K := by classical rcases hx with ⟨c, rfl⟩ - simp + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean index 351ee9a2c0..3566c3b522 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean @@ -77,7 +77,7 @@ theorem not_dvd_differentIdeal_of_coprime_norm_exponent 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 at h + simp? 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean index 7a8fc8037e..6584071721 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -26,11 +26,8 @@ universe u v 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] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] (t : ℝ) : ℝ := Function.invFun diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean index 05c29c64e1..4cb871d964 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean @@ -57,11 +57,11 @@ theorem rationalIdeleClassRepresentation_satisfiesClassFieldAxiom : let : IsGalois F E := abstractRelativeFixedField_isGalois ℚ (SeparableClosure ℚ) K L hLK hnormal - let eQ : Q ≃* Gal(E / F) := + let eQ : Q ≃* Gal(E/F) := abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) K L hLK hnormal - let g' : Gal(E / F) := eQ g - have hg' : ∀ σ : Gal(E / F), + let g' : Gal(E/F) := eQ g + have hg' : ∀ σ : Gal(E/F), σ ∈ Subgroup.zpowers g' := map_cyclicGenerator eQ g hg let := @@ -72,9 +72,9 @@ theorem rationalIdeleClassRepresentation_satisfiesClassFieldAxiom : let : IsCyclic Q := CyclicCohomology.isCyclic_of_generator g hg let : CommGroup Q := IsCyclic.commGroup - let : IsCyclic (Gal(E / F)) := + let : IsCyclic (Gal(E/F)) := CyclicCohomology.isCyclic_of_generator g' hg' - let : CommGroup (Gal(E / F)) := IsCyclic.commGroup + let : CommGroup (Gal(E/F)) := IsCyclic.commGroup let M := extensionFixedRepresentation rationalIdeleClassRepresentation K L hLK hnormal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean index e96030da75..f2739d1769 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean @@ -15,6 +15,19 @@ This file supplies the completion instances and local cardinality formulas used to evaluate finite-place factors in idele power quotients. -/ +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 @@ -81,7 +94,7 @@ theorem card_finitePlace_nthPowerQuotient Module.finrank ℚ_[F.residueCharacteristic] (v₀.adicCompletion K) obtain ⟨a, e⟩ := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation ν hν let U := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup @@ -116,7 +129,7 @@ theorem card_finitePlace_nthPowerQuotient (powMonoidHom (n : ℕ) : (v₀.adicCompletion K)ˣ →* (v₀.adicCompletion K)ˣ).range) := - LocalFieldTheory.DiscreteValuationField.finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits F.toCompleteDVF hπ (n : ℕ) have hindex := LocalFieldTheory.DiscreteValuationField.LocalField.mixed_fieldIndex @@ -222,7 +235,7 @@ theorem finitePlaceNthPowerDefect_eq_absNorm_maxPowDividing WithZero.exp (-((e : ℤ) * (k : ℤ))) := by simpa [F, e, k] using - LocalFieldTheory.DiscreteValuationField.LocalField.valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat + valuation_natCast_eq_exp_neg_ramificationIndex_mul_padicValNat ν (n : ℕ) n.ne_zero have hval : v.intValuation x = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean index cdf50f4d7a..1768cad691 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean @@ -17,6 +17,27 @@ This file relates global ideal norms to the residue fields and ramification invariants of the corresponding finite completions. -/ +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 @@ -98,7 +119,7 @@ theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex (ϖ : ℚ_[p]) := by dsimp [base, ϖ] at hϖval ⊢ exact - LocalFieldTheory.DiscreteValuationField.WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + isUniformizer_of_valuation_eq_exp_neg_one (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) ((LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicIntEquivValuationSubring p (p : ℤ_[p]) : @@ -106,14 +127,14 @@ theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex p).valuationSubring) : ℚ_[p]) hϖval obtain ⟨π, hπval⟩ := - LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective ν hν have hπ : target.valuation.IsUniformizer (π : E) := - LocalFieldTheory.DiscreteValuationField.WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + isUniformizer_of_valuation_eq_exp_neg_one ν (π : E) hπval obtain ⟨u, hu⟩ := - LocalFieldTheory.DiscreteValuationField.ValuedExtension.exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image + exists_unit_mul_target_uniformizer_pow_eq_base_uniformizer_image base target hϖ hπ have huval : ν ((u : target.valuationSubring) : E) = 1 := by @@ -167,7 +188,7 @@ theorem ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex congr 1 simp have hcustom := - LocalFieldTheory.DiscreteValuationField.LocalField.valuation_residueCharacteristic_eq_exp_neg_ramificationIndex + valuation_residueCharacteristic_eq_exp_neg_ramificationIndex ν have hexp : WithZero.exp @@ -290,7 +311,7 @@ theorem finrank_qp_eq_ramificationIndex_mul_residueDegree ramificationIndexOfWithZeroValuation_eq_extensionRamificationIndex ν hν] exact - LocalFieldTheory.DiscreteValuationField.ValuedExtension.degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable + degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable base target open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 2e124a02a1..23a1749b74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -36,7 +36,6 @@ theorem [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)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean index 9aa14ba550..eab9267b1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean @@ -55,7 +55,7 @@ private noncomputable def (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] : {e : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K) ≃ₜ* + (K := K) H hclosed)/K) ≃ₜ* IdeleClassGroup K ⧸ H // ∀ c : IdeleClassGroup K, e (arithmeticGlobalNormResidueMonoidHom K @@ -127,7 +127,7 @@ noncomputable def (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K) ≃ₜ* + (K := K) H hclosed)/K) ≃ₜ* IdeleClassGroup K ⧸ H := (arithmeticClosedFiniteIndexClassFieldReciprocityData (K := K) H hclosed).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean index 9e3b26236f..55dfce8502 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean @@ -117,7 +117,7 @@ private theorem open scoped Classical in private noncomputable def arithmeticBigHilbertClassFieldReciprocityData (K : Type) [Field K] [NumberField K] : - { e : Gal((bigHilbertClassField K) / K) ≃* + { e : Gal((bigHilbertClassField K)/K) ≃* RayClass.NarrowClassGroup K // ∀ c : IdeleClassGroup K, e (arithmeticGlobalNormResidueMonoidHom @@ -143,7 +143,7 @@ private noncomputable def arithmeticBigHilbertClassFieldReciprocityData open scoped Classical in private noncomputable def arithmeticSmallHilbertClassFieldReciprocityData (K : Type) [Field K] [NumberField K] : - { e : Gal((smallHilbertClassField K) / K) ≃* + { e : Gal((smallHilbertClassField K)/K) ≃* ClassGroup (𝓞 K) // ∀ c : IdeleClassGroup K, e (arithmeticGlobalNormResidueMonoidHom @@ -171,7 +171,7 @@ open scoped Classical in field over the original number field. -/ noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal : - Gal((bigHilbertClassField K) / K) ≃* + Gal((bigHilbertClassField K)/K) ≃* RayClass.NarrowClassGroup K := (arithmeticBigHilbertClassFieldReciprocityData K).1 @@ -214,7 +214,7 @@ open scoped Classical in field over the original number field. -/ noncomputable def arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOverOriginal : - Gal((smallHilbertClassField K) / K) ≃* + Gal((smallHilbertClassField K)/K) ≃* ClassGroup (𝓞 K) := (arithmeticSmallHilbertClassFieldReciprocityData K).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean index 03ea34fb5b..8ccce572bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -80,7 +80,7 @@ field, bundled with both native topologies. -/ noncomputable def arithmeticRayClassFieldGaloisContinuousMulEquivRayClassGroup (m : RayClass.Modulus K) : - Gal((rayClassField K m) / K) ≃ₜ* + Gal((rayClassField K m)/K) ≃ₜ* RayClass.RayClassGroup m := by letI normQuotientDiscreteTopology : DiscreteTopology (IdeleClassGroup K ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean index 084b9c274d..992408fdfd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -118,7 +118,7 @@ noncomputable instance let : IsGalois F E := abstractRelativeFixedField_isGalois k Ω K L.field L.below L.normal - let e : L.extensionQuotient ≃* Gal(E / F) := + let e : L.extensionQuotient ≃* Gal(E/F) := L.extensionQuotientMulEquiv.trans (abstractExtensionQuotientEquivGaloisGroup k Ω K L.field L.below L.normal) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean index 7cf225c684..daf107e596 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean @@ -43,7 +43,7 @@ noncomputable abbrev closedFiniteIndexClassFieldGaloisEquivNormQuotient (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K) ≃* + (K := K) H hclosed)/K) ≃* IdeleClassGroup K ⧸ H := (closedFiniteIndexClassFieldGaloisContinuousEquivNormQuotient (K := K) H hclosed).toMulEquiv diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean index 81ae5f72b9..d01ab9d0cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean @@ -43,7 +43,7 @@ noncomputable def (hclosed : IsClosed (H : Set (IdeleClassGroup K))) [H.FiniteIndex] : Gal((closedFiniteIndexClassField - (K := K) H hclosed) / K) ≃ₜ* + (K := K) H hclosed)/K) ≃ₜ* IdeleClassGroup K ⧸ H := (globalReciprocityContinuousMulEquiv K (closedFiniteIndexClassField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean index a0d258308e..6b605ad70e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean @@ -48,7 +48,7 @@ noncomputable def numberFieldEmbeddedAbelianSubextension commutative := by let e : (numberFieldEmbeddedFiniteGaloisSubextension K E j).extensionQuotient ≃* - Gal(E / K) := by + Gal(E/K) := by exact numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K E j @@ -58,7 +58,7 @@ noncomputable def numberFieldEmbeddedAbelianSubextension simpa only [map_mul] using (inferInstance : IsMulCommutative - (Gal(E / K))).is_comm.comm + (Gal(E/K))).is_comm.comm (e x) (e y) } } /-- The top subgroup of the embedded abelian subextension is the fixing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean index 5b127fb711..30f5f36b9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -53,8 +53,7 @@ open scoped Classical in selected big Hilbert class field with the narrow ideal class group of the original number field. -/ private noncomputable def bigHilbertClassFieldReciprocityData : - {e : Gal((bigHilbertClassField K) / - (bigHilbertClassFieldBase K)) ≃* + {e : Gal((bigHilbertClassField K)/(bigHilbertClassFieldBase K)) ≃* RayClass.NarrowClassGroup K // ∀ c : IdeleClassGroup (bigHilbertClassFieldBase K), e (globalNormResidueMonoidHom @@ -84,8 +83,7 @@ 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)) ≃* + Gal((bigHilbertClassField K)/(bigHilbertClassFieldBase K)) ≃* RayClass.NarrowClassGroup K := (bigHilbertClassFieldReciprocityData (K := K)).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean index 05586e3a5f..9867dd311d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -77,7 +77,7 @@ 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) ≃* + {e : Gal((bigHilbertClassField K)/K) ≃* RayClass.NarrowClassGroup K // ∀ c : IdeleClassGroup K, e (globalNormResidueMonoidHom K @@ -101,7 +101,7 @@ open scoped Classical in using the original number field as the scalar base. -/ noncomputable def bigHilbertClassFieldGaloisEquivNarrowClassGroupOverOriginal : - Gal((bigHilbertClassField K) / K) ≃* + Gal((bigHilbertClassField K)/K) ≃* RayClass.NarrowClassGroup K := (bigHilbertClassFieldReciprocityOverOriginalData (K := K)).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean index 067d1cadcc..620770e706 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -53,8 +53,7 @@ open scoped Classical in selected small Hilbert class field with the ordinary ideal class group of the original number field. -/ private noncomputable def smallHilbertClassFieldReciprocityData : - {e : Gal((smallHilbertClassField K) / - (smallHilbertClassFieldBase K)) ≃* + {e : Gal((smallHilbertClassField K)/(smallHilbertClassFieldBase K)) ≃* ClassGroup (𝓞 K) // ∀ c : IdeleClassGroup (smallHilbertClassFieldBase K), e (globalNormResidueMonoidHom @@ -84,8 +83,7 @@ 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)) ≃* + Gal((smallHilbertClassField K)/(smallHilbertClassFieldBase K)) ≃* ClassGroup (𝓞 K) := (smallHilbertClassFieldReciprocityData (K := K)).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean index ed8d617a80..867a57dac8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean @@ -77,7 +77,7 @@ the original number field gives the ordinary ideal class group directly. -/ private noncomputable def smallHilbertClassFieldReciprocityOverOriginalData : - {e : Gal((smallHilbertClassField K) / K) ≃* + {e : Gal((smallHilbertClassField K)/K) ≃* ClassGroup (𝓞 K) // ∀ c : IdeleClassGroup K, e (globalNormResidueMonoidHom K @@ -100,7 +100,7 @@ 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) ≃* + Gal((smallHilbertClassField K)/K) ≃* ClassGroup (𝓞 K) := (smallHilbertClassFieldReciprocityOverOriginalData (K := K)).1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean index dfc3a5c1f3..1d80b9b935 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean @@ -76,7 +76,7 @@ noncomputable def hilbertClassFieldGlobalReciprocityTransportEquiv (H : Subgroup (IdeleClassGroup F)) (h : (_root_.ideleClassNorm F E).range = H) (f : IdeleClassGroup F ⧸ H ≃* I) : - Gal(E / F) ≃* I := + Gal(E/F) ≃* I := (AddEquiv.toMultiplicative (globalReciprocityEquiv F E)).trans ((QuotientGroup.quotientMulEquivOfEq h).trans f) @@ -141,7 +141,7 @@ noncomputable def hilbertClassFieldGlobalReciprocityTransportData (H : Subgroup (IdeleClassGroup F)) (h : (_root_.ideleClassNorm F E).range = H) (f : IdeleClassGroup F ⧸ H ≃* I) : - {e : Gal(E / F) ≃* I // + {e : Gal(E/F) ≃* I // ∀ c : IdeleClassGroup F, e (globalNormResidueMonoidHom F E c) = f (QuotientGroup.mk' H c)} := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean index 1d65be9cfb..e0bfa20597 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean @@ -172,13 +172,13 @@ theorem infiniteAbelianClassFieldCorrespondence_finite_iff_open calc FiniteDimensional K L ↔ IsOpen (L.fixingSubgroup : Set - Gal(maximalAbelianExtension K / K)) := + Gal(maximalAbelianExtension K/K)) := (InfiniteGalois.isOpen_iff_finite L).symm - _ ↔ IsOpen (T : Set Gal(maximalAbelianExtension K / K)) := by + _ ↔ 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)) + IsOpen (T : Set Gal(maximalAbelianExtension K/K)) ↔ + IsOpen (T : Set Gal(maximalAbelianExtension K/K)) exact Iff.rfl _ ↔ IsOpen (H : Set (ideleClassComponentQuotient K)) := by change diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean index 96306051bd..2dc05bf077 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean @@ -45,14 +45,14 @@ theorem finiteNormalClosureMaximalAbelianSubfield_fixingSubgroup_image_eq_originalFixingSubgroup_image : (finiteNormalClosureMaximalAbelianSubfield K L).fixingSubgroup.map (Abelianization.of : - Gal(finiteNormalClosure K L / K) →* - Abelianization Gal(finiteNormalClosure K L / K)) = + 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 + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K)) := by let N := finiteNormalClosure K L - let G := Gal(N / K) + let G := Gal(N/K) let H : Subgroup G := finiteNormalClosureOriginalFixingSubgroup K L change (IntermediateField.fixedField @@ -82,8 +82,8 @@ theorem (finiteNormalClosureOriginalField K L)).range = ((finiteNormalClosureOriginalField K L).fixingSubgroup.map (Abelianization.of : - Gal(finiteNormalClosure K L / K) →* - Abelianization Gal(finiteNormalClosure K L / K))).comap + 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 @@ -92,15 +92,15 @@ theorem _ = ((finiteNormalClosureMaximalAbelianSubfield K L).fixingSubgroup.map (Abelianization.of : - Gal(finiteNormalClosure K L / K) →* - Abelianization Gal(finiteNormalClosure K L / K))).comap + 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 + Gal(finiteNormalClosure K L/K) →* + Abelianization Gal(finiteNormalClosure K L/K))).comap (Reciprocity.globalNormResidueAbelianizationMonoidHom K (finiteNormalClosure K L)) = _ rw [ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index 27f3ee8e78..4968fe0f21 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -438,7 +438,7 @@ and the native quotient topology on the ray class group. -/ noncomputable def rayClassFieldGaloisContinuousMulEquivRayClassGroup (m : RayClass.Modulus K) : - Gal((rayClassField K m) / K) ≃ₜ* + Gal((rayClassField K m)/K) ≃ₜ* RayClass.RayClassGroup m := by letI : DiscreteTopology (RayClass.RayClassGroup m) := QuotientGroup.discreteTopology @@ -515,7 +515,7 @@ open scoped Classical in 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) ≃* + Gal((rayClassField K m)/K) ≃* RayClass.RayClassGroup m := closedFiniteIndexClassFieldGaloisEquivNormQuotient (K := K) (RayClass.Modulus.congruenceSubgroup m) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 13fc24c8e4..34b4021613 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -478,7 +478,7 @@ noncomputable def [FiniteDimensional K L] [IsGalois K L] (j : L →ₐ[ℚ] SeparableClosure ℚ) : (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient ≃* - Gal(L / K) := by + Gal(L/K) := by let i := numberFieldEmbeddedLowerEmbedding K L j letI hAlgebra : Algebra K (SeparableClosure ℚ) := numberFieldEmbeddedSeparableClosureAlgebra K L j @@ -500,7 +500,7 @@ noncomputable def change (H₀.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H₀ J₀ hJH) ≃* - Gal(L / K) + Gal(L/K) exact ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ K L j e /-- The original lower field is canonically equivalent to the fixed @@ -837,13 +837,13 @@ noncomputable def Additive (Abelianization (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient) ≃+ - Additive Gal(L / K) := + Additive Gal(L/K) := MulEquiv.toAdditive ((MulEquiv.abelianizationCongr (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K L j)).trans (Abelianization.equivOfComm : - Gal(L / K) ≃* - Abelianization Gal(L / K)).symm) + 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 @@ -853,7 +853,7 @@ noncomputable def globalNormResidueEquivOfEmbedding Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive Gal(L / K) := by + Additive Gal(L/K) := by let eNorm : FiniteNormQuotient rationalIdeleClassRepresentation (numberFieldEmbeddedBaseSubgroup K L j) @@ -899,11 +899,11 @@ theorem globalNormResidueEquivOfEmbedding_finiteNormClass compatible embedding. -/ noncomputable def globalNormResidueMonoidHomOfEmbedding (j : L →ₐ[ℚ] SeparableClosure ℚ) : - IdeleClassGroup K →* Gal(L / K) := by + IdeleClassGroup K →* Gal(L/K) := by let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Gal(L / K) := + Gal(L/K) := AddEquiv.toMultiplicative (globalNormResidueEquivOfEmbedding K L j) exact @@ -1092,7 +1092,7 @@ theorem globalNormResidueMonoidHom_eq_ofEmbedding_standard : Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive (Gal(L / K)) => + Additive (Gal(L/K)) => e (Additive.ofMul (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c))) (globalNormResidueEquiv_eq_ofEmbedding_standard K L) @@ -1285,7 +1285,7 @@ noncomputable def (Abelianization (FiniteGaloisSubextension.extensionQuotient L.toFiniteGaloisExtension)) ≃+ - Additive (Gal(E / F)) := by + Additive (Gal(E/F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1294,7 +1294,7 @@ noncomputable def ℚ (SeparableClosure ℚ) L.below let e : L.extensionQuotient ≃* - Gal(E / F) := + Gal(E/F) := L.extensionQuotientMulEquiv.trans (abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) @@ -1320,7 +1320,7 @@ noncomputable def abstractFixedFieldGlobalNormResidueEquiv : Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) ≃+ - Additive (Gal(E / F)) := by + Additive (Gal(E/F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1352,8 +1352,7 @@ private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := by + ℚ (SeparableClosure ℚ) L.below)/(abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := by letI : AddCommGroup (FiniteNormQuotient rationalIdeleClassRepresentation K.field L.field L.below) := @@ -1369,8 +1368,7 @@ private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : (Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) K.field)))) + ℚ (SeparableClosure ℚ) L.below)/(abstractFixedField ℚ (SeparableClosure ℚ) K.field)))) inferInstance inferInstance inferInstance (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation @@ -1392,7 +1390,7 @@ noncomputable def ambientFixedGlobalNormResidueAddMonoidHom : ℚ (SeparableClosure ℚ) L.below ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field →+ - Additive (Gal(E / F)) := by + Additive (Gal(E/F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1425,7 +1423,7 @@ noncomputable def abstractFixedFieldGlobalNormResidueMonoidHom : let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below - IdeleClassGroup F →* Gal(E / F) := + IdeleClassGroup F →* Gal(E/F) := (ambientFixedGlobalNormResidueAddMonoidHom K L).toMultiplicative.comp (abstractFixedFieldIdeleClassToAmbientFixedMonoidHom K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean index ce68737f62..01233e3c0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean @@ -60,7 +60,7 @@ variable /-- Reuse the quotient topology chosen by topological global reciprocity. -/ local instance arithmeticGlobalNormResidueAbelianizationGaloisAbelianizationTopology : - TopologicalSpace (Abelianization (Gal(L / K))) := + TopologicalSpace (Abelianization (Gal(L/K))) := topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology K L @@ -68,19 +68,19 @@ local instance structure. -/ local instance arithmeticGlobalNormResidueAbelianization_galoisAbelianizationIsTopologicalGroup : - IsTopologicalGroup (Abelianization (Gal(L / K))) := by + IsTopologicalGroup (Abelianization (Gal(L/K))) := by change IsTopologicalGroup - (Gal(L / K) ⧸ commutator (Gal(L / K))) + (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)) := + Abelianization (Gal(L/K)) := (MulEquiv.inv - (Abelianization (Gal(L / K)))).toMonoidHom.comp + (Abelianization (Gal(L/K)))).toMonoidHom.comp (globalNormResidueAbelianizationMonoidHom K L) /-- Arithmetic normalization evaluates by inverting the geometric @@ -108,7 +108,7 @@ theorem arithmeticGlobalNormResidueAbelianizationMonoidHom_surjective : Function.Surjective (arithmeticGlobalNormResidueAbelianizationMonoidHom K L) := (MulEquiv.inv - (Abelianization (Gal(L / K)))).surjective.comp + (Abelianization (Gal(L/K)))).surjective.comp (globalNormResidueAbelianizationMonoidHom_surjective K L) /-- The arithmetic finite-Galois norm-residue isomorphism, with the @@ -118,10 +118,10 @@ noncomputable def arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃ₜ* - Abelianization (Gal(L / K)) := + Abelianization (Gal(L/K)) := (globalNormResidueAbelianizationContinuousMulEquiv K L).trans (commutativeGroupInversionContinuousMulEquiv - (Abelianization (Gal(L / K)))) + (Abelianization (Gal(L/K)))) /-- The arithmetic abelianized norm-residue equivalence is pointwise the inverse of the geometric equivalence. -/ @@ -136,12 +136,12 @@ theorem calc arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv K L q = commutativeGroupInversionContinuousMulEquiv - (Abelianization (Gal(L / K))) + (Abelianization (Gal(L/K))) (globalNormResidueAbelianizationContinuousMulEquiv K L q) := ContinuousMulEquiv.trans_apply (globalNormResidueAbelianizationContinuousMulEquiv K L) (commutativeGroupInversionContinuousMulEquiv - (Abelianization (Gal(L / K)))) q + (Abelianization (Gal(L/K)))) q _ = (globalNormResidueAbelianizationContinuousMulEquiv K L q)⁻¹ := rfl @@ -150,7 +150,7 @@ theorem global reciprocity theorem. -/ noncomputable def arithmeticGlobalReciprocityAbelianizationContinuousMulEquiv : - Abelianization (Gal(L / K)) ≃ₜ* + Abelianization (Gal(L/K)) ≃ₜ* (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := (arithmeticGlobalNormResidueAbelianizationContinuousMulEquiv @@ -200,8 +200,8 @@ variable /-- 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 + IdeleClassGroup K →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp (globalNormResidueMonoidHom K L) /-- Arithmetic normalization evaluates by inverting the geometric global @@ -227,7 +227,7 @@ theorem arithmeticGlobalNormResidueMonoidHom_ker : theorem arithmeticGlobalNormResidueMonoidHom_surjective : Function.Surjective (arithmeticGlobalNormResidueMonoidHom K L) := - (MulEquiv.inv (Gal(L / K))).surjective.comp + (MulEquiv.inv (Gal(L/K))).surjective.comp (globalNormResidueMonoidHom_surjective K L) /-- The arithmetic global norm-residue map is continuous for the @@ -243,10 +243,10 @@ group. -/ noncomputable def arithmeticGlobalNormResidueContinuousMulEquiv : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃ₜ* - Gal(L / K) := + Gal(L/K) := (globalNormResidueContinuousMulEquiv K L).trans (commutativeGroupInversionContinuousMulEquiv - (Gal(L / K))) + (Gal(L/K))) /-- The arithmetic norm-residue equivalence is pointwise the inverse of the geometric equivalence. -/ @@ -262,7 +262,7 @@ theorem arithmeticGlobalNormResidueContinuousMulEquiv_apply /-- The canonical arithmetic reciprocity isomorphism in the direction `Gal(L/K) ≃ₜ* C_K / N_{L/K}(C_L)`. -/ noncomputable def arithmeticGlobalReciprocityContinuousMulEquiv : - Gal(L / K) ≃ₜ* + Gal(L/K) ≃ₜ* (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := (arithmeticGlobalNormResidueContinuousMulEquiv K L).symm @@ -304,8 +304,8 @@ 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 + (v.adicCompletion K)ˣ →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v) @@ -337,7 +337,7 @@ theorem (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v x)⁻¹ simpa only [MonoidHom.comp_apply] using - congrArg (fun σ : Gal(L / K) => σ⁻¹) + congrArg (fun σ : Gal(L/K) => σ⁻¹) (DFunLike.congr_fun (globalNormResidueMonoidHom_comp_finitePlaceIdeleClass (K := K) (L := L) v) x) @@ -346,8 +346,8 @@ theorem normalization. -/ noncomputable def arithmeticChosenInfinitePlaceArtinMonoidHom (v : InfinitePlace K) : - v.Completionˣ →* Gal(L / K) := - (MulEquiv.inv (Gal(L / K))).toMonoidHom.comp + v.Completionˣ →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v) @@ -379,15 +379,15 @@ theorem (chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v x)⁻¹ simpa only [MonoidHom.comp_apply] using - congrArg (fun σ : Gal(L / K) => σ⁻¹) + 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 + IdeleGroup K →* Gal(L/K) := + (MulEquiv.inv (Gal(L/K))).toMonoidHom.comp (globalArtinMonoidHom (K := K) (L := L)) omit [FiniteDimensional K L] in @@ -450,7 +450,7 @@ theorem (IdeleGroup.principalSubgroup K) a))⁻¹ = (globalArtinMonoidHom (K := K) (L := L) a)⁻¹ simpa only [MonoidHom.comp_apply] using - congrArg (fun σ : Gal(L / K) => σ⁻¹) + congrArg (fun σ : Gal(L/K) => σ⁻¹) (DFunLike.congr_fun (globalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin (K := K) (L := L)) a) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean index 6400d45baf..48beeb65d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -276,10 +276,9 @@ noncomputable def ramifiedInfinitePlaceOverextensionRestriction (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) →* - Gal(L / K) := + Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) @@ -430,8 +429,7 @@ theorem (K := K) (L := L) v)).range) ≃* Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := AddEquiv.toMultiplicative (globalNormResidueEquivOfEmbedding @@ -582,7 +580,7 @@ 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) := + Gal(L/K) := globalNormResidueMonoidHom K L (IdeleGroup.infinitePlaceIdeleClass v (-1 : v.Completionˣ)) @@ -590,7 +588,7 @@ open scoped Classical in /-- The chosen local Artin value at negative one at `v`. -/ noncomputable def ramifiedInfinitePlaceLocalArtinNegOneValue (v : InfinitePlace K) : - Gal(L / K) := + Gal(L/K) := chosenInfinitePlaceArtinMonoidHom (K := K) (L := L) v (-1 : v.Completionˣ) @@ -647,8 +645,7 @@ noncomputable def (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := globalNormResidueMonoidHomOfEmbedding (ramifiedInfinitePlaceRealFixedField @@ -667,7 +664,7 @@ noncomputable def (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal(L / K) := + Gal(L/K) := ramifiedInfinitePlaceOverextensionRestriction (K := K) (L := L) v hRamified (ramifiedInfinitePlaceOverextensionGlobalNormResidueNegOneValue @@ -680,7 +677,7 @@ noncomputable def (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal(L / K) := + Gal(L/K) := globalNormResidueMonoidHomOfEmbedding K L (infinitePlaceComplexificationLowerSeparableClosureEmbedding (K := K) (L := L) v) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index 07e42fc9ca..fac492a4b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -152,8 +152,8 @@ open scoped Classical in /-- Restriction from `F(μ₄)/F` to the rational fourth-root cyclotomic factor. -/ noncomputable def numberFieldComplexificationRestriction : - Gal(numberFieldComplexification F / F) →* - Gal(rationalComplexificationCyclotomicField / ℚ) := + Gal(numberFieldComplexification F/F) →* + Gal(rationalComplexificationCyclotomicField/ℚ) := IntermediateField.restrictRestrictAlgEquivMapHom ℚ rationalComplexificationCyclotomicField F (numberFieldComplexification F) @@ -263,9 +263,8 @@ private theorem numberFieldComplexificationBaseEquiv_algebraMap open scoped Classical in private noncomputable def numberFieldComplexificationChangeBase : - Gal(numberFieldComplexification F / F) →* - Gal(numberFieldComplexification F / - numberFieldComplexificationBaseLayer F) where + Gal(numberFieldComplexification F/F) →* + Gal(numberFieldComplexification F/numberFieldComplexificationBaseLayer F) where toFun σ := { σ.toRingEquiv with commutes' := by @@ -299,15 +298,13 @@ private theorem numberFieldComplexificationChangeBase_injective : intro x exact congrArg (fun f : - Gal(numberFieldComplexification F / - numberFieldComplexificationBaseLayer F) => f x) + 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 + Gal(numberFieldComplexification F/numberFieldComplexificationBaseLayer F) →* + Gal(numberFieldComplexificationCyclotomicLayer F/ℚ) := by letI : IsGalois ℚ (numberFieldComplexificationCyclotomicLayer F) := numberFieldComplexificationCyclotomicLayer_isGalois F letI : Normal ℚ (numberFieldComplexificationCyclotomicLayer F) := @@ -334,8 +331,8 @@ private theorem numberFieldComplexificationLayerRestriction_injective : open scoped Classical in private noncomputable def numberFieldComplexificationTransportCyclotomic : - Gal(rationalComplexificationCyclotomicField / ℚ) →* - Gal(numberFieldComplexificationCyclotomicLayer F / ℚ) := + Gal(rationalComplexificationCyclotomicField/ℚ) →* + Gal(numberFieldComplexificationCyclotomicLayer F/ℚ) := (AlgEquiv.autCongr (numberFieldComplexificationCyclotomicEquiv F)).toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean index 45ddad064e..02f44cb141 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -200,8 +200,7 @@ noncomputable def (K := K) (L := L) v hRamified) →* Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := QuotientGroup.lift (IdeleGroup.principalSubgroup @@ -317,8 +316,7 @@ private noncomputable def (B := Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))) (_root_.ideleClassNorm (ramifiedInfinitePlaceRealFixedField @@ -424,7 +422,7 @@ theorem let Q := IdeleClassGroup K' ⧸ (_root_.ideleClassNorm K' L').range - let e : Q ≃* Gal(L' / K') := + let e : Q ≃* Gal(L'/K') := AddEquiv.toMultiplicative (globalNormResidueEquiv K' L') let : Finite Q := @@ -445,8 +443,7 @@ theorem {σ τ : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))} (hσ : σ ≠ 1) (hτ : τ ≠ 1) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean index daaf9bc40d..689869eeed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -346,8 +346,7 @@ noncomputable instance IsCyclic Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := e.isCyclic.mp (Subgroup.isCyclic_zpowers @@ -364,8 +363,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionConjugation (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := IntermediateField.subgroupEquivAlgEquiv (Subgroup.zpowers @@ -406,8 +404,7 @@ theorem ramifiedInfinitePlaceOverextension_eq_one_or_conjugation (σ : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))) : σ = 1 ∨ σ = @@ -474,10 +471,9 @@ noncomputable def (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : Gal( (infinitePlaceComplexificationOverfield - (K := K) (L := L) v) / - (ramifiedInfinitePlaceRealFixedField + (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) →* - Gal(rationalComplexificationCyclotomicField / ℚ) := + Gal(rationalComplexificationCyclotomicField/ℚ) := (AlgEquiv.restrictNormalHom rationalComplexificationCyclotomicField).comp (AlgEquiv.restrictScalarsHom ℚ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index 4a5ba19dbb..a609ab7d3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -83,8 +83,7 @@ noncomputable def abstractFixedFieldCyclotomicGalEquivZHat rationalCyclotomicFieldInertia_le H.field Gal( LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) hI / - LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) ≃* Multiplicative ZHat := by let hI := @@ -102,8 +101,7 @@ noncomputable def abstractFixedFieldCyclotomicGalEquivZHat hI ≃* Gal( LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) hI / - LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) H.field @@ -360,10 +358,9 @@ noncomputable def abstractFixedFieldCyclotomicRestriction rationalCyclotomicFieldInertia_le H.field Gal( LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) hI / - LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) →* - Gal(rationalCyclotomicZHatField / ℚ) := by + Gal(rationalCyclotomicZHatField/ℚ) := by let hI := rationalCyclotomicFieldInertia_le H.field exact @@ -522,8 +519,7 @@ theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : Multiplicative.toAdd (rationalCyclotomicZHatFieldGalEquivZHat @@ -1148,8 +1144,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (z : E) : ((AlgEquiv.restrictNormalHom E @@ -1171,8 +1166,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (z : rationalCyclotomicZHatField) : rationalCyclotomicZHatFieldEmbeddingInAbstractFixedFieldCompositum H @@ -1206,8 +1200,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (z : abstractFixedFieldCyclotomicFiniteLayer H E) : abstractFixedFieldCyclotomicFiniteLayerInclusion H E @@ -1245,8 +1238,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (z : E) : abstractFixedFieldCyclotomicFiniteLayerEmbedding H E @@ -1288,8 +1280,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (x : E) : abstractFixedFieldCyclotomicFiniteLayerInclusion H E @@ -1340,8 +1331,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (x : E) : abstractFixedFieldCyclotomicFiniteLayerInclusion H E @@ -1402,8 +1392,7 @@ private theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) (x : E) : AlgEquiv.restrictNormalHom E @@ -1438,8 +1427,7 @@ theorem Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : letI : Normal ℚ E := E.isGalois.to_normal AlgEquiv.restrictNormalHom E @@ -1770,7 +1758,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (a : IdeleGroup (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : - Gal(rationalCyclotomicZHatField / ℚ) := + Gal(rationalCyclotomicZHatField/ℚ) := abstractFixedFieldCyclotomicRestriction H (infiniteGlobalArtinMonoidHom (cyclotomicAbstractFixedFieldArtinCoordinateBase H) @@ -1783,7 +1771,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (a : IdeleGroup (cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : - Gal(rationalCyclotomicZHatField / ℚ) := + Gal(rationalCyclotomicZHatField/ℚ) := rationalCyclotomicZHatGlobalArtin (IdeleGroup.norm ℚ (cyclotomicAbstractFixedFieldArtinCoordinateBase H) a) @@ -1797,9 +1785,8 @@ private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMapData (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - {f : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E / - cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* - Gal(E / ℚ) // + {f : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* + Gal(E/ℚ) // f.comp (@globalArtinMonoidHomOfNumberField (cyclotomicAbstractFixedFieldArtinCoordinateBase H) @@ -1866,9 +1853,8 @@ private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMap (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E / - cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* - Gal(E / ℚ) := + 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 @@ -1896,8 +1882,7 @@ private theorem cyclotomicAbstractFixedFieldArtinCoordinateMap_apply (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) - (σ : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E / - cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + (σ : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E/cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : cyclotomicAbstractFixedFieldArtinCoordinateMap H E σ = @IntermediateField.restrictRestrictAlgEquivMapHom ℚ E @@ -1955,7 +1940,7 @@ private noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(E / ℚ) := + Gal(E/ℚ) := AlgEquiv.restrictNormalHom E (cyclotomicAbstractFixedFieldArtinAbstractEndpoint H a) @@ -1970,7 +1955,7 @@ private noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(E / ℚ) := + Gal(E/ℚ) := (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.1 /-- The finite relative Artin symbol mapped to one rational coordinate. -/ @@ -1983,7 +1968,7 @@ private noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(E / ℚ) := + Gal(E/ℚ) := (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.1 /-- The finite rational Artin coordinate of the idele norm. -/ @@ -1996,7 +1981,7 @@ private noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(E / ℚ) := + Gal(E/ℚ) := (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.1 /-- Naturality of the finite global Artin map at the concrete cyclotomic @@ -2024,7 +2009,7 @@ private noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(E / ℚ) := + Gal(E/ℚ) := (cyclotomicAbstractFixedFieldArtinCoordinateBridgeData H a E).1.2.2 /-- The abstract restriction map projected to the concrete finite layer. -/ @@ -2386,8 +2371,7 @@ noncomputable def abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := by let F := LocalClassFieldTheory.abstractFixedField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean index e8e72d9b53..9be5b8296e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -238,7 +238,7 @@ theorem noncomputable def numberFieldCyclotomicZHatCompositumIdeleClassArtinMonoidHom : IdeleClassGroup K →* - Gal(numberFieldCyclotomicZHatCompositum K / K) := + Gal(numberFieldCyclotomicZHatCompositum K/K) := QuotientGroup.lift (IdeleGroup.principalSubgroup K) (infiniteGlobalArtinMonoidHom K @@ -363,7 +363,7 @@ private structure NumberFieldCyclotomicZHatFiniteLayerArtinData Type where toMonoidHom : IdeleGroup K →* - Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E / K) + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) principal (x : Kˣ) : toMonoidHom (IdeleGroup.principalIdele K x) = 1 restriction (a : IdeleGroup K) : @@ -463,7 +463,7 @@ noncomputable def FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : IdeleGroup K →* - Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E / K) := + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) := (numberFieldCyclotomicZHatFiniteLayerArtinData K E).toMonoidHom /-- Every finite cyclotomic layer over a number field inherits the @@ -502,7 +502,7 @@ noncomputable def FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : IdeleClassGroup K →* - Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E / K) := by + Gal(numberFieldCyclotomicZHatFiniteLayerInCompositum K E/K) := by exact QuotientGroup.lift (IdeleGroup.principalSubgroup K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean index 1b8c1809b5..b162ea62b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -35,6 +35,11 @@ torsion closure and the group-theoretic decomposition of `ℤ̂ˣ` gives the cyclotomic `ℤ̂`-extension. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + noncomputable section namespace GlobalClassFieldTheory @@ -55,7 +60,7 @@ private noncomputable def rationalCyclotomicTorsionRestrictionEquiv : rationalCyclotomicTorsionFixedField) := krullTopology_t2 exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivOfCompactToT2 + continuousMulEquivOfCompactToT2 (InfiniteGalois.normalAutEquivQuotient (k := ℚ) (K := rationalCyclotomicField) rationalCyclotomicTorsionClosure) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean index 3590078b9f..0a31470689 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -339,8 +339,7 @@ private noncomputable abbrev Gal( abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) H.field) := LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) H.field (rationalCyclotomicDegreeData.fieldInertia H.field) @@ -381,8 +380,7 @@ private noncomputable abbrev L.toFiniteGaloisExtension.extensionQuotient ≃* Gal( abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below / - abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + ℚ (SeparableClosure ℚ) L.below/abstractFixedField ℚ (SeparableClosure ℚ) H.field) := L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) @@ -397,8 +395,7 @@ private theorem cyclotomicUnramifiedGeometricRestriction_apply L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) (σ : Gal( abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom H L hUnramified σ = (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean index 1a5bb1fd48..cd3b32dc6a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean @@ -110,14 +110,13 @@ noncomputable def abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom let U := LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI - Gal(U / F) →* Gal(E / F) := by + Gal(U/F) →* Gal(E/F) := by dsimp only let qFinite : L.toFiniteGaloisExtension.extensionQuotient ≃* Gal( LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below / - LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) L.below/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup @@ -149,8 +148,7 @@ theorem abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_apply (σ : Gal( LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) / - LocalClassFieldTheory.abstractFixedField + (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom H L hUnramified σ = (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 06d034ab88..047084bdc9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -30,6 +30,11 @@ All fields in this file are the actual mathlib intermediate fields in Galois group is introduced. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + noncomputable section namespace GlobalClassFieldTheory @@ -109,7 +114,7 @@ noncomputable def rationalCyclotomicZHatFieldGalEquivZHat : rationalCyclotomicTorsionFixedField) ≃ₜ* (rationalCyclotomicZHatField ≃ₐ[ℚ] rationalCyclotomicZHatField) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivOfCompactToT2 + continuousMulEquivOfCompactToT2 (AlgEquiv.autCongr e) (continuous_algEquiv_autCongr e) exact c.symm.trans @@ -155,7 +160,7 @@ theorem rationalCyclotomicZHatFieldGalEquivZHat_fullRestriction KummerTheory.rationalCyclotomicTorsionFixedField) ≃ₜ* (rationalCyclotomicZHatField ≃ₐ[ℚ] rationalCyclotomicZHatField) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivOfCompactToT2 + continuousMulEquivOfCompactToT2 (AlgEquiv.autCongr e) (continuous_algEquiv_autCongr e) change diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean index e249f1407f..bb025b4ea0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean @@ -292,8 +292,8 @@ noncomputable def numberFieldTowerSeparableClosureRestriction : numberFieldTowerSeparableClosureTopAlgebra L letI : IsScalarTower K L (SeparableClosure ℚ) := numberFieldTowerSeparableClosureScalarTower K L - Gal(SeparableClosure ℚ / K) →ₜ* - Gal(L / K) := by + Gal(SeparableClosure ℚ/K) →ₜ* + Gal(L/K) := by letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L let _ : Algebra L (SeparableClosure ℚ) := @@ -309,12 +309,12 @@ noncomputable def numberFieldTowerSeparableClosureRestriction : letI : IsGalois K E := IsGalois.of_algEquiv eL.equivFieldRange let c : - Gal(L / K) ≃* - Gal(E / K) := + Gal(L/K) ≃* + Gal(E/K) := AlgEquiv.autCongr eL.equivFieldRange let rE : - Gal(SeparableClosure ℚ / K) →* - Gal(E / K) := + Gal(SeparableClosure ℚ/K) →* + Gal(E/K) := AlgEquiv.restrictNormalHom E refine { toMonoidHom := @@ -371,7 +371,7 @@ theorem numberFieldTowerSeparableClosureRestriction_apply numberFieldTowerSeparableClosureTopAlgebra L letI : IsScalarTower K L (SeparableClosure ℚ) := numberFieldTowerSeparableClosureScalarTower K L - Gal(SeparableClosure ℚ / K)) : + Gal(SeparableClosure ℚ/K)) : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L letI : Algebra L (SeparableClosure ℚ) := @@ -424,7 +424,7 @@ copy of `K`. -/ noncomputable def numberFieldTowerSeparableClosureToBaseSubgroup : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L - Gal(SeparableClosure ℚ / K) →* + Gal(SeparableClosure ℚ/K) →* (numberFieldTowerBaseSubgroup K L).toSubgroup := by let _ : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L @@ -452,7 +452,7 @@ Galois group. -/ noncomputable def numberFieldTowerSeparableClosureEquivBaseSubgroup : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L - Gal(SeparableClosure ℚ / K) ≃* + Gal(SeparableClosure ℚ/K) ≃* (numberFieldTowerBaseSubgroup K L).toSubgroup := by letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L @@ -493,12 +493,12 @@ theorem numberFieldTowerSeparableClosureEquivBaseSubgroup_apply_coe (σ : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L - Gal(SeparableClosure ℚ / K)) : + Gal(SeparableClosure ℚ/K)) : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L ((numberFieldTowerSeparableClosureEquivBaseSubgroup K L σ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : - Gal(SeparableClosure ℚ / ℚ)) = + Gal(SeparableClosure ℚ/ℚ)) = AlgEquiv.restrictScalars ℚ σ := by let : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean index c21955bc1f..d896df497c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean @@ -122,8 +122,8 @@ theorem numberFieldTowerBaseSubgroup_isOpen : IsOpen ((numberFieldTowerBaseSubgroup K L : ClosedSubgroup - (Gal(SeparableClosure ℚ / ℚ))) : - Set (Gal(SeparableClosure ℚ / ℚ))) := + (Gal(SeparableClosure ℚ/ℚ))) : + Set (Gal(SeparableClosure ℚ/ℚ))) := abstractFiniteClosedSubgroup_isOpen ℚ (SeparableClosure ℚ) (numberFieldTowerBaseSubgroup K L) @@ -134,7 +134,7 @@ the actual `Gal(L / K)`. -/ noncomputable def numberFieldTowerExtensionQuotientEquivGaloisGroup : (numberFieldTowerFiniteGaloisSubextension K L).extensionQuotient ≃* - Gal(L / K) := by + Gal(L/K) := by let j := numberFieldSeparableClosureEmbedding L let i := j.comp (IsScalarTower.toAlgHom ℚ K L) @@ -158,7 +158,7 @@ noncomputable def ℚ K L j e change (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) ≃* - Gal(L / K) + Gal(L/K) exact ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ K L j e @@ -170,7 +170,7 @@ theorem (σ : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L - Gal(SeparableClosure ℚ / K)) : + Gal(SeparableClosure ℚ/K)) : letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L letI : Algebra L (SeparableClosure ℚ) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean index 9439278b23..51ca3e899c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -87,7 +87,6 @@ theorem (vF : AbsoluteValue F ℝ) (hvF : IsNonarchimedean (vF : F → ℝ)) [IsUltrametricDist vF.Completion] - [(NormedField.valuation (K := vF.Completion)).IsNontrivial] [LocallyCompactSpace vF.Completion] : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean index 94e5ebf190..32f433a895 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -198,7 +198,6 @@ noncomputable def finitePlaceArtinLocalizedCompletionRingHom [Field L'] [NumberField L'] [NumberField L] [Algebra K K'] [Algebra K' L'] [Algebra K L'] - [Algebra L L'] (v : HeightOneSpectrum (𝓞 K)) (W : HeightOneSpectrum (𝓞 K')) @@ -620,7 +619,6 @@ noncomputable def finitePlaceCrossLocalRestrictionMonoidHom [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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean index 7dba07e6ad..d69767c82b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -257,6 +257,25 @@ theorem finitePlaceRestrictedLocalizedCompletionAlgHom_toAlgebraicLocalization 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. -/ @@ -382,72 +401,23 @@ theorem decompositionGroupEquivAlgebraicLocalizationAut_restrict_of_commutes apply AlgEquiv.ext intro z apply (algebraMap E L).injective - apply - (AbsoluteValue.toAlgebraicLocalization - vK wL.1 wL.2).injective - let u : EL := - AbsoluteValue.toAlgebraicLocalization - vK wE.1 wE.2 z - have hcommutes : - tauL (localizationEmbedding u) = - localizationEmbedding - ((AlgEquiv.restrictNormalHom EL tauL) u) := by - change - tauL (algebraMap EL LL u) = - algebraMap EL LL - ((AlgEquiv.restrictNormalHom EL tauL) u) - exact - (AlgEquiv.restrictNormal_commutes - tauL EL u).symm - calc - AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 - (algebraMap E L - ((AlgEquiv.restrictNormalHom E - (rhoL.1 : L ≃ₐ[K] L)) z)) = - AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 - ((rhoL.1 : L ≃ₐ[K] L) - (algebraMap E L z)) := by - exact congrArg - (AbsoluteValue.toAlgebraicLocalization - vK wL.1 wL.2) - (AlgEquiv.restrictNormal_commutes - (rhoL.1 : L ≃ₐ[K] L) E z) - _ = eDL rhoL - (AbsoluteValue.toAlgebraicLocalization - vK wL.1 wL.2 (algebraMap E L z)) := by - rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] - _ = tauL - (AbsoluteValue.toAlgebraicLocalization - vK wL.1 wL.2 (algebraMap E L z)) := by - rw [eDL.apply_symm_apply] - _ = tauL - (localizationEmbedding - (AbsoluteValue.toAlgebraicLocalization - vK wE.1 wE.2 z)) := by - rw [hlocalization] - _ = localizationEmbedding - ((AlgEquiv.restrictNormalHom EL tauL) - (AbsoluteValue.toAlgebraicLocalization - vK wE.1 wE.2 z)) := by - exact hcommutes - _ = localizationEmbedding - (tauE - (AbsoluteValue.toAlgebraicLocalization - vK wE.1 wE.2 z)) := by - rfl - _ = localizationEmbedding - (eDE rhoE - (AbsoluteValue.toAlgebraicLocalization - vK wE.1 wE.2 z)) := by - rw [eDE.apply_symm_apply] - _ = localizationEmbedding - (AbsoluteValue.toAlgebraicLocalization vK wE.1 wE.2 - ((rhoE.1 : E ≃ₐ[K] E) z)) := by - rw [localizationRamificationGroups_decompositionGroupEquiv_toLocalization] - _ = AbsoluteValue.toAlgebraicLocalization vK wL.1 wL.2 - (algebraMap E L - ((rhoE.1 : E ≃ₐ[K] E) z)) := by - rw [hlocalization] + 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 private noncomputable def finitePlaceLocalRestrictionMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean index e60b192efa..e874926b78 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -267,8 +267,8 @@ noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(numberFieldCyclotomicZHatFiniteCompositum F E / F) →* - Gal(E / ℚ) := by + Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F) →* + Gal(E/ℚ) := by letI : Normal ℚ E := E.isGalois.to_normal exact IntermediateField.restrictRestrictAlgEquivMapHom @@ -354,7 +354,7 @@ theorem apply AlgEquiv.ext intro x exact congrArg (fun f : C ≃ₐ[A] C => f x) hστ - let transportE : Gal(E / ℚ) →* (B ≃ₐ[ℚ] B) := + let transportE : Gal(E/ℚ) →* (B ≃ₐ[ℚ] B) := (AlgEquiv.autCongr eE).toMonoidHom have raw_restriction_commutes (σ : C ≃ₐ[F] C) (x : E) : @@ -422,14 +422,14 @@ noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(numberFieldCyclotomicZHatFiniteCompositum F E / F) ≃* + 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) ≃* + Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F) ≃* r.range := MulEquiv.ofBijective r.rangeRestrict ⟨fun σ τ h => @@ -455,7 +455,7 @@ theorem FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : Nat.card - (Gal(numberFieldCyclotomicZHatFiniteCompositum F E / F)) = + (Gal(numberFieldCyclotomicZHatFiniteCompositum F E/F)) = Nat.card (numberFieldCyclotomicZHatFiniteIntersection F E).fixingSubgroup := Nat.card_congr @@ -624,7 +624,7 @@ theorem numberFieldCyclotomicZHatCompositumRestriction_range over a number field. -/ noncomputable def numberFieldCyclotomicZHatCompositumCoordinate (F : Type*) [Field F] [NumberField F] : - Gal(numberFieldCyclotomicZHatCompositum F / F) →* + Gal(numberFieldCyclotomicZHatCompositum F/F) →* Multiplicative ZHat := rationalCyclotomicZHatFieldGalEquivZHat.toMonoidHom.comp (numberFieldCyclotomicZHatCompositumRestriction F) @@ -644,7 +644,7 @@ noncomputable instance numberFieldCyclotomicZHatCompositumGal_isMulTorsionFree (F : Type*) [Field F] [NumberField F] : IsMulTorsionFree - (Gal(numberFieldCyclotomicZHatCompositum F / F)) := + (Gal(numberFieldCyclotomicZHatCompositum F/F)) := Function.Injective.isMulTorsionFree (numberFieldCyclotomicZHatCompositumCoordinate F) (numberFieldCyclotomicZHatCompositumCoordinate_injective F) @@ -1900,7 +1900,7 @@ noncomputable def (F : Type*) [Field F] [NumberField F] (p : Nat.Primes) (n : ℕ) : Gal(numberFieldCyclotomicZHatFiniteCompositum F - (rationalCyclotomicPadicFiniteLevel p n) / F) →* + (rationalCyclotomicPadicFiniteLevel p n)/F) →* Multiplicative (ZMod (p.1 ^ n)) := (rationalCyclotomicPadicFiniteLevelGalEquivZMod p n).toMonoidHom.comp @@ -1933,7 +1933,7 @@ theorem (p : Nat.Primes) (n : ℕ) : IsCyclic (Gal(numberFieldCyclotomicZHatFiniteCompositum F - (rationalCyclotomicPadicFiniteLevel p n) / F)) := + (rationalCyclotomicPadicFiniteLevel p n)/F)) := isCyclic_of_injective (numberFieldCyclotomicPadicFiniteCompositumCoordinate F p n) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index e13603e6c8..2da1b44928 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -79,14 +79,14 @@ noncomputable def (Abelianization (ClassFormation.FiniteGaloisSubextension.extensionQuotient (numberFieldTowerFiniteGaloisSubextension K L))) ≃+ - Additive (Gal(L / K)) := + Additive (Gal(L/K)) := MulEquiv.toAdditive (MulEquiv.trans (MulEquiv.abelianizationCongr (numberFieldTowerExtensionQuotientEquivGaloisGroup K L)) (Abelianization.equivOfComm : - Gal(L / K) ≃* - Abelianization (Gal(L / K))).symm) + 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 @@ -104,8 +104,8 @@ theorem apply Additive.toMul.injective change (Abelianization.equivOfComm : - Gal(L / K) ≃* - Abelianization (Gal(L / K))).symm + Gal(L/K) ≃* + Abelianization (Gal(L/K))).symm (MulEquiv.abelianizationCongr (numberFieldTowerExtensionQuotientEquivGaloisGroup K L) (Abelianization.of q)) = @@ -113,8 +113,8 @@ theorem rw [abelianizationCongr_of] exact (Abelianization.equivOfComm : - Gal(L / K) ≃* - Abelianization (Gal(L / K))).symm_apply_apply _ + 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 @@ -126,7 +126,7 @@ private noncomputable def (numberFieldTowerBaseSubgroup K L) (numberFieldTowerTopSubgroup L) (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ - Additive (Gal(L / K)) := by + Additive (Gal(L/K)) := by letI : AddCommGroup (FiniteNormQuotient rationalIdeleClassRepresentation (numberFieldTowerBaseSubgroup K L) @@ -146,7 +146,7 @@ private noncomputable def (Abelianization (ClassFormation.FiniteGaloisSubextension.extensionQuotient (numberFieldTowerFiniteGaloisSubextension K L)))) - (Additive (Gal(L / K))) + (Additive (Gal(L/K))) inferInstance inferInstance inferInstance (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation @@ -183,7 +183,7 @@ noncomputable def globalNormResidueEquiv : Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive (Gal(L / K)) := by + Additive (Gal(L/K)) := by exact (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient K L).symm.trans @@ -303,7 +303,7 @@ theorem globalNormResidueEquiv_finiteReciprocityHom `Gal(L / K) ≃ C_K / N_{L/K} C_L`. -/ noncomputable def globalReciprocityEquiv : - Additive (Gal(L / K)) ≃+ + Additive (Gal(L/K)) ≃+ Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := @@ -313,11 +313,11 @@ noncomputable def globalReciprocityEquiv : group, obtained by composing the genuine quotient map with the global norm-residue equivalence. -/ noncomputable def globalNormResidueMonoidHom : - IdeleClassGroup K →* Gal(L / K) := by + IdeleClassGroup K →* Gal(L/K) := by let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Gal(L / K) := + Gal(L/K) := AddEquiv.toMultiplicative (globalNormResidueEquiv K L) exact e.toMonoidHom.comp @@ -429,7 +429,7 @@ theorem globalNormResidueMonoidHom_eq_one_iff let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Gal(L / K) := + Gal(L/K) := AddEquiv.toMultiplicative (globalNormResidueEquiv K L) change e (QuotientGroup.mk' @@ -488,9 +488,9 @@ theorem ideleClassNorm_index_eq_finrank_abelian : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range)) := (Nat.card_congr Additive.toMul).symm - _ = Nat.card (Additive (Gal(L / K))) := + _ = Nat.card (Additive (Gal(L/K))) := Nat.card_congr (globalNormResidueEquiv K L).toEquiv - _ = Nat.card (Gal(L / K)) := + _ = Nat.card (Gal(L/K)) := Nat.card_congr Additive.toMul _ = Module.finrank K L := IsGalois.card_aut_eq_finrank K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean index b5326bba70..15935aed6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -50,7 +50,7 @@ noncomputable def (Abelianization (ClassFormation.FiniteGaloisSubextension.extensionQuotient (numberFieldTowerFiniteGaloisSubextension K L))) ≃+ - Additive (Abelianization (Gal(L / K))) := + Additive (Abelianization (Gal(L/K))) := MulEquiv.toAdditive (MulEquiv.abelianizationCongr (numberFieldTowerExtensionQuotientEquivGaloisGroup K L)) @@ -93,7 +93,7 @@ private noncomputable def (numberFieldTowerBaseSubgroup K L) (numberFieldTowerTopSubgroup L) (numberFieldTowerTopSubgroup_le_baseSubgroup K L) ≃+ - Additive (Abelianization (Gal(L / K))) := by + Additive (Abelianization (Gal(L/K))) := by let _ : Finite _ := (numberFieldTowerReciprocityFiniteAbstractField K L).finite let _ : @@ -123,7 +123,7 @@ private noncomputable def (Abelianization (ClassFormation.FiniteGaloisSubextension.extensionQuotient (numberFieldTowerFiniteGaloisSubextension K L)))) - (Additive (Abelianization (Gal(L / K)))) + (Additive (Abelianization (Gal(L/K)))) inferInstance inferInstance inferInstance (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation @@ -142,7 +142,7 @@ noncomputable def globalNormResidueAbelianizationEquiv : Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive (Abelianization (Gal(L / K))) := by + Additive (Abelianization (Gal(L/K))) := by exact (numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient K L).symm.trans @@ -295,7 +295,7 @@ theorem globalNormResidueAbelianizationEquiv_finiteReciprocityHom /-- The inverse global reciprocity equivalence for an arbitrary finite Galois extension. -/ noncomputable def globalReciprocityAbelianizationEquiv : - Additive (Abelianization (Gal(L / K))) ≃+ + Additive (Abelianization (Gal(L/K))) ≃+ Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := @@ -305,11 +305,11 @@ noncomputable def globalReciprocityAbelianizationEquiv : abelianization of the actual Galois group. -/ noncomputable def globalNormResidueAbelianizationMonoidHom : IdeleClassGroup K →* - Abelianization (Gal(L / K)) := by + Abelianization (Gal(L/K)) := by let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Abelianization (Gal(L / K)) := + Abelianization (Gal(L/K)) := AddEquiv.toMultiplicative (globalNormResidueAbelianizationEquiv K L) exact @@ -421,7 +421,7 @@ theorem globalNormResidueAbelianizationMonoidHom_surjective : let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Abelianization (Gal(L / K)) := + Abelianization (Gal(L/K)) := AddEquiv.toMultiplicative (globalNormResidueAbelianizationEquiv K L) intro y @@ -447,7 +447,7 @@ 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)) := + Abelianization (Gal(L/K)) := (globalNormResidueAbelianizationMonoidHom K L).comp (QuotientGroup.mk' (IdeleGroup.principalSubgroup K)) @@ -551,7 +551,7 @@ theorem globalNormResidueAbelianizationMonoidHom_ker : 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 + Nat.card (Abelianization (Gal(L/K))) := by calc (_root_.ideleClassNorm K L).range.index = Nat.card @@ -568,12 +568,12 @@ theorem ideleClassNorm_index_eq_galoisAbelianization_card : _ = Nat.card (Additive - (Abelianization (Gal(L / K)))) := + (Abelianization (Gal(L/K)))) := Nat.card_congr (globalNormResidueAbelianizationEquiv K L).toEquiv _ = Nat.card - (Abelianization (Gal(L / K))) := + (Abelianization (Gal(L/K))) := Nat.card_congr Additive.toMul section AbelianSpecialization @@ -591,8 +591,8 @@ private theorem (_root_.ideleClassNorm F E).range)) : MulEquiv.toAdditive (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F))).symm + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm (globalNormResidueAbelianizationEquiv F E q) = globalNormResidueEquiv F E q := by let H := @@ -616,8 +616,8 @@ private theorem let n := numberFieldTowerFiniteNormQuotientEquivIdeleClassNormQuotient F E let canonical : - Gal(E / F) ≃* - Abelianization (Gal(E / F)) := + Gal(E/F) ≃* + Abelianization (Gal(E/F)) := Abelianization.equivOfComm have hr : Function.Surjective r := rationalCyclotomicIdeleClassValuationData.abstractReciprocity_finiteReciprocityHom_surjective @@ -658,8 +658,8 @@ theorem globalNormResidueAbelianizationEquiv_abelianSpecialization : (globalNormResidueAbelianizationEquiv F E).trans (MulEquiv.toAdditive (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F))).symm) = + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm) = globalNormResidueEquiv F E := by apply AddEquiv.ext intro q @@ -673,16 +673,16 @@ abelian reciprocity equivalence. -/ theorem globalReciprocityAbelianizationEquiv_abelianSpecialization : (MulEquiv.toAdditive (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F)))).trans + 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 = + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm)).symm = (globalNormResidueEquiv F E).symm exact congrArg AddEquiv.symm @@ -692,8 +692,8 @@ private theorem globalNormResidueAbelianizationMonoidHom_abelianSpecialization_apply (c : IdeleClassGroup F) : (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F))).symm + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm (globalNormResidueAbelianizationMonoidHom F E c) = globalNormResidueMonoidHom F E c := by simpa only [ @@ -716,8 +716,8 @@ identification. -/ theorem globalNormResidueAbelianizationMonoidHom_abelianSpecialization : (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F))).symm.toMonoidHom.comp + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm.toMonoidHom.comp (globalNormResidueAbelianizationMonoidHom F E) = globalNormResidueMonoidHom F E := by apply MonoidHom.ext @@ -732,8 +732,8 @@ specialization, after pulling both class symbols back along theorem globalNormResidueAbelianizationIdeleMonoidHom_abelianSpecialization : (Abelianization.equivOfComm : - Gal(E / F) ≃* - Abelianization (Gal(E / F))).symm.toMonoidHom.comp + Gal(E/F) ≃* + Abelianization (Gal(E/F))).symm.toMonoidHom.comp (globalNormResidueAbelianizationIdeleMonoidHom F E) = (globalNormResidueMonoidHom F E).comp (QuotientGroup.mk' diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean index f2867525a0..912f888907 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -173,7 +173,7 @@ noncomputable def Additive (Abelianization (numberFieldEmbeddedFiniteGaloisSubextension K N j).extensionQuotient) ≃+ - Additive (Abelianization Gal(N / K)) := + Additive (Abelianization Gal(N/K)) := MulEquiv.toAdditive (MulEquiv.abelianizationCongr (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K N j)) @@ -195,7 +195,7 @@ private noncomputable def (numberFieldEmbeddedBaseSubgroup K N j) (numberFieldEmbeddedTopSubgroup K N j) (numberFieldEmbeddedTopSubgroup_le_baseSubgroup K N j) ≃+ - Additive (Abelianization Gal(N / K)) := by + Additive (Abelianization Gal(N/K)) := by let _ : Finite _ := (numberFieldEmbeddedFiniteAbstractField K N j).finite let _ : @@ -222,7 +222,7 @@ private noncomputable def (Additive (Abelianization (numberFieldEmbeddedFiniteGaloisSubextension K N j).extensionQuotient)) - (Additive (Abelianization Gal(N / K))) + (Additive (Abelianization Gal(N/K))) inferInstance inferInstance inferInstance (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation @@ -268,7 +268,7 @@ 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 + IdeleClassGroup K →* Abelianization Gal(N/K) := by let hRelativeFinite : Finite ((numberFieldEmbeddedBaseSubgroup K N j).toSubgroup ⧸ extensionSubgroup @@ -278,7 +278,7 @@ noncomputable def globalNormResidueAbelianizationMonoidHomOfEmbedding numberFieldEmbeddedExtensionQuotient_finite K N j let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K N).range) ≃* - Abelianization Gal(N / K) := + Abelianization Gal(N/K) := AddEquiv.toMultiplicative ((numberFieldEmbeddedFiniteNormQuotientEquivIdeleClassNormQuotient K N j).symm.trans @@ -565,7 +565,7 @@ theorem letI _ : (extensionSubgroup H' J hJH').Normal := numberFieldEmbeddedExtensionSubgroup_normal M N j Abelianization.map - (AlgEquiv.restrictScalarsHom K : Gal(N / M) →* Gal(N / K)) + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K)) (Additive.toMul (numberFieldEmbeddedAbelianizedExtensionQuotientEquivGaloisAbelianization M N j (Additive.ofMul z))) = @@ -596,12 +596,12 @@ theorem let hUpperNormal : (extensionSubgroup H' J hJH').Normal := numberFieldEmbeddedExtensionSubgroup_normal M N j let qLowerRaw : - (H.toSubgroup ⧸ extensionSubgroup H J hJH) ≃* Gal(N / K) := + (H.toSubgroup ⧸ extensionSubgroup H J hJH) ≃* Gal(N/K) := numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K N j let qUpperRaw : - (H'.toSubgroup ⧸ extensionSubgroup H' J hJH') ≃* Gal(N / M) := + (H'.toSubgroup ⧸ extensionSubgroup H' J hJH') ≃* Gal(N/M) := numberFieldEmbeddedExtensionQuotientEquivGaloisGroup M N j - let restrictActual : Gal(N / M) →* Gal(N / K) := + let restrictActual : Gal(N/M) →* Gal(N/K) := AlgEquiv.restrictScalarsHom K obtain ⟨q, rfl⟩ := QuotientGroup.mk_surjective z obtain ⟨sigma, rfl⟩ := @@ -660,7 +660,7 @@ theorem letI _ : IsGalois M N := commonTopIntermediateTopIsGalois K M N (Abelianization.map - (AlgEquiv.restrictScalarsHom K : Gal(N / M) →* Gal(N / K))).comp + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K))).comp (globalNormResidueAbelianizationMonoidHomOfEmbedding M N j) = (globalNormResidueAbelianizationMonoidHomOfEmbedding K N j).comp (_root_.ideleClassNorm K M) := by @@ -717,7 +717,7 @@ theorem 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) := + let restrictActual : Gal(N/M) →* Gal(N/K) := AlgEquiv.restrictScalarsHom K apply MonoidHom.ext intro c @@ -835,7 +835,7 @@ theorem globalNormResidueAbelianizationMonoidHom_norm_restriction letI _ : IsGalois M N := commonTopIntermediateTopIsGalois K M N (Abelianization.map - (AlgEquiv.restrictScalarsHom K : Gal(N / M) →* Gal(N / K))).comp + (AlgEquiv.restrictScalarsHom K : Gal(N/M) →* Gal(N/K))).comp (globalNormResidueAbelianizationMonoidHom M N) = (globalNormResidueAbelianizationMonoidHom K N).comp (_root_.ideleClassNorm K M) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index 8de1aadb3a..2478cbebb1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -941,8 +941,7 @@ private noncomputable def P.toFiniteGaloisExtension.extensionQuotient ≃* Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField @@ -982,8 +981,7 @@ private noncomputable def P.toFiniteGaloisExtension.extensionQuotient ≃* Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by exact P.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans (abstractExtensionQuotientEquivGaloisGroup @@ -999,8 +997,7 @@ private noncomputable def (q : P.toFiniteGaloisExtension.extensionQuotient) : Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv H P q /-- Pointwise opaque endpoint of the canonical quotient equivalence. -/ @@ -1012,8 +1009,7 @@ private noncomputable def (q : P.toFiniteGaloisExtension.extensionQuotient) : Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv H P q /-- Fully applied ambient value of the embedded quotient endpoint. -/ @@ -1050,8 +1046,7 @@ private noncomputable def (σ : H.field.toSubgroup) : Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := abstractRelativeFixedField @@ -1342,8 +1337,7 @@ private noncomputable def P.toFiniteGaloisExtension.extensionQuotient ≃* Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1381,8 +1375,7 @@ private noncomputable def (q : P.toFiniteGaloisExtension.extensionQuotient) : Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionTransportedExtensionQuotientEquiv H P q /-- Transporting a canonical representative of the embedded finite Galois @@ -1493,8 +1486,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1538,13 +1530,11 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by let Q := Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field)) + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) exact MulEquiv.toAdditive ((MulEquiv.abelianizationCongr @@ -1562,8 +1552,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldInclusionTransportedAbelianizedEquiv H P z /-- Pointwise opaque value of the canonical abelianization comparison built @@ -1578,8 +1567,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv H P z /-- Pointwise opaque value of the intrinsic abstract fixed-field @@ -1594,8 +1582,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P z /-- The transported abelianized endpoint agrees pointwise with the canonical @@ -1633,7 +1620,7 @@ private theorem PEmbedded = P.toFiniteGaloisExtension := numberFieldEmbeddedFiniteGaloisSubextension_transport_eq H P - let qEmbedded : PEmbedded.extensionQuotient ≃* Gal(E / F) := + let qEmbedded : PEmbedded.extensionQuotient ≃* Gal(E/F) := numberFieldEmbeddedExtensionQuotientEquivGaloisGroup F E j have hCanonical : abstractFixedFieldInclusionTransportedAbelianizedEquiv H P = @@ -1766,8 +1753,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1799,8 +1785,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1844,8 +1829,7 @@ private noncomputable def Additive (Gal( (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below) / - (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := rationalFiniteNormResidueValue H P.toFiniteGaloisExtension (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P) @@ -1900,7 +1884,7 @@ private theorem (H := H) (P := P) (A := HEmbedded) (C := Additive (IdeleClassGroup F)) - (X := Additive Gal(E / F)) + (X := Additive Gal(E/F)) hHEmbedded PEmbedded hPEmbedded eIdeleEmbedded eGaloisEmbedded c) @@ -2421,19 +2405,19 @@ theorem let qLowerRaw : (H.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H J hJH) ≃* - Gal(L / K) := by + 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 + 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) := + Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) obtain ⟨q, rfl⟩ := @@ -2443,10 +2427,10 @@ theorem K' L' j).extensionQuotientMk_surjective q change restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm (qUpperRaw.abelianizationCongr (Abelianization.of (QuotientGroup.mk σ)))) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (qLowerRaw.abelianizationCongr (normResidueNaturalityAbelianizedRestriction H H' J J' hJH hJ'H' hH'H hJ'J @@ -2740,7 +2724,7 @@ theorem globalNormResidueMonoidHomOfEmbedding_norm_restriction CyclicCohomology.extensionSubgroup H' J' hJ'H') exact numberFieldEmbeddedExtensionQuotient_finite K' L' j let restrictActual : - Gal(L' / K') →* Gal(L / K) := + Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) apply MonoidHom.ext diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean index 0358906bbd..c5e8a92e50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -34,7 +34,6 @@ private noncomputable instance [Field F] [Field E] [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] - : CommGroup (TowerRelativeIdeleGroup.ClassGroup ℚ F E) := by letI : CommGroup (TowerRelativeIdeleGroup ℚ F E) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean index 0d289ac0b5..10ebb0139a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean @@ -74,7 +74,6 @@ private theorem relativeAdeleEmbedding_toAlgHom_unflatten [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 @@ -215,7 +214,6 @@ theorem classEmbedding_smul_eq_classEmbedding_comp [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 = @@ -388,8 +386,6 @@ private theorem classEmbedding_comp [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean index 813755b19b..57dffd5b80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean @@ -140,7 +140,6 @@ private theorem rationalTowerRelativeClass_norm [Algebra ℚ F] [Algebra F E] [Algebra ℚ E] [IsScalarTower ℚ F E] [FiniteDimensional ℚ F] [FiniteDimensional F E] - (c : Additive (IdeleClassGroup E)) : let dF := towerRelativeIdeleClassBaseChangeMulEquiv ℚ F E @@ -907,12 +906,7 @@ theorem rationalIdeleClassRepresentation L := rationalAbstractRelativeFixedFieldIdeleClassEquivFixed (hKfinite := hKfinite) (hfinite := hfinite) K L hLK - let f : - KummerTheory.ambientFixedAddSubgroup - rationalIdeleClassRepresentation L →+ - KummerTheory.ambientFixedAddSubgroup - rationalIdeleClassRepresentation K := - relativeNorm rationalIdeleClassRepresentation 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 @@ -924,11 +918,8 @@ theorem (G := IdeleClassGroup E) (H := IdeleClassGroup F) (f := f) (g := g) (eU := eUpper) (eA := eK) ?_ intro c - have hcompat : - f (eUpper c) = eK (Additive.ofMul (g (Additive.toMul c))) := by - exact - rationalAbstractRelativeFixedFieldIdeleClassEquivFixed_relativeNorm - (hKfinite := hKfinite) (hfinite := hfinite) K L hLK hnormal 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 @@ -978,16 +969,7 @@ noncomputable def letI : IsScalarTower ℚ (abstractFixedField ℚ (SeparableClosure ℚ) K) (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) := - IsScalarTower.of_algebraMap_eq' - (R := ℚ) - (S := abstractFixedField ℚ (SeparableClosure ℚ) K) - (A := abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK) - (RingHom.ext_rat - (algebraMap ℚ (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)) - ((algebraMap - (abstractFixedField ℚ (SeparableClosure ℚ) K) - (abstractRelativeFixedField ℚ (SeparableClosure ℚ) hLK)).comp - (algebraMap ℚ (abstractFixedField ℚ (SeparableClosure ℚ) K)))) + IsScalarTower.of_algebraMap_eq' (RingHom.ext_rat _ _) letI : NumberField (abstractFixedField ℚ (SeparableClosure ℚ) K) := rationalNormQuotientAbstractFixedFieldNumberField (hKfinite := hKfinite) K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index c5e82f1d66..52f97f7c50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -914,7 +914,7 @@ noncomputable def letI : NumberField E' := hE' letI : NumberField E := hE letI : IsAbelianGalois ℚ E := hAbelian - {x : Gal(E / ℚ) × Gal(E / ℚ) × Gal(E / ℚ) // + {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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean index e36e6fc5dd..72a39af954 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean @@ -86,7 +86,7 @@ theorem globalInfinitePlaceHilbertSymbol_congr 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, + simp? [globalInfinitePlaceHilbertSymbol, hn, hv, hW, ha, hb, haG, hbG] apply Subtype.ext apply Units.ext diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean index 9a1ea85ab7..57b90d483a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean @@ -31,9 +31,9 @@ variable abelianizations. -/ noncomputable def intermediateAbelianizedRestriction (M : IntermediateField K N) : - Abelianization Gal(N / M) →* Abelianization Gal(N / K) := + Abelianization Gal(N/M) →* Abelianization Gal(N/K) := Abelianization.map - (AlgEquiv.restrictScalarsHom K : Gal(N / M) →* Gal(N / K)) + (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 @@ -42,23 +42,23 @@ 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 + (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 + (_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 (tau : Gal(N/K)) = Abelianization.of ((AlgEquiv.restrictScalarsHom K) sigma) rfl · rintro ⟨tau, htau, rfl⟩ - let sigma : Gal(N / M) := + let sigma : Gal(N/M) := IntermediateField.fixingSubgroupEquiv M ⟨tau, htau⟩ refine ⟨Abelianization.of sigma, ?_⟩ change @@ -75,7 +75,7 @@ theorem ((intermediateAbelianizedRestriction (K := K) (N := N) M).comp (globalNormResidueAbelianizationMonoidHom M N)).range = M.fixingSubgroup.map - (Abelianization.of : Gal(N / K) →* Abelianization Gal(N / K)) := by + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) := by calc ((intermediateAbelianizedRestriction (K := K) (N := N) M).comp (globalNormResidueAbelianizationMonoidHom M N)).range = @@ -89,7 +89,7 @@ theorem refine ⟨c, ?_⟩ simp only [MonoidHom.comp_apply, hc] _ = M.fixingSubgroup.map - (Abelianization.of : Gal(N / K) →* Abelianization Gal(N / K)) := + (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 @@ -113,7 +113,7 @@ 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 + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K))).comap (globalNormResidueAbelianizationMonoidHom K N) := by let f := globalNormResidueAbelianizationMonoidHom K N let g := globalNormResidueAbelianizationMonoidHom M N @@ -130,7 +130,7 @@ theorem ideleClassNorm_range_eq_artin_preimage_abelianizedFixingSubgroup · rintro ⟨c, rfl⟩ change f (n c) ∈ M.fixingSubgroup.map - (Abelianization.of : Gal(N / K) →* Abelianization Gal(N / K)) + (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] @@ -138,7 +138,7 @@ theorem ideleClassNorm_range_eq_artin_preimage_abelianizedFixingSubgroup · intro hx change f x ∈ M.fixingSubgroup.map - (Abelianization.of : Gal(N / K) →* Abelianization Gal(N / K)) + (Abelianization.of : Gal(N/K) →* Abelianization Gal(N/K)) at hx have hxrange : f x ∈ r.range := by rw [hrange] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean index fcff9238a4..b6962df355 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -232,7 +232,7 @@ theorem (hgenerate : Subgroup.closure ({σ.1} : Set (Gal(L/K))) = ⊤) (hprimary : - σ.1 ∈ CommGroup.primaryComponent (Gal(L / K)) p.1) + σ.1 ∈ CommGroup.primaryComponent (Gal(L/K)) p.1) (x : (v.adicCompletion K)ˣ) (hx : chosenFinitePlaceArtinMonoidHom @@ -403,7 +403,7 @@ private theorem exists_finitePlaceNormDescent_localGlobalRepresentative (AlgEquiv.restrictScalarsHom K)) σM := congrArg (((AlgEquiv.restrictNormalHom L).comp - (AlgEquiv.restrictScalarsHom K)) : Gal(L / M) →* Gal(L / K)) hy + (AlgEquiv.restrictScalarsHom K)) : Gal(L/M) →* Gal(L/K)) hy _ = σG := hrestrict let j : L →ₐ[ℚ] SeparableClosure ℚ := AlgebraicNumberTheory.numberFieldSeparableClosureEmbedding L @@ -483,7 +483,7 @@ private theorem exists_finitePlacePrimaryNormDescent_localGlobalRepresentative (hgenerate : Subgroup.closure ({δM.1} : Set (Gal(L/M))) = ⊤) (hprimary : - δM.1 ∈ CommGroup.primaryComponent (Gal(L / M)) p.1) + δM.1 ∈ CommGroup.primaryComponent (Gal(L/M)) p.1) (σG : Gal(L/K)) (hrestrict : ((AlgEquiv.restrictNormalHom L).comp @@ -517,11 +517,11 @@ private theorem exists_finitePlacePrimary_cyclicFixedFieldRepresentative (K := K) (L := L) v z = δ.1 ∧ globalNormResidueMonoidHom K L (IdeleGroup.finitePlaceIdeleClass v z) = δ.1 := by - let σG : Gal(L / K) := δ.1 + 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 + let σM : Gal(L/M) := automorphismOverCyclicFixedField σG have hσMdecomposition : σM ∈ absoluteValueDecompositionGroup M @@ -536,14 +536,14 @@ private theorem exists_finitePlacePrimary_cyclicFixedFieldRepresentative have hσMrestrict : σM.restrictScalars K = σG := automorphismOverCyclicFixedField_restrictScalars σG have hσMprimary : - σM ∈ CommGroup.primaryComponent (Gal(L / M)) p.1 := by + σ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)) + (AlgEquiv.restrictScalarsHom K) (1 : Gal(L/M)) rw [ map_pow, AlgEquiv.restrictScalarsHom_apply, @@ -588,7 +588,7 @@ theorem finitePlaceGlobalNormResidueFactor_eq_subtype_on_primary (σ : (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v).range) := by - let σG : Gal(L / K) := + let σG : Gal(L/K) := (σ : (chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v).range) @@ -610,7 +610,7 @@ theorem finitePlaceGlobalNormResidueFactor_eq_subtype_on_primary (chosenFinitePlaceExtension (L := L) v).1 := ⟨σG, hσdecomposition⟩ have hσprimary : - σG ∈ CommGroup.primaryComponent (Gal(L / K)) p := by + σ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⟩ @@ -736,7 +736,7 @@ theorem finitePlaceGlobalNormResidueFactor_eq_subtype_iff_primary exact congrArg (fun f : (chosenFinitePlaceArtinMonoidHom - (K := K) (L := L) v).range →* Gal(L / K) => f σ) + (K := K) (L := L) v).range →* Gal(L/K) => f σ) h · intro h apply MonoidHom.ext_of_eq_on_finitePrimaryComponents diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index c99e1e5e98..68e296d43c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -72,7 +72,7 @@ noncomputable local instance finitePadicAuxiliaryExtensionQuotientIsMulCommutati (numberFieldTowerBaseSubgroup K L) (numberFieldTowerTopSubgroup L) (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) ≃* - Gal(L / K) := + Gal(L/K) := numberFieldTowerExtensionQuotientEquivGaloisGroup K L exact { is_comm := @@ -81,7 +81,7 @@ noncomputable local instance finitePadicAuxiliaryExtensionQuotientIsMulCommutati rw [map_mul, map_mul] exact (inferInstance : - IsMulCommutative (Gal(L / K))).is_comm.comm + IsMulCommutative (Gal(L/K))).is_comm.comm (e x) (e y)⟩ } /-- The concrete auxiliary fixed field attached to a simultaneous @@ -455,8 +455,7 @@ noncomputable def numberFieldTowerFinitePadicAuxiliaryAutomorphism (K := K) (L := L) p τ Gal( LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below / - LocalClassFieldTheory.abstractFixedField + ℚ (SeparableClosure ℚ) P.below/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) S) := by dsimp only let P := @@ -1128,7 +1127,7 @@ private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_no letI auxiliaryCompletionAlgebra : Algebra (v.adicCompletion K) (V.adicCompletion F) := (finitePlaceAdicCompletionMap K F v Vover).toAlgebra - let σE : Gal(E / F) := + let σE : Gal(E/F) := numberFieldTowerFinitePadicAuxiliaryAutomorphism (K := K) (L := L) p τ have hσtop : @@ -1161,11 +1160,11 @@ private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_no z = LocalFieldTheory.normUnits (v.adicCompletion K) (V.adicCompletion F) y := by rfl - let σK : Gal(L / K) := + let σK : Gal(L/K) := numberFieldTowerExtensionQuotientEquivGaloisGroup K L (numberFieldTowerFiniteQuotientCoordinate (K := K) (L := L) τ) - let restriction : Gal(E / F) →* Gal(L / K) := + let restriction : Gal(E/F) →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) have hrestrict : restriction σE = σK := @@ -1217,7 +1216,7 @@ private theorem numberFieldTowerFinitePadicAuxiliaryLocalGlobalRepresentative_no (IdeleGroup.finitePlaceIdeleClass V y) = σE := (congrArg - (fun φ : (V.adicCompletion F)ˣ →* Gal(E / F) => φ y) + (fun φ : (V.adicCompletion F)ˣ →* Gal(E/F) => φ y) hcompat).trans hy have hnormClass : _root_.ideleClassNorm K F diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean index 8a7f9949ae..9237aad9d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -63,7 +63,7 @@ noncomputable local instance numberFieldTowerExtensionQuotientIsMulCommutative : (numberFieldTowerBaseSubgroup K L) (numberFieldTowerTopSubgroup L) (numberFieldTowerTopSubgroup_le_baseSubgroup K L)) ≃* - Gal(L / K) := + Gal(L/K) := numberFieldTowerExtensionQuotientEquivGaloisGroup K L exact { is_comm := @@ -72,7 +72,7 @@ noncomputable local instance numberFieldTowerExtensionQuotientIsMulCommutative : rw [map_mul, map_mul] exact (inferInstance : - IsMulCommutative (Gal(L / K))).is_comm.comm + IsMulCommutative (Gal(L/K))).is_comm.comm (e x) (e y)⟩ } local instance numberFieldTowerBaseSubgroupCompactSpace : @@ -110,7 +110,7 @@ noncomputable def numberFieldTowerFiniteQuotientCoordinate : Galois group. -/ noncomputable def rationalSeparableClosurePadicCyclotomicDegree (p : Nat.Primes) : - Gal(SeparableClosure ℚ / ℚ) →ₜ* + Gal(SeparableClosure ℚ/ℚ) →ₜ* Multiplicative ℤ_[p.1] := (rationalCyclotomicPadicCoordinate p).comp rationalAbsoluteGaloisRestrictionToCyclotomicZHat @@ -603,7 +603,7 @@ used in the finite-place reduction. -/ noncomputable def numberFieldTowerFinitePadicCyclicFixedSubgroup (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : - ClosedSubgroup (Gal(SeparableClosure ℚ / ℚ)) := by + ClosedSubgroup (Gal(SeparableClosure ℚ/ℚ)) := by let H := numberFieldTowerBaseSubgroup K L let U := @@ -626,7 +626,7 @@ in the auxiliary subgroup whose fixed field is used for descent. -/ theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_generator_mem (p : Nat.Primes) (τ : (numberFieldTowerBaseSubgroup K L).toSubgroup) : - (τ : Gal(SeparableClosure ℚ / ℚ)) ∈ + (τ : Gal(SeparableClosure ℚ/ℚ)) ∈ (numberFieldTowerFinitePadicCyclicFixedSubgroup (K := K) (L := L) p τ).toSubgroup := by let H := @@ -642,7 +642,7 @@ theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_generator_mem numberFieldTowerFinitePadicCyclicPreimage (K := K) (L := L) p τ change - (τ : Gal(SeparableClosure ℚ / ℚ)) ∈ + (τ : Gal(SeparableClosure ℚ/ℚ)) ∈ U.toSubgroup.map H.toSubgroup.subtype refine ⟨τ, ?_, rfl⟩ change rangeRestriction τ ∈ Γ.toSubgroup @@ -809,8 +809,8 @@ theorem numberFieldTowerFinitePadicCyclicFixedSubgroup_isOpen ((numberFieldTowerFinitePadicCyclicFixedSubgroup (K := K) (L := L) p τ : ClosedSubgroup - (Gal(SeparableClosure ℚ / ℚ))) : - Set (Gal(SeparableClosure ℚ / ℚ))) := by + (Gal(SeparableClosure ℚ/ℚ))) : + Set (Gal(SeparableClosure ℚ/ℚ))) := by let H := numberFieldTowerBaseSubgroup K L let U := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean index db6d993571..2e7493762d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -70,10 +70,10 @@ 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)) : + (σ : Gal(L/K)) : IntermediateField K L := IntermediateField.fixedField - (Subgroup.closure ({σ} : Set (Gal(L / K)))) + (Subgroup.closure ({σ} : Set (Gal(L/K)))) noncomputable local instance automorphismCyclicFixedFieldNumberField (σ : Gal(L/K)) : @@ -85,7 +85,7 @@ noncomputable local instance automorphismCyclicFixedFieldNumberField subgroup it generates. -/ noncomputable def automorphismOverCyclicFixedField (σ : Gal(L/K)) : - Gal(L / automorphismCyclicFixedField σ) := + Gal(L/automorphismCyclicFixedField σ) := IntermediateField.fixingSubgroupEquiv (automorphismCyclicFixedField σ) ⟨σ, by @@ -113,14 +113,14 @@ theorem automorphismOverCyclicFixedField_generates Subgroup.closure ({automorphismOverCyclicFixedField σ} : Set - (Gal(L / automorphismCyclicFixedField σ))) = + (Gal(L/automorphismCyclicFixedField σ))) = ⊤ := by let M := automorphismCyclicFixedField σ - let σM : Gal(L / M) := + let σM : Gal(L/M) := automorphismOverCyclicFixedField σ let e : M.fixingSubgroup ≃* - Gal(L / M) := + Gal(L/M) := IntermediateField.fixingSubgroupEquiv M have hσ : (⟨σ, by @@ -140,7 +140,7 @@ theorem automorphismOverCyclicFixedField_generates (f := e.symm.toMonoidHom) e.symm.injective change Subgroup.map e.symm.toMonoidHom - (Subgroup.closure ({σM} : Set (Gal(L / M)))) = + (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 @@ -151,7 +151,7 @@ theorem automorphismOverCyclicFixedField_generates rw [MonoidHom.map_closure, Set.image_singleton, ← MonoidHom.range_eq_map, M.fixingSubgroup.range_subtype] change - Subgroup.closure ({σ} : Set (Gal(L / K))) = + Subgroup.closure ({σ} : Set (Gal(L/K))) = (automorphismCyclicFixedField σ).fixingSubgroup rw [automorphismCyclicFixedField, IntermediateField.fixingSubgroup_fixedField] @@ -308,7 +308,7 @@ theorem automorphismOverCyclicFixedField_mem_chosenFinitePlaceDecompositionGroup chosenFinitePlaceExtension (L := L) v let wM := automorphismCyclicFixedTopExtension v σ.1 - let σM : Gal(L / M) := + let σM : Gal(L/M) := automorphismOverCyclicFixedField σ.1 have hrestrict : RamificationTheory.HilbertRamification.ValuationSubring.restrictAutomorphismScalars @@ -468,7 +468,7 @@ theorem finitePlaceSeparableClosureDecompositionRestriction_coe absoluteValueDecompositionGroup K wΩ.1), ((finitePlaceSeparableClosureDecompositionRestriction (K := K) (L := L) v) τ : - Gal(L / K)) = + Gal(L/K)) = AlgEquiv.restrictNormalHom L τ.1 := by let : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L @@ -637,7 +637,7 @@ theorem _ = η.1 (algebraMap L (SeparableClosure ℚ) x) := rfl _ = algebraMap L (SeparableClosure ℚ) x := η.1.commutes x _ = algebraMap L (SeparableClosure ℚ) - ((1 : Gal(L / K)) x) := rfl + ((1 : Gal(L/K)) x) := rfl · intro hτ have hrestriction : AlgEquiv.restrictNormalHom L τ.1 = 1 := by @@ -646,7 +646,7 @@ theorem calc AlgEquiv.restrictNormalHom L τ.1 = ((1 : absoluteValueDecompositionGroup K wL.1).1 : - Gal(L / K)) := by + Gal(L/K)) := by simpa only [ finitePlaceSeparableClosureDecompositionRestriction_coe] using hτVal @@ -658,7 +658,7 @@ theorem have hcomm := AlgEquiv.restrictNormal_commutes τ.1 L x have hx := - congrArg (fun ρ : Gal(L / K) => ρ x) hrestriction + congrArg (fun ρ : Gal(L/K) => ρ x) hrestriction change (τ.1.restrictNormal L) x = x at hx calc τ.1 (algebraMap L (SeparableClosure ℚ) x) = @@ -940,7 +940,7 @@ noncomputable def finitePlaceSeparableClosureCyclotomicRestriction numberFieldTowerFinitePlaceExtensionToSeparableClosure K L v (chosenFinitePlaceExtension (L := L) v) absoluteValueDecompositionGroup K wΩ.1 →* - Gal(rationalCyclotomicZHatField / ℚ) := + Gal(rationalCyclotomicZHatField/ℚ) := by letI : Algebra K (SeparableClosure ℚ) := numberFieldTowerSeparableClosureBaseAlgebra K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean index 9e394e76eb..535e8b9413 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean @@ -37,13 +37,13 @@ noncomputable def mathlibIdeleClassConnectedQuotientEquivAbelianization let e₁ : ClassFieldTheory.IdeleClassConnectedQuotient K ≃ₜ* ideleClassComponentQuotient K := compEquiv.symm let e₂ : ideleClassComponentQuotient K ≃ₜ* - Gal(maximalAbelianExtension K / K) := + Gal(maximalAbelianExtension K/K) := ideleClassComponentQuotientEquivMaximalAbelianGalois K - let e₃ : TopologicalAbelianization Gal(SeparableClosure K / K) ≃ₜ* - Gal(maximalAbelianExtension K / K) := + let e₃ : TopologicalAbelianization Gal(SeparableClosure K/K) ≃ₜ* + Gal(maximalAbelianExtension K/K) := absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K let e₄ : Field.absoluteGaloisGroupAbelianization K ≃ₜ* - TopologicalAbelianization Gal(SeparableClosure K / K) := + TopologicalAbelianization Gal(SeparableClosure K/K) := absoluteGaloisGroupAbelianizationEquivSeparable K exact e₁.trans (e₂.trans (e₃.symm.trans e₄.symm)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean index 0715fe9008..e49eaccf22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean @@ -28,7 +28,7 @@ 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) := + IdeleClassGroup K →ₜ* Gal(maximalAbelianExtension K/K) := infiniteGlobalIdeleClassArtinContinuousMonoidHom (K := K) (Ω := maximalAbelianExtension K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean index 66518f9671..c000b45622 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean @@ -191,9 +191,9 @@ open scoped Classical in idele class group with the maximal abelian Galois group. -/ noncomputable def ideleClassComponentQuotientEquivMaximalAbelianGalois : ideleClassComponentQuotient K ≃ₜ* - Gal(maximalAbelianExtension K / K) := by + Gal(maximalAbelianExtension K/K) := by let e : ideleClassComponentQuotient K ≃* - Gal(maximalAbelianExtension K / K) := + Gal(maximalAbelianExtension K/K) := QuotientGroup.liftEquiv (ideleClassIdentityComponent K) (maximalAbelianGlobalArtin_surjective K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 44b3499230..3dc3b107ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -37,6 +37,11 @@ root in the localized cyclotomic level identifies the image of arithmetic Frobenius under the global cyclotomic character with the residue prime. -/ +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + valuation_hasExtension_of_valuationSubring_equiv → + valuation_hasExtension_of_valuationSubring_equiv + + open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain @@ -514,7 +519,7 @@ theorem (localCompleteDVF F).valuation.HasExtension (padicCompleteDVF p.1).valuation apply - ValuationTheory.DiscreteValuationField.ValuedExtension.valuation_hasExtension_of_valuationSubring_equiv + valuation_hasExtension_of_valuationSubring_equiv (localCompleteDVF F) (padicCompleteDVF p.1) eO @@ -1903,7 +1908,7 @@ private theorem (finitePlaceLocalArtinMonoidHom (K := K) (L := L) v w x) z := by exact - congrArg (fun sigma : Gal(L / K) => sigma z) + congrArg (fun sigma : Gal(L/K) => sigma z) (chosenFinitePlaceArtinMonoidHom_apply_factor_of_extension_eq (K := K) (L := L) v w hw x) @@ -1921,7 +1926,7 @@ private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action let E := LocalizedCompletion vK w letI : Algebra vK.Completion E := finitePlaceLocalArtinLocalizedAlgebra v w - Gal(E / vK.Completion)) + Gal(E/vK.Completion)) (z : L) (zLocal : let vK := HeightOneSpectrum.adicAbv K v @@ -1943,7 +1948,7 @@ private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action let E := LocalizedCompletion vK w let : Algebra vK.Completion E := finitePlaceLocalArtinLocalizedAlgebra v w - let eD : absoluteValueDecompositionGroup K w.1 ≃* Gal(E / vK.Completion) := + 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 @@ -1957,7 +1962,7 @@ private theorem finitePlaceLocalToGlobalMonoidHom_apply_pow_of_localized_action (localizationRamificationGroups_decompositionGroupEquiv_toLocalization vK hvK w delta z).symm _ = sigma (eLoc z) := - congrArg (fun tau : Gal(E / vK.Completion) => tau (eLoc z)) + congrArg (fun tau : Gal(E/vK.Completion) => tau (eLoc z)) hDecomposition _ = sigma zLocal := congrArg (fun y : E => sigma y) hLocalization @@ -2278,7 +2283,7 @@ private theorem open scoped Classical in private noncomputable def rationalCyclotomicPrincipalPrimePadicTargetArtin (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : - Gal(RationalCyclotomicPrincipalPrimePadicLevel p n / ℚ_[p.1]) := + Gal(RationalCyclotomicPrincipalPrimePadicLevel p n/ℚ_[p.1]) := @LocalClassFieldTheory.abelianLocalArtinMonoidHom ℚ_[p.1] (RationalCyclotomicPrincipalPrimePadicLevel p n) (inferInstance : Field ℚ_[p.1]) @@ -2301,7 +2306,7 @@ open scoped Classical in private noncomputable def rationalCyclotomicPrincipalPrimePadicUnitParameterArtin (p : Nat.Primes) (n : ℕ) (x : ℚˣ) : - Gal(RationalCyclotomicPrincipalPrimePadicLevel p n / ℚ_[p.1]) := + Gal(RationalCyclotomicPrincipalPrimePadicLevel p n/ℚ_[p.1]) := standardLubinTateUnitParameterEquivGal (padicLocalField p.1) (padicMultiplicativeLubinTateSeries_isUniformizer p.1) n @@ -2443,7 +2448,7 @@ private theorem let eL : E ≃ₐ[ℚ_[p.1]] T := rationalCyclotomicLocalizedCompletionPadicAlgEquiv p n let zetaE : E := rationalCyclotomicPrincipalPrimeLocalizedRoot p n - let tau : Gal(T / ℚ_[p.1]) := + let tau : Gal(T/ℚ_[p.1]) := rationalCyclotomicPrincipalPrimePadicUnitParameterArtin p n x let a := rationalCyclotomicPrincipalPrimeResidueUnit p n x let zetaT : T := padicMultiplicativePrimitiveRoot p.1 n @@ -2704,7 +2709,7 @@ 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 / ℚ) := + Gal(KummerTheory.rationalCyclotomicLevel m/ℚ) := chosenFinitePlaceArtinMonoidHom (K := ℚ) (L := KummerTheory.rationalCyclotomicLevel m) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 193e3fd880..68dcd1fbfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -249,7 +249,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula ((Rat.HeightOneSpectrum.primesEquiv (R := 𝓞 ℚ)).symm p) := rfl let localArtin : Gal(KummerTheory.rationalCyclotomicLevel - ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ / ℚ) := + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) := finitePlaceLocalToGlobalMonoidHom (K := ℚ) (L := KummerTheory.rationalCyclotomicLevel @@ -270,7 +270,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula ((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)⟩ / ℚ) := + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) := chosenFinitePlaceArtinMonoidHom (K := ℚ) (L := KummerTheory.rationalCyclotomicLevel @@ -313,7 +313,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula have hCharacter := congrArg (fun sigma : Gal( KummerTheory.rationalCyclotomicLevel - ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩ / ℚ) => + ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) => IsCyclotomicExtension.Rat.galEquivZMod (p.1 ^ (n + 1)) (KummerTheory.rationalCyclotomicLevel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index 2ab3dc474f..97af3777ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -497,7 +497,7 @@ theorem rationalCyclotomicLevelFiniteDimensional m let : IsAbelianGalois ℚ L := rationalCyclotomicLevelIsAbelianGalois m - let σ : Gal(L / ℚ) := + let σ : Gal(L/ℚ) := chosenFinitePlaceArtinMonoidHom (K := ℚ) (L := L) (RayClass.rationalPrime q) x apply @@ -543,7 +543,7 @@ theorem rationalCyclotomicLevelFiniteDimensional mp let : IsAbelianGalois ℚ P := rationalCyclotomicLevelIsAbelianGalois mp - let χ : Gal(P / ℚ) ≃* (ZMod (p.1 ^ k))ˣ := + let χ : Gal(P/ℚ) ≃* (ZMod (p.1 ^ k))ˣ := IsCyclotomicExtension.Rat.galEquivZMod (p.1 ^ k) P have hFL : P ≤ L := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index 234f37eae7..6126c047ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -27,6 +27,31 @@ reciprocity, in the standard field `ℚ_[p]`, and in the valuation subring used by the multiplicative Lubin--Tate construction. -/ +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 @@ -230,13 +255,13 @@ theorem rationalPadicFieldUnit_uniformizerValueExponent F.valuation.valuationSubring.unitGroup := by simpa only [ LubinTate.standardLubinTateUnitFactorFieldUnit] using - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.valuationSubringUnitsToFieldUnits_mem_unitGroup + (valuationSubringUnitsToFieldUnits_mem_unitGroup F.toCompleteDVF u) have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa only [V] using - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F.toCompleteDVF hπ) have huZero : V.val @@ -265,7 +290,7 @@ theorem rationalPadicFieldUnit_uniformizerValueExponent have hϖ : V.IsUniformizer ϖ := by rw [hϖeq] simpa only [V] using - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F.toCompleteDVF hπ) change V.val X = padicValRat p.1 (x : ℚ) rw [ @@ -281,7 +306,7 @@ uniformizer decomposition of a rational `p`-adic field unit is precisely `rationalPrimeUnitValuationSubringUnit`. -/ theorem rationalPadicFieldUnit_uniformizerUnitPart (x : ℚˣ) (p : Nat.Primes) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + fieldUnitUniformizerUnitPart (padicLocalField p.1).toCompleteDVF (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer p.1) @@ -298,9 +323,9 @@ theorem rationalPadicFieldUnit_uniformizerUnitPart let ϖ : ℚ_[p.1]ˣ := LubinTate.standardLubinTateBaseUniformizerUnit hπ apply - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_injective + valuationSubringUnitFieldUnitHom_injective refine - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart F.toCompleteDVF hπ X).trans ?_ change X * ϖ ^ @@ -407,7 +432,7 @@ rational principal finite component returns the integral theorem padicCompletionEquiv_principalFiniteComponent_uniformizerUnitPart (x : ℚˣ) (p : Nat.Primes) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitUniformizerUnitPart + fieldUnitUniformizerUnitPart (padicLocalField p.1).toCompleteDVF (LubinTate.padicMultiplicativeLubinTateSeries_isUniformizer p.1) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean index ecff3ab04d..9ad4ddf956 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean @@ -70,7 +70,7 @@ topologies. -/ noncomputable def globalNormResidueContinuousMulEquiv : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃ₜ* - Gal(L / K) := by + Gal(L/K) := by let : DiscreteTopology (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := @@ -78,7 +78,7 @@ noncomputable def globalNormResidueContinuousMulEquiv : let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Gal(L / K) := + Gal(L/K) := AddEquiv.toMultiplicative (globalNormResidueEquiv K L) exact @@ -109,7 +109,7 @@ This is the inverse of the norm-residue equivalence as a and the native quotient topology on the idele-class quotient are part of the public statement. -/ noncomputable def globalReciprocityContinuousMulEquiv : - Gal(L / K) ≃ₜ* + Gal(L/K) ≃ₜ* (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := (globalNormResidueContinuousMulEquiv K L).symm @@ -140,7 +140,7 @@ noncomputable def ideleClassNormQuotientContinuousMonoidHom : /-- 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) := + IdeleClassGroup K →ₜ* Gal(L/K) := (ContinuousMonoidHom.toContinuousMonoidHom (globalNormResidueContinuousMulEquiv K L)).comp (ideleClassNormQuotientContinuousMonoidHom K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean index b352ced6a9..8fcccd064a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -47,10 +47,10 @@ local instance quotient topology explicitly before asking for topological properties. -/ local instance topologicalGlobalNormResidueAbelianizationGaloisAbelianizationTopology : - TopologicalSpace (Abelianization (Gal(L / K))) := by + TopologicalSpace (Abelianization (Gal(L/K))) := by change TopologicalSpace - (Gal(L / K) ⧸ commutator (Gal(L / K))) + (Gal(L/K) ⧸ commutator (Gal(L/K))) infer_instance /-- The native topology on the actual idele-class norm quotient is @@ -70,11 +70,11 @@ omit [NumberField K] [NumberField L] [IsGalois K L] in discrete quotient topology. -/ theorem finiteGaloisAbelianization_discreteTopology : DiscreteTopology - (Abelianization (Gal(L / K))) := by + (Abelianization (Gal(L/K))) := by change DiscreteTopology - (Gal(L / K) ⧸ - commutator (Gal(L / K))) + (Gal(L/K) ⧸ + commutator (Gal(L/K))) apply QuotientGroup.discreteTopology exact isOpen_discrete _ @@ -87,7 +87,7 @@ local instance local instance topologicalGlobalNormResidueAbelianization_galoisAbelianizationDiscreteTopology : - DiscreteTopology (Abelianization (Gal(L / K))) := + DiscreteTopology (Abelianization (Gal(L/K))) := finiteGaloisAbelianization_discreteTopology K L /-- The full finite-Galois norm-residue isomorphism with its native @@ -97,11 +97,11 @@ topologies: noncomputable def globalNormResidueAbelianizationContinuousMulEquiv : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃ₜ* - Abelianization (Gal(L / K)) := by + Abelianization (Gal(L/K)) := by let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Abelianization (Gal(L / K)) := + Abelianization (Gal(L/K)) := AddEquiv.toMultiplicative (globalNormResidueAbelianizationEquiv K L) exact @@ -128,7 +128,7 @@ used by the class-field correspondence: `Gal(L / K)ᵃᵇ ≃ₜ* C_K / N_{L/K}(C_L)`. -/ noncomputable def globalReciprocityAbelianizationContinuousMulEquiv : - Abelianization (Gal(L / K)) ≃ₜ* + Abelianization (Gal(L/K)) ≃ₜ* (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) := (globalNormResidueAbelianizationContinuousMulEquiv K L).symm @@ -161,7 +161,7 @@ idele-class and finite Krull quotient topologies. -/ noncomputable def globalNormResidueAbelianizationContinuousMonoidHom : IdeleClassGroup K →ₜ* - Abelianization (Gal(L / K)) := + Abelianization (Gal(L/K)) := (ContinuousMonoidHom.toContinuousMonoidHom (globalNormResidueAbelianizationContinuousMulEquiv K L)).comp (ideleClassNormAbelianizationQuotientContinuousMonoidHom K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean index f9234133a3..8a765c8dbf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -37,6 +37,39 @@ Lubin--Tate, and local reciprocity infrastructure is exported by its owner libraries rather than through this facade. -/ +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 @@ -217,7 +250,7 @@ theorem chosenLocalExtension_decompositionSubgroup_eq_top ext z rw [ValuationSubring.mem_pointwise_smul_iff_inv_smul_mem] exact - (RamificationTheory.DiscreteValuationField.DVF.mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension + (mem_valuationSubring_algEquiv_iff_of_hasUniqueValuationExtension (base := base) (target := target) huniq σ⁻¹ z).symm /-- At integer indices the lower group defined using Mathlib's valuation @@ -379,21 +412,21 @@ theorem chosenHerbrandFunctionAtLowerIndex_real_eq (base := base) (target := target) huniq change ((ClassFieldTheory.herbrandFunctionAtLowerIndex K target.valuation.valuationSubring n : ℚ) : ℝ) = - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + 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, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_zero] + herbrandFunction_nat, + herbrandValueNat_zero] | succ n ih => rw [herbrandFunctionAtLowerIndex_succ, Rat.cast_add, Rat.cast_div] - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_succ] + rw [herbrandFunction_nat, + herbrandValueNat_succ] rw [← - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat + herbrandFunction_nat F n, ih] congr 1 rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope] @@ -416,7 +449,6 @@ theorem chosenLocalExtension_valuationSubring_eq_canonical [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 @@ -482,7 +514,7 @@ theorem chosenHerbrandFunction_eq_localHerbrandFunction have hnat (m : ℕ) : ((ClassFieldTheory.herbrandFunctionAtLowerIndex K target.valuation.valuationSubring m : ℚ) : ℝ) = - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + herbrandValueNat F m := by calc ((ClassFieldTheory.herbrandFunctionAtLowerIndex K @@ -491,13 +523,13 @@ theorem chosenHerbrandFunction_eq_localHerbrandFunction (base := base) (target := target) huniq (m : ℝ) := chosenHerbrandFunctionAtLowerIndex_real_eq K L m _ = - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + herbrandValueNat F m := by change - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + herbrandFunction F (m : ℝ) = _ exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_nat + herbrandFunction_nat F m have hslope (m : ℕ) : ((Nat.card (ClassFieldTheory.lowerRamificationGroup K @@ -509,18 +541,18 @@ theorem chosenHerbrandFunction_eq_localHerbrandFunction unfold RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope rw [hcard (m + 1), hcard 0] change ClassFieldTheory.herbrandFunction K target.valuation.valuationSubring s = - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + herbrandFunction F s unfold ClassFieldTheory.herbrandFunction by_cases hs : 0 ≤ s · rw [ite_eq_left hs] dsimp only - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_floor + rw [herbrandFunction_of_floor F hs ⌊s⌋₊ rfl] rw [hnat ⌊s⌋₊, hslope ⌊s⌋₊] · rw [ite_eq_right hs] exact - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos + (herbrandFunction_of_nonpos F (le_of_lt (lt_of_not_ge hs))).symm /-- The public piecewise-linear Herbrand function of the canonical valuation @@ -918,7 +950,7 @@ 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) := + 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 @@ -929,7 +961,7 @@ 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), + ∀ (σ : 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 @@ -967,7 +999,7 @@ theorem shrink_mem_pointwise_smul_iff [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), + ∀ (σ : 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 σ • @@ -1017,7 +1049,7 @@ theorem shrink_mem_decompositionSubgroup_iff [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), + ∀ σ : Gal(Shrink.{0} L/Shrink.{0} K), σ ∈ ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup (Shrink.{0} K) ↔ shrinkGalEquiv K L σ ∈ @@ -1100,7 +1132,7 @@ theorem shrink_mem_lowerRamificationGroup_iff (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)) + ∀ (σ : Gal(Shrink.{0} L/Shrink.{0} K)) (hσ : σ ∈ ((ValuativeRel.valuation (Shrink.{0} L)).valuationSubring).decompositionSubgroup (Shrink.{0} K)), diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean index e67159081c..f6b2b57398 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean @@ -67,7 +67,6 @@ theorem kroneckerWeberCompositum_finrank_le_totient : ℚ L (CyclotomicField (kroneckerWeberConductorCandidate (L := L)) ℚ) - let chosen : ∀ p : Nat.Primes, Ideal.primesOver (rationalPrimeIdeal p) (𝓞 M) := fun p ↦ if hp : p ∈ S then @@ -82,7 +81,6 @@ theorem kroneckerWeberCompositum_finrank_le_totient : 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 ℤ) → @@ -90,7 +88,6 @@ theorem kroneckerWeberCompositum_finrank_le_totient : 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)) ≤ @@ -112,7 +109,6 @@ theorem kroneckerWeberCompositum_finrank_le_totient : (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean index 23b4d708b3..281c4c9152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean @@ -67,7 +67,6 @@ theorem kroneckerWeberGlobalCompositumLocalizationEmbedding 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 @@ -83,7 +82,6 @@ theorem kroneckerWeberGlobalCompositumLocalizationEmbedding 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) @@ -96,7 +94,6 @@ theorem kroneckerWeberGlobalCompositumLocalizationEmbedding (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 : @@ -128,7 +125,6 @@ theorem kroneckerWeberGlobalCompositumLocalizationEmbedding 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean index 2eef58967a..036ccca83d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean @@ -121,7 +121,6 @@ theorem exists_structuredLocalCyclotomicEmbedding 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] @@ -145,7 +144,6 @@ theorem exists_structuredLocalCyclotomicEmbedding 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 @@ -155,7 +153,6 @@ theorem exists_structuredLocalCyclotomicEmbedding 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 @@ -169,7 +166,6 @@ theorem exists_structuredLocalCyclotomicEmbedding 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 _ _) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index f8643bcc64..3dc6c681c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -135,7 +135,7 @@ theorem (rationalPrimeArithmeticFrobeniusLocalInput q)) := by let n : ℕ+ := ⟨m, NeZero.pos m⟩ let g : IdeleClassGroup ℚ →* - Gal(KummerTheory.rationalCyclotomicLevel n / ℚ) := + Gal(KummerTheory.rationalCyclotomicLevel n/ℚ) := globalNormResidueMonoidHom ℚ (KummerTheory.rationalCyclotomicLevel n) let i : ((RayClass.rationalPrime q).adicCompletion ℚ)ˣ →* IdeleClassGroup ℚ := @@ -186,13 +186,13 @@ noncomputable def : Gal( KummerTheory.rationalCyclotomicLevel - ⟨m, NeZero.pos m⟩ / ℚ) ≃ₜ* + ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* RayClass.RayClassGroup (RayClass.rationalModulus m) := by exact (commutativeGroupInversionContinuousMulEquiv (Gal( KummerTheory.rationalCyclotomicLevel - ⟨m, NeZero.pos m⟩ / ℚ))).trans + ⟨m, NeZero.pos m⟩/ℚ))).trans (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m) open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index 93538fce5f..f7123af2f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -51,14 +51,14 @@ private noncomputable def (r : RayClass.Modulus ℚ) (h : (_root_.ideleClassNorm ℚ L).range = RayClass.Modulus.congruenceSubgroup r) : - Gal(L / ℚ) ≃ₜ* RayClass.RayClassGroup r := by + 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 / ℚ) ≃* + Gal(L/ℚ) ≃* (IdeleClassGroup ℚ ⧸ (_root_.ideleClassNorm ℚ L).range) := AddEquiv.toMultiplicative (globalReciprocityEquiv ℚ L) @@ -448,7 +448,7 @@ noncomputable def : Gal( KummerTheory.rationalCyclotomicLevel - ⟨m, NeZero.pos m⟩ / ℚ) ≃ₜ* + ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* RayClass.RayClassGroup (RayClass.rationalModulus m) := galoisContinuousMulEquivRayClassGroupOfNormRangeEq (KummerTheory.rationalCyclotomicLevel @@ -558,7 +558,7 @@ 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 + Gal(CyclotomicField m ℚ/ℚ) := by let mp : ℕ+ := ⟨m, NeZero.pos m⟩ let L : Type := KummerTheory.rationalCyclotomicLevel mp let : NumberField L := @@ -720,7 +720,7 @@ field, with target the rational ray class group modulo `(m)`. -/ noncomputable def rationalCyclotomicGaloisContinuousMulEquivRayClassGroup : - Gal(CyclotomicField m ℚ / ℚ) ≃ₜ* + Gal(CyclotomicField m ℚ/ℚ) ≃ₜ* RayClass.RayClassGroup (RayClass.rationalModulus m) := galoisContinuousMulEquivRayClassGroupOfNormRangeEq (CyclotomicField m ℚ) (RayClass.rationalModulus m) @@ -734,7 +734,7 @@ topology on the actual Galois group and the discrete topology on noncomputable def rationalCyclotomicGaloisContinuousMulEquivZModUnits : - Gal(CyclotomicField m ℚ / ℚ) ≃ₜ* + Gal(CyclotomicField m ℚ/ℚ) ≃ₜ* (ZMod m)ˣ := by exact { IsCyclotomicExtension.Rat.galEquivZMod diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean index 7422b39798..3b40b5ba5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean @@ -198,11 +198,9 @@ theorem kroneckerWeberCompositum_isUnramifiedAt_of_not_mem 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⟩ @@ -219,7 +217,6 @@ theorem kroneckerWeberCompositum_isUnramifiedAt_of_not_mem (inferInstance : PA.IsPrime).isMaximal hPA0 let : PB.IsMaximal := (inferInstance : PB.IsPrime).isMaximal hPB0 - have hPAramification : PA.ramificationIdx ℤ = 1 := kroneckerWeber_leftFactor_ramificationIdx_eq_one @@ -228,7 +225,6 @@ theorem kroneckerWeberCompositum_isUnramifiedAt_of_not_mem 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' @@ -251,7 +247,6 @@ theorem kroneckerWeberCompositum_isUnramifiedAt_of_not_mem 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean index 6df6ea9907..f1e13e544c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean @@ -392,7 +392,6 @@ open scoped Classical in `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)] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean index 0e80b530ca..c9d23bb6af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -214,7 +214,6 @@ theorem 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean index 6ec9e356e5..eb302c4c29 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -38,32 +38,32 @@ 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 + 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 + ∑ σ : 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).ρ σ) + (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)) : + ((∑ σ : Gal(L/K), (Rep.ofAlgebraAutOnUnits K L).ρ σ (Additive.ofMul x)) : Additive Lˣ) : Lˣ) = - ∏ σ : Gal(L / K), + ∏ σ : 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 + (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ˣ) ≃+ + Additive (fixedSubgroup (Gal(L/K)) Lˣ) ≃+ unitsInvariantSubmodule K L where - toFun x := ⟨Additive.ofMul ((Additive.toMul x : fixedSubgroup (Gal(L / K)) Lˣ) : Lˣ), by + 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 @@ -134,7 +134,7 @@ private def mulEquivMultiplicativeToEquiv /-- Additive quotient map from fixed units to invariant units modulo norms. -/ def additiveFixedUnitToInvariantsNormQuotientHom [Fintype (Gal(L/K))] : - Additive (fixedSubgroup (Gal(L / K)) Lˣ) →+ + Additive (fixedSubgroup (Gal(L/K)) Lˣ) →+ (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := additiveEquivToQuotientHom (additiveFixedUnitsEquivInvariants K L) (unitsTateH0NormSubmodule K L) @@ -142,7 +142,7 @@ def additiveFixedUnitToInvariantsNormQuotientHom /-- Send a fixed unit to its invariant-unit class modulo norms. -/ def fixedUnitToInvariantsNormQuotientMonoidHom [Fintype (Gal(L/K))] : - fixedSubgroup (Gal(L / K)) Lˣ →* + fixedSubgroup (Gal(L/K)) Lˣ →* Multiplicative (unitsInvariantSubmodule K L ⧸ unitsTateH0NormSubmodule K L) := additiveHomToMultiplicativeHom @@ -164,8 +164,8 @@ 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 + (tateNormSubgroup (Gal(L/K)) Lˣ).subgroupOf + (fixedSubgroup (Gal(L/K)) Lˣ) := by ext x constructor · intro hx @@ -178,7 +178,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_ker 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ˣ + change (x : Lˣ) ∈ tateNormSubgroup (Gal(L/K)) Lˣ refine ⟨Additive.toMul y, ?_⟩ have hy' := congrArg (fun z : unitsInvariantSubmodule K L => @@ -188,7 +188,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_ker ← unitsNormLinearMap_toMul_eq_tateNorm K L (Additive.toMul y)] simpa using hy' · intro hx - change (x : Lˣ) ∈ tateNormSubgroup (Gal(L / K)) Lˣ at hx + change (x : Lˣ) ∈ tateNormSubgroup (Gal(L/K)) Lˣ at hx rcases hx with ⟨y, hy⟩ apply Multiplicative.toAdd.injective change @@ -212,7 +212,7 @@ theorem fixedUnitToInvariantsNormQuotientMonoidHom_surjective intro q rcases Submodule.mkQ_surjective (unitsTateH0NormSubmodule K L) (Multiplicative.toAdd q) with ⟨z, hz⟩ - let x : fixedSubgroup (Gal(L / K)) Lˣ := + let x : fixedSubgroup (Gal(L/K)) Lˣ := Additive.toMul ((additiveFixedUnitsEquivInvariants K L).symm z) refine ⟨x, ?_⟩ apply Multiplicative.toAdd.injective @@ -233,8 +233,8 @@ def herbrandH0MulEquivInvariantsNormQuotient [Fintype (Gal(L/K))] := quotientMulEquivOfSurjectiveAdditiveQuotient (unitsTateH0NormSubmodule K L) - ((tateNormSubgroup (Gal(L / K)) Lˣ).subgroupOf - (fixedSubgroup (Gal(L / K)) Lˣ)) + ((tateNormSubgroup (Gal(L/K)) Lˣ).subgroupOf + (fixedSubgroup (Gal(L/K)) Lˣ)) (fixedUnitToInvariantsNormQuotientMonoidHom K L) (fixedUnitToInvariantsNormQuotientMonoidHom_ker K L) (fixedUnitToInvariantsNormQuotientMonoidHom_surjective K L) @@ -242,7 +242,7 @@ def herbrandH0MulEquivInvariantsNormQuotient /-- 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ˣ ≃ + HerbrandH0 (Gal(L/K)) Lˣ ≃ tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0 := (mulEquivMultiplicativeToEquiv (herbrandH0MulEquivInvariantsNormQuotient K L)).trans @@ -252,34 +252,34 @@ def herbrandH0EquivTateCohomologyZero [Fintype (Gal(L/K))] : degree-zero Tate cohomology. -/ theorem cardinalMk_herbrandH0_fieldUnits_eq_tateCohomology_zero [Fintype (Gal(L/K))] : - Cardinal.mk (HerbrandH0 (Gal(L / K)) Lˣ) = + 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ˣ) : + (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 + 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ˣ) ≃+ + 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 + ((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 + ((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ˣ)] + ((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 + 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 @@ -310,8 +310,8 @@ def unitsRhoSubToNormKerLinearMap [Fintype (Gal(L/K))] /-- 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ˣ) →+ + [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 @@ -320,8 +320,8 @@ def additiveNormKernelToUnitsBoundaryQuotientHom /-- Multiplicative form of the standard boundary quotient map. -/ def normKernelToUnitsBoundaryQuotientMonoidHom - [Fintype (Gal(L/K))] (g : Gal(L / K)) : - normKernelSubgroup (Gal(L / K)) Lˣ →* + [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)) := @@ -331,12 +331,12 @@ def normKernelToUnitsBoundaryQuotientMonoidHom /-- 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)) : + [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 + (augmentationSubgroup (Gal(L/K)) Lˣ g).subgroupOf + (normKernelSubgroup (Gal(L/K)) Lˣ) := by ext x constructor · intro hx @@ -351,7 +351,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_ker (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 + change (x : Lˣ) ∈ augmentationSubgroup (Gal(L/K)) Lˣ g refine ⟨Additive.toMul y, ?_⟩ have hy' := congrArg (fun z : LinearMap.ker (unitsNormLinearMap K L) => @@ -365,7 +365,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_ker ← 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 + change (x : Lˣ) ∈ augmentationSubgroup (Gal(L/K)) Lˣ g at hx rcases hx with ⟨y, hy⟩ apply Multiplicative.toAdd.injective change @@ -395,7 +395,7 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_surjective rcases Submodule.mkQ_surjective (LinearMap.range (unitsRhoSubToNormKerLinearMap K L g)) (Multiplicative.toAdd q) with ⟨z, hz⟩ - let x : normKernelSubgroup (Gal(L / K)) Lˣ := + let x : normKernelSubgroup (Gal(L/K)) Lˣ := Additive.toMul ((additiveNormKernelEquivUnitsNormKer K L).symm z) refine ⟨x, ?_⟩ apply Multiplicative.toAdd.injective @@ -415,24 +415,24 @@ theorem normKernelToUnitsBoundaryQuotientMonoidHom_surjective /-- 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 ≃* + [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 + (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ˣ)) + ((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 ≃ + [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 @@ -442,14 +442,14 @@ def herbrandHminusOneEquivUnitsBoundaryQuotient 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) : + (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)) := + letI : IsCyclic (Gal(L/K)) := CyclicCohomology.isCyclic_of_generator g hg - letI : CommGroup (Gal(L / K)) := IsCyclic.commGroup + letI : CommGroup (Gal(L/K)) := IsCyclic.commGroup let T := Rep.FiniteCyclicGroup.subCompNormHom (Rep.ofAlgebraAutOnUnits K L) g have hmap : @@ -471,9 +471,9 @@ noncomputable def unitsTateHminusOneIsoBoundaryQuotient /-- 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 ≃ + [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 @@ -482,9 +482,9 @@ noncomputable def herbrandHminusOneEquivUnitsTateHminusOne 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) = + [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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean index 91c941f119..2d2742b6b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean @@ -44,11 +44,11 @@ omit [IsGalois K L] in 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) + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) (hU : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - HerbrandQuotientDefined (Gal(L / K)) + HerbrandQuotientDefined (Gal(L/K)) (ValuativeRel.valuation L).integerˣ g) : Finite (tateCohomology (Rep.ofAlgebraAutOnUnits K L) 0) := by let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L @@ -56,8 +56,8 @@ theorem unitsTateH0FiniteOfIntegerUnitsHerbrand 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ˣ) + 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 @@ -65,15 +65,15 @@ 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) + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) (hU : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - HerbrandQuotientDefined (Gal(L / K)) + HerbrandQuotientDefined (Gal(L/K)) (ValuativeRel.valuation L).integerˣ g) (hU_one : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - @herbrandQuotient (Gal(L / K)) + @herbrandQuotient (Gal(L/K)) (ValuativeRel.valuation L).integerˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 = 1) : @@ -84,26 +84,26 @@ theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one let := galoisGroupFieldUnitsMulDistribMulAction K L let := galoisGroupValueGroupMulDistribMulAction K L let hZ : HerbrandQuotientDefined - (Gal(L / K)) (Multiplicative Int) g := + (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)) Lˣ) := hField.1 + let : Finite (HerbrandHMinusOne (Gal(L/K)) Lˣ g) := hField.2 let : Finite - (HerbrandH0 (Gal(L / K)) (Multiplicative Int)) := hZ.1 + (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := hZ.1 let : Finite - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) g) := hZ.2 + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) g) := hZ.2 have hZ0 : - Nat.card (HerbrandH0 (Gal(L / K)) (Multiplicative Int)) = + 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 := + (Gal(L/K)) (Multiplicative Int) g) = 1 := galoisGroupValueGroup_herbrandHMinusOne_card_eq_one K L g have hZ_one : - @herbrandQuotient (Gal(L / K)) (Multiplicative Int) _ _ _ + @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ (galoisGroupValueGroupMulDistribMulAction K L) g hZ.1 hZ.2 = (Module.finrank K L : ℚ) := by rw [herbrandQuotient_eq_card_ratio, hZ0, hZm1] @@ -112,22 +112,22 @@ theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one 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 + 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ˣ _ _ _ + @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ (galoisGroupFieldUnitsMulDistribMulAction K L) g hField.1 hField.2 = (Module.finrank K L : ℚ) := by rw [hmult, hU_one, hZ_one] simp have h0_field_rat : - (Nat.card (HerbrandH0 (Gal(L / K)) Lˣ) : ℚ) = + (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 + Nat.card (HerbrandH0 (Gal(L/K)) Lˣ) = Module.finrank K L := by exact_mod_cast h0_field_rat constructor · exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean index ff9db70554..00f12f973c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean @@ -22,7 +22,7 @@ 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) : + (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)) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean index 885bdeb34c..6c8adabe90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -50,10 +50,10 @@ theorem chosenNormalBasisIntegerUnitsHerbrand_shortExact letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV - (∀ (sigma : Gal(L / K)) (a : V), + (∀ (sigma : Gal(L/K)) (a : V), chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V (sigma • a) = sigma • chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) V a) ∧ - (∀ (sigma : Gal(L / K)) (a : 𝒪[L]ˣ), + (∀ (sigma : Gal(L/K)) (a : 𝒪[L]ˣ), chosenNormalBasisIntegerUnitsQuotientMap (L := L) V (sigma • a) = sigma • chosenNormalBasisIntegerUnitsQuotientMap (L := L) V a) ∧ (∀ a : 𝒪[L]ˣ, @@ -98,30 +98,30 @@ 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) + (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)) + Subsingleton (HerbrandH0 (Gal(L/K)) V)) (hHminusOne : letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV - Subsingleton (HerbrandHMinusOne (Gal(L / K)) V g)) : + 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 - ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, - @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 = 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 := + 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 := + 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]ˣ, @@ -129,27 +129,27 @@ theorem integerUnits_herbrandQuotient_eq_one_of_chosenNormalBasis 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) + (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 + 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 + (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 + 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 := + (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) + (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 @@ -165,17 +165,17 @@ theorem exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLe ∃ 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) → + (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)) → + Subsingleton (HerbrandH0 (Gal(L/K)) V)) → (letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV; - Subsingleton (HerbrandHMinusOne (Gal(L / K)) V g)) → + 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 - ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, - @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 = 1 := by rcases exists_finite_chosenNormalBasisIntegerUnitsQuotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean index ef60ad810a..8b2c3f0d4d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -665,52 +665,32 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees [∀ i, IsNonarchimedeanLocalField (d i).base.Completion] : - letI _extensionAlgebra : ∀ i, - Algebra K (d i).extension.1.Completion := - fun i ↦ AbsoluteValue.extensionCompletionAlgebra + 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 : ∀ i, - Algebra (d i).base.Completion - (d i).extension.1.Completion := - fun i ↦ AbsoluteValue.completionAlgebra + letI _completionAlgebra := + 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 + letI _globalAlgebra := + 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 + letI _scalarTower := + 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 + letI _localizedFinite := + 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 + letI _localizedGalois := + 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 + letI _localAction := + fun i : ι ↦ decompositionGroupLocalUnitsAction (d i).base (d i).base_isNontrivial (d i).extension letI _blockAction : ∀ i, @@ -718,12 +698,10 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (LocalPlaceBlock (d i).base (d i).base_isNontrivial (d i).extension) := - fun i ↦ inducedMulDistribMulAction + fun i : ι ↦ inducedMulDistribMulAction (absoluteValueDecompositionGroup K (d i).extension.1) - letI _familyAction : - MulDistribMulAction (L ≃ₐ[K] L) - (LocalBlockFamily d) := + letI _familyAction := piMulDistribMulAction (L ≃ₐ[K] L) (fun i ↦ LocalPlaceBlock (d i).base (d i).base_isNontrivial @@ -733,16 +711,10 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (absoluteValueDecompositionGroup K (d i).extension.1) := fun _ ↦ Fintype.ofFinite _ - letI _familyH0Finite : - Finite - (HerbrandH0 (L ≃ₐ[K] L) - (LocalBlockFamily d)) := + letI _familyH0Finite := localBlockFamilyHerbrandH0Finite d σ hgen - letI _familyHMinusOneFinite : - Finite - (HerbrandHMinusOne (L ≃ₐ[K] L) - (LocalBlockFamily d) σ) := + letI _familyHMinusOneFinite := localBlockFamilyHerbrandHMinusOneFinite d σ hgen herbrandQuotient @@ -752,51 +724,31 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (d i).base.Completion (LocalizedCompletion (d i).base (d i).extension) : ℚ) := by - let extensionAlgebra : ∀ i, - Algebra K (d i).extension.1.Completion := - fun i ↦ AbsoluteValue.extensionCompletionAlgebra + 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 : ∀ i, - Algebra (d i).base.Completion - (d i).extension.1.Completion := - fun i ↦ AbsoluteValue.completionAlgebra + let completionAlgebra := + 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 + let globalAlgebra := + 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 + let scalarTower := + 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 + let localizedFinite := + 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 + let localizedGalois := + 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 + let localAction := + fun i : ι ↦ decompositionGroupLocalUnitsAction (d i).base (d i).base_isNontrivial (d i).extension let blockAction : ∀ i, @@ -804,12 +756,10 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (LocalPlaceBlock (d i).base (d i).base_isNontrivial (d i).extension) := - fun i ↦ inducedMulDistribMulAction + fun i : ι ↦ inducedMulDistribMulAction (absoluteValueDecompositionGroup K (d i).extension.1) - let familyAction : - MulDistribMulAction (L ≃ₐ[K] L) - (LocalBlockFamily d) := + let familyAction := piMulDistribMulAction (L ≃ₐ[K] L) (fun i ↦ LocalPlaceBlock (d i).base (d i).base_isNontrivial @@ -819,37 +769,16 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (absoluteValueDecompositionGroup K (d i).extension.1) := fun _ ↦ Fintype.ofFinite _ - let localH0Finite : ∀ i, - Finite - (HerbrandH0 - (absoluteValueDecompositionGroup K - (d i).extension.1) - (LocalizedCompletion - (d i).base (d i).extension)ˣ) := - fun i ↦ localHerbrandH0Finite + let localH0Finite := + fun i : ι ↦ localHerbrandH0Finite (d i).base (d i).base_isNontrivial (d i).extension σ hgen - let localHMinusOneFinite : ∀ 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 + let localHMinusOneFinite := + fun i : ι ↦ localHerbrandHMinusOneFinite (d i).base (d i).base_isNontrivial (d i).extension σ hgen - let blockH0Finite : ∀ i, - Finite - (HerbrandH0 (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base (d i).base_isNontrivial - (d i).extension)) := - fun i ↦ Finite.of_equiv + let blockH0Finite := + fun i : ι ↦ Finite.of_equiv (HerbrandH0 (absoluteValueDecompositionGroup K (d i).extension.1) @@ -858,13 +787,8 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (localPlaceBlockHerbrandH0Equiv (d i).base (d i).base_isNontrivial (d i).extension σ hgen).symm.toEquiv - let blockHMinusOneFinite : ∀ i, - Finite - (HerbrandHMinusOne (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base (d i).base_isNontrivial - (d i).extension) σ) := - fun i ↦ Finite.of_equiv + let blockHMinusOneFinite := + fun i : ι ↦ Finite.of_equiv (HerbrandHMinusOne (absoluteValueDecompositionGroup K (d i).extension.1) @@ -877,16 +801,10 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (localPlaceBlockHerbrandHMinusOneEquiv (d i).base (d i).base_isNontrivial (d i).extension σ hgen).symm.toEquiv - let familyH0Finite : - Finite - (HerbrandH0 (L ≃ₐ[K] L) - (LocalBlockFamily d)) := + let familyH0Finite := localBlockFamilyHerbrandH0Finite d σ hgen - let familyHMinusOneFinite : - Finite - (HerbrandHMinusOne (L ≃ₐ[K] L) - (LocalBlockFamily d) σ) := + let familyHMinusOneFinite := localBlockFamilyHerbrandHMinusOneFinite d σ hgen calc @@ -908,77 +826,16 @@ theorem localBlockFamily_herbrandQuotient_eq_product_localDegrees (d i).base (d i).extension) : ℚ) := by apply Finset.prod_congr rfl intro i _ - have hH0 : - Nat.card - (HerbrandH0 (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base - (d i).base_isNontrivial - (d i).extension)) = - Module.finrank - (d i).base.Completion - (LocalizedCompletion - (d i).base (d i).extension) := by - calc - Nat.card - (HerbrandH0 (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base - (d i).base_isNontrivial - (d i).extension)) = - Nat.card - (HerbrandH0 - (absoluteValueDecompositionGroup K - (d i).extension.1) - (LocalizedCompletion - (d i).base (d i).extension)ˣ) := - Nat.card_congr - (localPlaceBlockHerbrandH0Equiv - (d i).base - (d i).base_isNontrivial - (d i).extension σ hgen).toEquiv - _ = Module.finrank - (d i).base.Completion - (LocalizedCompletion - (d i).base (d i).extension) := - localHerbrandH0_card_eq_localDegree - (d i).base - (d i).base_isNontrivial - (d i).extension σ hgen - have hHMinusOne : - Nat.card - (HerbrandHMinusOne (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base - (d i).base_isNontrivial - (d i).extension) σ) = 1 := by - calc - Nat.card - (HerbrandHMinusOne (L ≃ₐ[K] L) - (LocalPlaceBlock - (d i).base - (d i).base_isNontrivial - (d i).extension) σ) = - 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_congr - (localPlaceBlockHerbrandHMinusOneEquiv - (d i).base - (d i).base_isNontrivial - (d i).extension σ hgen).toEquiv - _ = 1 := - localHerbrandHMinusOne_card_eq_one - (d i).base - (d i).base_isNontrivial - (d i).extension σ hgen + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index 9bdcb66487..c202330e67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -40,11 +40,11 @@ variable (K L : Type) [Field K] [Field L] [Algebra 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) : + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - ∃ hU : HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g, - @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 = 1 := by rcases exists_chosenNormalBasisPrincipalUnitSubgroup @@ -70,17 +70,17 @@ theorem exists_localIntegerUnitsHerbrandDefinedAndEqOne /-- 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) : + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - HerbrandQuotientDefined (Gal(L / K)) 𝒪[L]ˣ g := + 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) : + (g : Gal(L/K)) + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - @herbrandQuotient (Gal(L / K)) 𝒪[L]ˣ _ _ _ + @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g (localIntegerUnitsHerbrandDefined K L g hg).1 (localIntegerUnitsHerbrandDefined K L g hg).2 = 1 := @@ -90,7 +90,7 @@ private theorem localIntegerUnitsHerbrandQuotient_eq_one normal-basis witness as the cardinality theorem. -/ theorem localFieldUnitsTateH0FiniteOfGenerator (g : Gal(L/K)) - (hg : ∀ sigma : Gal(L / K), sigma ∈ Subgroup.zpowers g) : + (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) @@ -98,7 +98,7 @@ theorem localFieldUnitsTateH0FiniteOfGenerator /-- 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) : + (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 @@ -111,7 +111,7 @@ 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), + ∃ g : Gal(L/K), ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) exact localFieldUnitsTateH0FiniteOfGenerator K L g hg @@ -122,7 +122,7 @@ theorem localFieldUnits_tate_card_of_isCyclic [IsCyclic (Gal(L/K))] : 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), + ∃ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean index 2079290460..fdf2264eb4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -11,6 +11,19 @@ import Mathlib.LinearAlgebra.Quotient.Pi /-! Provides the public declarations in the `LocalClassFieldTheory.ClassFormation.NormalBasis` Lean module. -/ +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 @@ -43,7 +56,7 @@ theorem span_normalBasis_eq_chosenNormalBasisIntegerLattice : 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) := + Module.Basis Gal(L/K) 𝒪[K] (chosenNormalBasisIntegerLattice K L) := ((IsGalois.normalBasis K L).restrictScalars 𝒪[K]).map (LinearEquiv.ofEq _ _ (span_normalBasis_eq_chosenNormalBasisIntegerLattice K L)) @@ -227,16 +240,16 @@ theorem chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv_mk_mulPo /-- Coordinate functions all of whose values lie in the maximal ideal of `𝒪_K`. -/ def chosenNormalBasisCoordinateMaximalSubmodule : - Submodule 𝒪[K] (Gal(L / K) → 𝒪[K]) := + 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 : Gal(L/K) → 𝒪[K]) : f ∈ chosenNormalBasisCoordinateMaximalSubmodule K L ↔ - ∀ σ : Gal(L / K), f σ ∈ (𝓂[K] : Ideal 𝒪[K]) := by + ∀ σ : Gal(L/K), f σ ∈ (𝓂[K] : Ideal 𝒪[K]) := by simp [chosenNormalBasisCoordinateMaximalSubmodule] /-- Normal-basis coordinates identify the uniformizer submodule with pointwise maximal-ideal @@ -244,7 +257,7 @@ values. -/ theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_equivFun : (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L).map ((chosenNormalBasisIntegerLatticeBasis K L).equivFun : - chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] (Gal(L / K) → 𝒪[K])) = + chosenNormalBasisIntegerLattice K L →ₗ[𝒪[K]] (Gal(L/K) → 𝒪[K])) = chosenNormalBasisCoordinateMaximalSubmodule K L := by ext f constructor @@ -264,15 +277,15 @@ theorem chosenNormalBasisIntegerLatticeUniformizerSubmodule_map_equivFun : rw [hx_eq] simp [mul_comm] · intro hf - have hf' : ∀ σ : Gal(L / K), + 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)) : + 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 := @@ -302,7 +315,7 @@ maximal-ideal quotient. -/ noncomputable def chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv : (chosenNormalBasisIntegerLattice K L ⧸ chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) ≃ₗ[𝒪[K]] - ((Gal(L / K) → 𝒪[K]) ⧸ chosenNormalBasisCoordinateMaximalSubmodule K L) := + ((Gal(L/K) → 𝒪[K]) ⧸ chosenNormalBasisCoordinateMaximalSubmodule K L) := Submodule.Quotient.equiv (chosenNormalBasisIntegerLatticeUniformizerSubmodule K L) (chosenNormalBasisCoordinateMaximalSubmodule K L) @@ -312,27 +325,27 @@ noncomputable def chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv : /-- 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 + ((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])) + 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]) : + (f : Gal(L/K) → 𝒪[K]) : chosenNormalBasisCoordinateQuotPiLinearEquiv K L (Submodule.Quotient.mk f) = - fun σ : Gal(L / K) => 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 + (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 @@ -352,7 +365,7 @@ 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]))) + (f : Gal(L/K) → (𝒪[K] ⧸ (𝓂[K] : Ideal 𝒪[K]))) (σ : Gal(L/K)) : chosenNormalBasisPiResidueInverseIndexAddEquiv K L f σ = integerRingModMaximalIdealAddEquivResidue K (f σ⁻¹) := @@ -362,7 +375,7 @@ theorem chosenNormalBasisPiResidueInverseIndexAddEquiv_apply `π_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]) := + chosenNormalBasisLatticeSuccQuot K L n ≃+ (Gal(L/K) → 𝓀[K]) := (chosenNormalBasisLatticeSuccQuotToIntegerLatticeQuotLinearEquiv K L n).toAddEquiv.trans ((chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv K L).toAddEquiv.trans ((chosenNormalBasisCoordinateQuotPiLinearEquiv K L).toAddEquiv.trans @@ -378,9 +391,13 @@ theorem chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv_mk_mulPow IsLocalRing.residue 𝒪[K] ((chosenNormalBasisIntegerLatticeBasis K L).equivFun x σ⁻¹) := by rw [chosenNormalBasisLatticeSuccQuotRightRegularAddEquiv] - simp [chosenNormalBasisIntegerLatticeQuotCoordinateQuotLinearEquiv, - chosenNormalBasisCoordinateQuotPiLinearEquiv, - chosenNormalBasisPiResidueInverseIndexAddEquiv] + 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 σ⁻¹)) = _ @@ -448,7 +465,6 @@ theorem galoisGroupChosenNormalBasisIntegerLatticeLinearEquiv_mul_apply 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 @@ -458,7 +474,7 @@ theorem chosenNormalBasisIntegerLatticeBasis_equivFun_galoisGroup (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 τ⁻¹ + 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] @@ -470,7 +486,7 @@ theorem chosenNormalBasisIntegerLatticeBasis_equivFun_galoisGroup rw [IsGalois.normalBasis_apply (K := K) (L := L) (τ * ρ), IsGalois.normalBasis_apply (K := K) (L := L) ρ] rfl - have hcoord (ρ : Gal(L / K)) : + have hcoord (ρ : Gal(L/K)) : b.equivFun (f x) (τ * ρ) = b.equivFun x ρ := by calc b.equivFun (f x) (τ * ρ) = @@ -625,7 +641,7 @@ the actual action on the extension field. -/ @[implicit_reducible] noncomputable def galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction (n : Nat) : - DistribMulAction Gal(L / K) (chosenNormalBasisLatticeSuccQuot K L n) where + DistribMulAction Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) where smul τ q := galoisGroupChosenNormalBasisLatticeSuccQuotAddEquiv K L n τ q one_smul := by intro q @@ -677,8 +693,8 @@ theorem galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction_smul_mk_mulP /-- 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)) : + (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 @@ -705,14 +721,14 @@ piece. -/ theorem chosenNormalBasisLatticeSuccQuot_herbrandH0_subsingleton (n : Nat) : letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n letI := - CyclicCohomology.ProfiniteCohomology.Herbrand.multiplicativeMulDistribMulActionOfDistribMulAction - Gal(L / K) (chosenNormalBasisLatticeSuccQuot K L n) + multiplicativeMulDistribMulActionOfDistribMulAction + Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) Subsingleton (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - Gal(L / K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n))) := by + Gal(L/K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n))) := by let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n exact - CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandH0_subsingleton_of_addEquiv_rightRegularFunction - (G := Gal(L / K)) (M := chosenNormalBasisLatticeSuccQuot K L n) (D := 𝓀[K]) + 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) @@ -720,17 +736,17 @@ theorem chosenNormalBasisLatticeSuccQuot_herbrandH0_subsingleton (n : Nat) : graded piece. -/ theorem chosenNormalBasisLatticeSuccQuot_herbrandHMinusOne_subsingleton (n : Nat) (τ : Gal(L/K)) - (hgen : ∀ g : Gal(L / K), g ∈ Subgroup.zpowers τ) : + (hgen : ∀ g : Gal(L/K), g ∈ Subgroup.zpowers τ) : letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n letI := - CyclicCohomology.ProfiniteCohomology.Herbrand.multiplicativeMulDistribMulActionOfDistribMulAction - Gal(L / K) (chosenNormalBasisLatticeSuccQuot K L n) + multiplicativeMulDistribMulActionOfDistribMulAction + Gal(L/K) (chosenNormalBasisLatticeSuccQuot K L n) Subsingleton (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - Gal(L / K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n)) τ) := by + Gal(L/K) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L n)) τ) := by let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n exact - CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandHMinusOne_subsingleton_of_addEquiv_rightRegularFunction - (G := Gal(L / K)) (M := chosenNormalBasisLatticeSuccQuot K L n) (D := 𝓀[K]) + 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean index d943df1a3a..7176d24ddb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean @@ -39,14 +39,14 @@ variable (K L : Type u) [Field K] [Field L] [Algebra K L] `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) : + (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 + 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 @@ -57,15 +57,15 @@ theorem exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton 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 + 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), + have haFixed : ∀ sigma : Gal(L/K), letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L sigma • ((a : V) : 𝒪[L]ˣ) = ((a : V) : 𝒪[L]ˣ) := by intro sigma @@ -81,8 +81,8 @@ theorem exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton 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 + 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 @@ -90,7 +90,7 @@ theorem exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton exact (a : V).2 have haNorm : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - tateNorm (Gal(L / K)) 𝒪[L]ˣ ((a : V) : 𝒪[L]ˣ) = 1 := by + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean index 38e8467ed3..83eef412fb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -140,9 +140,9 @@ the standard `V^n`. -/ def chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) : - MulDistribMulAction (Gal(L / K)) V := by + MulDistribMulAction (Gal(L/K)) V := by letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - exact subgroupMulDistribMulActionOfStable (Gal(L / K)) 𝒪[L]ˣ V + exact subgroupMulDistribMulActionOfStable (Gal(L/K)) 𝒪[L]ˣ V (by intro sigma a ha change sigma • (a : 𝒪[L]ˣ) ∈ (V : Set 𝒪[L]ˣ) @@ -170,13 +170,13 @@ theorem chosenNormalBasisPrincipalUnitSubgroup_tateNorm_coe (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 + ((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]ˣ) + 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 @@ -187,11 +187,11 @@ theorem chosenNormalBasisPrincipalUnitSubgroup_tateNorm_coe theorem chosenNormalBasisPrincipalUnitSubgroup_sigmaMinusOne_coe (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) - (sigma : Gal(L / K)) (a : V) : + (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 + ((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 @@ -202,10 +202,10 @@ Galois action. -/ def chosenNormalBasisIntegerUnitsQuotMulDistribMulAction (n : Nat) (V : Subgroup 𝒪[L]ˣ) (hV : (V : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) : - MulDistribMulAction (Gal(L / K)) (𝒪[L]ˣ ⧸ V) := by + MulDistribMulAction (Gal(L/K)) (𝒪[L]ˣ ⧸ V) := by letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L exact quotientMulDistribMulActionOfSubgroupStable - (Gal(L / K)) 𝒪[L]ˣ V (by + (Gal(L/K)) 𝒪[L]ˣ V (by intro sigma a ha change a ∈ (V : Set 𝒪[L]ˣ) at ha change sigma • a ∈ (V : Set 𝒪[L]ˣ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean index 5a347553b2..06b1a28409 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -75,15 +75,15 @@ def chosenNormalBasisPrincipalUnitSuccQuotMulDistribMulAction (hVn : (Vn : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L n) (hVsucc : (Vsucc : Set 𝒪[L]ˣ) = chosenNormalBasisPrincipalUnitSet K L (n + 1)) : - MulDistribMulAction (Gal(L / K)) + 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)) + change MulDistribMulAction (Gal(L/K)) (Vn ⧸ chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) exact quotientMulDistribMulActionOfSubgroupStable - (Gal(L / K)) Vn + (Gal(L/K)) Vn (chosenNormalBasisPrincipalUnitSuccSubgroup (L := L) hV) (by intro sigma a ha apply (mem_chosenNormalBasisPrincipalUnitSuccSubgroup_iff @@ -126,7 +126,7 @@ theorem chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup Multiplicative.ofAdd (chosenNormalBasisPrincipalUnitLatticeClass K L n (u : 𝒪[L]ˣ) (by exact hVn ▸ u.2))) - (sigma : Gal(L / K)) + (sigma : Gal(L/K)) (q : chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) : letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n Vn hVn @@ -134,7 +134,7 @@ theorem chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup K L n hV hVn hVsucc letI := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n letI := multiplicativeMulDistribMulActionOfDistribMulAction - (Gal(L / K)) (chosenNormalBasisLatticeSuccQuot K L n) + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L n) Phi (sigma • q) = sigma • Phi q := by let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction @@ -143,7 +143,7 @@ theorem chosenNormalBasisPrincipalUnitSuccQuotMulEquiv_galoisGroup K L n hV hVn hVsucc let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L n let := multiplicativeMulDistribMulActionOfDistribMulAction - (Gal(L / K)) (chosenNormalBasisLatticeSuccQuot K L n) + (Gal(L/K)) (chosenNormalBasisLatticeSuccQuot K L n) refine chosenNormalBasisPrincipalUnitSuccQuot.inductionOn (L := L) hV @@ -164,12 +164,12 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L ∃ c : Nat, ∀ k : Nat, c ≤ k → ∀ a : 𝒪[L]ˣ, a ∈ chosenNormalBasisPrincipalUnitSet K L k → - (∀ sigma : Gal(L / K), sigma • a = a) → + (∀ 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 + (∀ 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⟩ @@ -183,14 +183,14 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting K L k hV hVn hVsucc let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L k let := multiplicativeMulDistribMulActionOfDistribMulAction - (Gal(L / K)) (chosenNormalBasisLatticeSuccQuot K L k) + (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 + have hqfixed : ∀ sigma : Gal(L/K), sigma • q = q := by intro sigma dsimp [q] calc @@ -204,19 +204,19 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting congr 2 apply Subtype.ext exact hfixed sigma - let qfixed : fixedSubgroup (Gal(L / K)) + 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)) + ((tateNormSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k))).subgroupOf - (fixedSubgroup (Gal(L / K)) + (fixedSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)))) qfixed = 1 := @Subsingleton.elim _ hH0 _ _ - have hqmem : q ∈ tateNormSubgroup (Gal(L / K)) + have hqmem : q ∈ tateNormSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) := by have hm := (QuotientGroup.eq_one_iff _).1 hqone exact hm @@ -227,36 +227,36 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting ⟨bv, hbvmk⟩ change chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv = qb at hbvmk have hPhiNorm : - Phi (tateNorm (Gal(L / K)) + Phi (tateNorm (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = q := by calc - Phi (tateNorm (Gal(L / K)) + Phi (tateNorm (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = - tateNorm (Gal(L / K)) + 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)) + _ = tateNorm (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) y := by rw [hbvmk, hqb] _ = q := hy have hquotNorm : - tateNorm (Gal(L / K)) + 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 + 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)) + tateNorm (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) := by exact map_tateNorm @@ -272,14 +272,14 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting dsimp [aprimev] rw [map_div, hmkbn] simp - have havfixed : ∀ sigma : Gal(L / K), sigma • av = av := by + 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 + 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 + 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 @@ -294,12 +294,12 @@ theorem exists_chosenNormalBasisPrincipalUnit_h0_oneStep_lifting · intro sigma exact congrArg (fun z : Vn => (z : 𝒪[L]ˣ)) (haprimefixed sigma) · have hbnval : (bn : 𝒪[L]ˣ) = - tateNorm (Gal(L / K)) 𝒪[L]ˣ (bv : 𝒪[L]ˣ) := by + 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]ˣ) * + change a = tateNorm (Gal(L/K)) 𝒪[L]ˣ (bv : 𝒪[L]ˣ) * (aprimev : 𝒪[L]ˣ) rw [← hbnval] dsimp [aprimev, av] @@ -311,17 +311,17 @@ 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), + (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 → + 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 + 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⟩ @@ -335,39 +335,39 @@ theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting K L k hV hVn hVsucc let := galoisGroupChosenNormalBasisLatticeSuccQuotDistribMulAction K L k let := multiplicativeMulDistribMulActionOfDistribMulAction - (Gal(L / K)) (chosenNormalBasisLatticeSuccQuot K L k) + (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 + 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 + (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)) + have hqnorm : tateNorm (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) q = 1 := by dsimp [q] calc - tateNorm (Gal(L / K)) + tateNorm (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) (Phi (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV av)) = - Phi (tateNorm (Gal(L / K)) + 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 + (tateNorm (Gal(L/K)) Vn av)) := by congr 1 exact (map_tateNorm (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV) @@ -375,20 +375,20 @@ theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting (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)) + 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)) + ((augmentationSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g).subgroupOf - (normKernelSubgroup (Gal(L / K)) + (normKernelSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)))) qker = 1 := @Subsingleton.elim _ hHm _ _ - have hqmem : q ∈ augmentationSubgroup (Gal(L / K)) + have hqmem : q ∈ augmentationSubgroup (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g := by have hm := (QuotientGroup.eq_one_iff _).1 hqone exact hm @@ -399,36 +399,36 @@ theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting ⟨bv, hbvmk⟩ change chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv = qb at hbvmk have hPhiCoboundary : - Phi (sigmaMinusOne (Gal(L / K)) + Phi (sigmaMinusOne (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = q := by calc - Phi (sigmaMinusOne (Gal(L / K)) + Phi (sigmaMinusOne (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv)) = - sigmaMinusOne (Gal(L / K)) + 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)) + _ = sigmaMinusOne (Gal(L/K)) (Multiplicative (chosenNormalBasisLatticeSuccQuot K L k)) g y := by rw [hbvmk, hqb] _ = q := hy have hquotCoboundary : - sigmaMinusOne (Gal(L / K)) + 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 + 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)) + sigmaMinusOne (Gal(L/K)) (chosenNormalBasisPrincipalUnitSuccQuot (L := L) hV) g (chosenNormalBasisPrincipalUnitSuccQuotMk (L := L) hV bv) := by exact map_sigmaMinusOne @@ -444,12 +444,12 @@ theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting dsimp [aprimev] rw [map_div, hmkcob] simp - have haprimeNormV : tateNorm (Gal(L / K)) Vn aprimev = 1 := by + 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]ˣ + have haprimeNorm : tateNorm (Gal(L/K)) 𝒪[L]ˣ (aprimev : 𝒪[L]ˣ) = 1 := by have hmap := map_tateNorm (chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn) @@ -457,24 +457,24 @@ theorem exists_chosenNormalBasisPrincipalUnit_hMinusOne_oneStep_lifting (K := K) (L := L) k Vn hVn sigma z) aprimev have hleft : chosenNormalBasisPrincipalUnitSubgroupInclusion (L := L) Vn - (tateNorm (Gal(L / K)) Vn aprimev) = 1 := + (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]ˣ) + 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 + 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]ˣ) * + change a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (bv : 𝒪[L]ˣ) * (aprimev : 𝒪[L]ˣ) rw [← hcobval] dsimp [aprimev, av] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean index 15c3346627..3bbd4ea5ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -141,11 +141,11 @@ theorem tendsto_galoisGroupIntegerUnits_tateNorm_of_tendsto letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L Tendsto (fun d : Nat => - ((tateNorm (Gal(L / K)) 𝒪[L]ˣ (f d) : 𝒪[L]ˣ) : 𝒪[L])) + ((tateNorm (Gal(L/K)) 𝒪[L]ˣ (f d) : 𝒪[L]ˣ) : 𝒪[L])) atTop - (nhds ((tateNorm (Gal(L / K)) 𝒪[L]ˣ x : 𝒪[L]ˣ) : 𝒪[L])) := by + (nhds ((tateNorm (Gal(L/K)) 𝒪[L]ˣ x : 𝒪[L]ˣ) : 𝒪[L])) := by let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - have hσ (sigma : Gal(L / K)) : Tendsto + have hσ (sigma : Gal(L/K)) : Tendsto (fun d : Nat => ((sigma • f d : 𝒪[L]ˣ) : 𝒪[L])) atTop (nhds ((sigma • x : 𝒪[L]ˣ) : 𝒪[L])) := by have he := @@ -163,7 +163,7 @@ theorem tendsto_galoisGroupIntegerUnits_tateNorm_of_tendsto simpa [ galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure_smul] using he have hprod := tendsto_finsetProd - (Finset.univ : Finset (Gal(L / K))) (fun sigma _ => hσ sigma) + (Finset.univ : Finset (Gal(L/K))) (fun sigma _ => hσ sigma) convert hprod using 1 <;> simp [tateNorm] omit [FiniteDimensional K L] [IsGalois K L] @@ -181,9 +181,9 @@ theorem tendsto_galoisGroupIntegerUnits_sigmaMinusOne_of_tendsto letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L Tendsto (fun d : Nat => - ((sigmaMinusOne (Gal(L / K)) 𝒪[L]ˣ g (f d) : 𝒪[L]ˣ) : 𝒪[L])) + ((sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (f d) : 𝒪[L]ˣ) : 𝒪[L])) atTop - (nhds ((sigmaMinusOne (Gal(L / K)) 𝒪[L]ˣ g x : 𝒪[L]ˣ) : 𝒪[L])) := by + (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 @@ -291,7 +291,6 @@ theorem chosenNormalBasisPrincipalUnitCorrectionProduct_eq_principalUnitsCorrect 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 @@ -315,7 +314,6 @@ theorem chosenNormalBasisPrincipalUnitCorrectionProduct_mem (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. -/ @@ -384,7 +382,6 @@ theorem exists_tendsto_chosenNormalBasisPrincipalUnitCorrectionProduct_principal (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean index 173540ca58..fbd2e77377 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean @@ -56,9 +56,9 @@ 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) → + (∀ sigma : Gal(L/K), sigma • a = a) → ∃ b : 𝒪[L]ˣ, b ∈ chosenNormalBasisPrincipalUnitSet K L n ∧ - a = tateNorm (Gal(L / K)) 𝒪[L]ˣ b := by + 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⟩ @@ -80,9 +80,9 @@ theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : 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 + ∀ sigma : Gal(L/K), sigma • x = x let F : 𝒪[L]ˣ →* 𝒪[L]ˣ := - tateNormHom (G := Gal(L / K)) (A := 𝒪[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), @@ -118,7 +118,7 @@ theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : (K := K) (L := L) (fun d => chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) x hx have hrec (d : Nat) : - a = tateNorm (Gal(L / K)) 𝒪[L]ˣ + a = tateNorm (Gal(L/K)) 𝒪[L]ˣ (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) * (states d).value := by have h := filteredLift_initial_eq_correctionProduct_mul_state @@ -128,16 +128,16 @@ theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : simpa [initial, states, F] using h have hmul : Tendsto (fun d : Nat => - ((tateNorm (Gal(L / K)) 𝒪[L]ˣ + ((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)) := + (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 + ((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)) @@ -149,14 +149,14 @@ theorem exists_chosenNormalBasisPrincipalUnit_fixed_is_tateNorm : 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), + (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 → + tateNorm (Gal(L/K)) 𝒪[L]ˣ a = 1 → ∃ b : 𝒪[L]ˣ, b ∈ chosenNormalBasisPrincipalUnitSet K L n ∧ - a = sigmaMinusOne (Gal(L / K)) 𝒪[L]ˣ g b := by + 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⟩ @@ -178,9 +178,9 @@ theorem exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne 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 + tateNorm (Gal(L/K)) 𝒪[L]ˣ x = 1 let F : 𝒪[L]ˣ →* 𝒪[L]ˣ := - sigmaMinusOneHom (G := Gal(L / K)) (A := 𝒪[L]ˣ) g + 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), @@ -216,7 +216,7 @@ theorem exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne (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 + a = sigmaMinusOne (Gal(L/K)) 𝒪[L]ˣ g (chosenNormalBasisPrincipalUnitCorrectionProduct (L := L) z d) * (states d).value := by have h := filteredLift_initial_eq_correctionProduct_mul_state @@ -226,16 +226,16 @@ theorem exists_chosenNormalBasisPrincipalUnit_normOne_is_sigmaMinusOne simpa [initial, states, F] using h have hmul : Tendsto (fun d : Nat => - ((sigmaMinusOne (Gal(L / K)) 𝒪[L]ˣ g + ((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)) := + (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 + ((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)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean index b07fdbb4ff..f1fc5dd2cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean @@ -27,7 +27,6 @@ variable (K L : Type u) [Field K] [Field L] [Algebra K 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)`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean index b0147693b9..80cc2e3839 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -27,7 +27,7 @@ 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 + MulDistribMulAction (Gal(L/K)) Lˣ where smul σ x := Units.mapEquiv σ.toMulEquiv x one_smul := by intro x @@ -61,7 +61,7 @@ def galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : - MulDistribMulAction (Gal(L / K)) 𝒪[L]ˣ where + MulDistribMulAction (Gal(L/K)) 𝒪[L]ˣ where smul σ x := Units.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv x one_smul := by @@ -101,7 +101,7 @@ 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 + MulDistribMulAction (Gal(L/K)) (Multiplicative Int) where smul _ n := n one_smul := by intro n; rfl mul_smul := by intro _ _ n; rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean index f9b21b387e..79cd5bdbd6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -44,10 +44,10 @@ theorem valuationHerbrand_shortExact : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupFieldUnitsMulDistribMulAction K L letI := galoisGroupValueGroupMulDistribMulAction K L - (∀ (σ : Gal(L / K)) (x : (ValuativeRel.valuation L).integerˣ), + (∀ (σ : Gal(L/K)) (x : (ValuativeRel.valuation L).integerˣ), integerUnitsToFieldUnits L (σ • x) = σ • integerUnitsToFieldUnits L x) ∧ - (∀ (σ : Gal(L / K)) (x : Lˣ), + (∀ (σ : Gal(L/K)) (x : Lˣ), valuationUnitsMulHom L (σ • x) = σ • valuationUnitsMulHom L x) ∧ (∀ x : Lˣ, valuationUnitsMulHom L x = 1 ↔ @@ -73,9 +73,9 @@ omit [ValuativeRel K] [ValuativeRel L] [TopologicalSpace L] its degree-zero group is finite cyclic and its degree-minus-one group is trivial. -/ theorem galoisGroupValueGroup_herbrandQuotientDefined - (g : Gal(L / K)) : + (g : Gal(L/K)) : letI := galoisGroupValueGroupMulDistribMulAction K L - HerbrandQuotientDefined (Gal(L / K)) (Multiplicative Int) g := by + HerbrandQuotientDefined (Gal(L/K)) (Multiplicative Int) g := by exact ⟨galoisGroupValueGroupHerbrandH0Finite K L, galoisGroupValueGroupHerbrandHMinusOneFinite K L g⟩ @@ -89,34 +89,34 @@ field-unit quotient is defined and 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) + (g : Gal(L/K)) + (hg : ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers g) (hU : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - HerbrandQuotientDefined (Gal(L / K)) + HerbrandQuotientDefined (Gal(L/K)) (ValuativeRel.valuation L).integerˣ g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupFieldUnitsMulDistribMulAction K L letI := galoisGroupValueGroupMulDistribMulAction K L - let hZ : HerbrandQuotientDefined (Gal(L / K)) (Multiplicative Int) g := + let hZ : HerbrandQuotientDefined (Gal(L/K)) (Multiplicative Int) g := galoisGroupValueGroup_herbrandQuotientDefined K L g - ∃ hField : HerbrandQuotientDefined (Gal(L / K)) Lˣ g, - @herbrandQuotient (Gal(L / K)) Lˣ _ _ _ + ∃ hField : HerbrandQuotientDefined (Gal(L/K)) Lˣ g, + @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ (galoisGroupFieldUnitsMulDistribMulAction K L) g hField.1 hField.2 = - @herbrandQuotient (Gal(L / K)) + @herbrandQuotient (Gal(L/K)) (ValuativeRel.valuation L).integerˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 * - @herbrandQuotient (Gal(L / K)) (Multiplicative Int) _ _ _ + @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ (galoisGroupValueGroupMulDistribMulAction K L) g hZ.1 hZ.2 := by let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L let := galoisGroupFieldUnitsMulDistribMulAction K L let := galoisGroupValueGroupMulDistribMulAction K L - let hZ : HerbrandQuotientDefined (Gal(L / K)) (Multiplicative Int) g := + 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)) + (G := Gal(L/K)) (A := (ValuativeRel.valuation L).integerˣ) (B := Lˣ) (C := Multiplicative Int) (integerUnitsToFieldUnits L) (valuationUnitsMulHom L) @@ -124,18 +124,18 @@ theorem valuationHerbrand_multiplicativity_of_integerUnits_defined g hg hU hZ refine ⟨hField, ?_⟩ let : Finite - (HerbrandH0 (Gal(L / K)) (ValuativeRel.valuation L).integerˣ) := hU.1 + (HerbrandH0 (Gal(L/K)) (ValuativeRel.valuation L).integerˣ) := hU.1 let : Finite - (HerbrandHMinusOne (Gal(L / K)) + (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)) Lˣ) := hField.1 + let : Finite (HerbrandHMinusOne (Gal(L/K)) Lˣ g) := hField.2 let : Finite - (HerbrandH0 (Gal(L / K)) (Multiplicative Int)) := hZ.1 + (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := hZ.1 let : Finite - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) g) := hZ.2 + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) g) := hZ.2 exact herbrandQuotient_multiplicative_of_shortExact - (G := Gal(L / K)) + (G := Gal(L/K)) (A := (ValuativeRel.valuation L).integerˣ) (B := Lˣ) (C := Multiplicative Int) (integerUnitsToFieldUnits L) (valuationUnitsMulHom L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean index 6a195fca0e..e90d6ba060 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean @@ -33,11 +33,11 @@ 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 + (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 + 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 @@ -47,13 +47,13 @@ theorem galoisGroupValueGroup_tateNorm_toAdd (a : Multiplicative Int) : module. -/ def galoisGroupValueGroupFixedToZModHom : letI := galoisGroupValueGroupMulDistribMulAction K L - fixedSubgroup (Gal(L / K)) (Multiplicative Int) →* - Multiplicative (ZMod (Fintype.card (Gal(L / K)))) := by + 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)))) + ZMod (Fintype.card (Gal(L/K)))) map_one' := by simp map_mul' := by intro x y @@ -66,12 +66,12 @@ theorem galoisGroupValueGroupFixedToZModHom_surjective : let := galoisGroupValueGroupMulDistribMulAction K L intro y rcases ZMod.intCast_surjective (Multiplicative.toAdd y) with ⟨z, hz⟩ - let x : fixedSubgroup (Gal(L / K)) (Multiplicative Int) := + 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] + ((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 @@ -79,8 +79,8 @@ 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 + (tateNormSubgroup (Gal(L/K)) (Multiplicative Int)).subgroupOf + (fixedSubgroup (Gal(L/K)) (Multiplicative Int)) := by let := galoisGroupValueGroupMulDistribMulAction K L ext x rw [MonoidHom.mem_ker] @@ -88,15 +88,15 @@ theorem galoisGroupValueGroupFixedToZModHom_ker : · intro hx have hx0 : ((Multiplicative.toAdd (x : Multiplicative Int) : Int) : - ZMod (Fintype.card (Gal(L / K)))) = 0 := by + 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) + tateNormSubgroup (Gal(L/K)) (Multiplicative Int) refine ⟨Multiplicative.ofAdd z, ?_⟩ have htoAdd : Multiplicative.toAdd - (tateNorm (Gal(L / K)) (Multiplicative Int) + (tateNorm (Gal(L/K)) (Multiplicative Int) (Multiplicative.ofAdd z)) = Multiplicative.toAdd (x : Multiplicative Int) := by rw [galoisGroupValueGroup_tateNorm_toAdd] @@ -104,13 +104,13 @@ theorem galoisGroupValueGroupFixedToZModHom_ker : exact congrArg Multiplicative.ofAdd htoAdd · intro hx change (x : Multiplicative Int) ∈ - tateNormSubgroup (Gal(L / K)) (Multiplicative Int) at hx + 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 + 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⟩) @@ -118,12 +118,12 @@ theorem galoisGroupValueGroupFixedToZModHom_ker : /-- 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 + 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 + (G := Gal(L/K)) (A := Multiplicative Int)).trans ((QuotientGroup.quotientMulEquivOfEq (galoisGroupValueGroupFixedToZModHom_ker K L).symm).trans (QuotientGroup.quotientKerEquivOfSurjective @@ -134,18 +134,18 @@ noncomputable def galoisGroupValueGroupHerbrandH0MulEquivZMod : description rather than assumed as an extra hypothesis. -/ theorem galoisGroupValueGroupHerbrandH0Finite : letI := galoisGroupValueGroupMulDistribMulAction K L - Finite (HerbrandH0 (Gal(L / K)) (Multiplicative Int)) := by + Finite (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) := by let := galoisGroupValueGroupMulDistribMulAction K L exact Finite.of_equiv - (Multiplicative (ZMod (Fintype.card (Gal(L / K))))) + (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 + 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 @@ -155,7 +155,7 @@ 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)) = + Nat.card (HerbrandH0 (Gal(L/K)) (Multiplicative Int)) = Module.finrank K L := by let := galoisGroupValueGroupMulDistribMulAction K L rw [galoisGroupValueGroup_herbrandH0_card K L] @@ -164,7 +164,7 @@ theorem galoisGroupValueGroup_herbrandH0_card_eq_finrank [IsGalois 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 + normKernelSubgroup (Gal(L/K)) (Multiplicative Int) = ⊥ := by let := galoisGroupValueGroupMulDistribMulAction K L apply le_antisymm · intro x hx @@ -172,7 +172,7 @@ theorem galoisGroupValueGroup_normKernelSubgroup_eq_bot : exact congrArg Multiplicative.ofAdd (by change Multiplicative.toAdd (x : Multiplicative Int) = 0 have hnorm : - (Fintype.card (Gal(L / K)) : Int) * + (Fintype.card (Gal(L/K)) : Int) * Multiplicative.toAdd (x : Multiplicative Int) = 0 := by rw [← galoisGroupValueGroup_tateNorm_toAdd K L] exact congrArg Multiplicative.toAdd hx @@ -183,17 +183,17 @@ theorem galoisGroupValueGroup_normKernelSubgroup_eq_bot : /-- Finiteness of value-group `H⁻¹`, derived from the vanishing of its norm kernel. -/ theorem galoisGroupValueGroupHerbrandHMinusOneFinite - (σ : Gal(L / K)) : + (σ : Gal(L/K)) : letI := galoisGroupValueGroupMulDistribMulAction K L Finite - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) σ) := by + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := by let := galoisGroupValueGroupMulDistribMulAction K L have : Subsingleton - (normKernelSubgroup (Gal(L / K)) (Multiplicative Int)) := by + (normKernelSubgroup (Gal(L/K)) (Multiplicative Int)) := by rw [galoisGroupValueGroup_normKernelSubgroup_eq_bot K L] infer_instance let : Subsingleton - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) σ) := + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := ⟨fun q => HerbrandHMinusOne.inductionOn σ (motive := fun q => ∀ r, q = r) q fun x r => @@ -202,24 +202,24 @@ theorem galoisGroupValueGroupHerbrandHMinusOneFinite congrArg (fun z => HerbrandHMinusOne.mk σ z) (Subsingleton.elim x y)⟩ exact Finite.of_injective - (fun _ : HerbrandHMinusOne (Gal(L / K)) + (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)) : + (σ : Gal(L/K)) : letI := galoisGroupValueGroupMulDistribMulAction K L letI := galoisGroupValueGroupHerbrandHMinusOneFinite K L σ Nat.card - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) σ) = 1 := by + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) = 1 := by let := galoisGroupValueGroupMulDistribMulAction K L have : Subsingleton - (normKernelSubgroup (Gal(L / K)) (Multiplicative Int)) := by + (normKernelSubgroup (Gal(L/K)) (Multiplicative Int)) := by rw [galoisGroupValueGroup_normKernelSubgroup_eq_bot K L] infer_instance let : Subsingleton - (HerbrandHMinusOne (Gal(L / K)) (Multiplicative Int) σ) := + (HerbrandHMinusOne (Gal(L/K)) (Multiplicative Int) σ) := ⟨fun q => HerbrandHMinusOne.inductionOn σ (motive := fun q => ∀ r, q = r) q fun x r => diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean index 0d23bf75eb..22db1aebfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -17,6 +17,23 @@ the norm subgroup is exactly the subgroup generated by `p` and the separate before being combined in the final theorem. -/ +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 @@ -40,7 +57,7 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_odd LocalFieldTheory.fieldPrincipalUnits ℚ_[p] (k + 1) ≤ localNormSubgroup ℚ_[p] L := by let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p let F := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + completeDVFOfWithZeroValuation v let eO : 𝒪[ℚ_[p]] ≃+* F.valuationSubring := integerRingEquivPadicDVRValuationSubring p let EU : 𝒪[ℚ_[p]]ˣ ≃* F.valuationSubringˣ := @@ -374,7 +391,7 @@ theorem padicDVR_higherPrincipalUnit_two_power (m : ℕ) : let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2 let F := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + completeDVFOfWithZeroValuation v ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2), ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, (r : F.valuationSubringˣ) ^ (2 ^ m) = @@ -382,7 +399,7 @@ theorem padicDVR_higherPrincipalUnit_two_power let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2 let F := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + completeDVFOfWithZeroValuation v change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2), ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2, @@ -438,7 +455,7 @@ theorem padicDVR_higherPrincipalUnit_two_power LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[2]) = - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation + expSeriesFieldOfWithZeroValuation v ((((Multiplicative.ofAdd b2) ^ (2 ^ m)).toAdd : F.valuationSubring) : ℚ_[2]) (fun q => @@ -448,7 +465,7 @@ theorem padicDVR_higherPrincipalUnit_two_power ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (m + 2)) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[2]) = - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation + expSeriesFieldOfWithZeroValuation v ((a.toAdd : F.valuationSubring) : ℚ_[2]) (fun q => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero q)) := by @@ -595,9 +612,9 @@ theorem padicDVR_U2_split (u : rw [map_sub, hxe, hefive] at hmapped exact hmapped have hq : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 + quotientUnitHom F 3 (u : F.valuationSubringˣ) = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom F 3 + quotientUnitHom F 3 ((padicDVRFive : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) := by @@ -609,7 +626,7 @@ theorem padicDVR_U2_split (u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 2) : F.valuationSubringˣ) : F.valuationSubring))).2 hdiff rw [← - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.quotientUnitHom_ker_eq F 3, + quotientUnitHom_ker_eq F 3, MonoidHom.mem_ker] rw [map_div, hq] exact div_self' _ @@ -632,7 +649,7 @@ theorem padicDVR_U2_square_class let : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩ let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 let F' := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation + completeDVFOfWithZeroValuation (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) have hroot : ∀ w : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 3, @@ -711,7 +728,7 @@ theorem fieldPrincipalUnits_le_normSubgroup_cyclotomic_two_succ IsCyclotomicExtension.finiteDimensional {n} ℚ_[2] L let F := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF 2 let F' := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation + completeDVFOfWithZeroValuation (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation 2) let eO : 𝒪[ℚ_[2]] ≃+* F.valuationSubring := integerRingEquivPadicDVRValuationSubring 2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean index ff61737f37..c5ccceb3b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean @@ -27,6 +27,19 @@ unramified extension of degree `f`; the result below expresses its norm subgroup in the spectral-norm presentation used by local class field theory. -/ +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 @@ -78,7 +91,6 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - let : (ValuativeRel.valuation ℚ_[p]).HasExtension (ValuativeRel.valuation L) := by apply Valuation.HasExtension.ofComapInteger @@ -91,7 +103,6 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one 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 @@ -122,7 +133,6 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one 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 @@ -165,19 +175,17 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one 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 := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + 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 @@ -185,12 +193,12 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one let : IsIntegralClosure target.valuationSubring base.valuationSubring L := hTarget let : base.valuation.HasExtension vL.valuationSubring.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + 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 := - ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + target_valuationSubring_eq_of_finite_separable (base := base) (target := target) vL.valuationSubring let eBase : 𝒪[ℚ_[p]] ≃+* base.valuationSubring := integerRingEquivPadicDVRValuationSubring p diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean index 81c2d9ac6c..9e85b0e825 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean @@ -44,7 +44,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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 @@ -58,7 +57,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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 @@ -72,7 +70,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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 @@ -102,7 +99,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - let : IsScalarTower K K1 (SeparableClosure K) := by apply IsScalarTower.of_algebraMap_eq intro x @@ -127,7 +123,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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⟩ @@ -142,7 +137,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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 := @@ -165,7 +159,6 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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) @@ -181,13 +174,11 @@ theorem exists_finiteGalois_normSubgroup_le_powMonoidHom_range 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean index 31ed6f999c..b53bdc0aea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean @@ -71,7 +71,7 @@ theorem abstractFixedField_isGalois_of_base_normal (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)) + let B := baseField (Gal(SeparableClosure K/K)) have hsub : extensionSubgroup B H (le_baseField H) = H.toSubgroup.subgroupOf B.toSubgroup := by @@ -82,7 +82,7 @@ theorem abstractFixedField_isGalois_of_base_normal rw [← hsub] exact hnormal have hconj : - ∀ h g : Gal(SeparableClosure K / K), + ∀ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index 7289bd66e1..6caa9ecb66 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -460,7 +460,7 @@ abbrev lubinTateUniformizerDiagonalCompositumField let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σ : Gal(T / K) := + let σ : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -482,7 +482,7 @@ theorem lubinTateUniformizerDiagonalCompositumField_finiteDimensional let T := standardLubinTateLevelField hπ n let : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σ : Gal(T / K) := + let σ : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -508,7 +508,7 @@ theorem lubinTateUniformizerDiagonalCompositumField_isGalois let T := standardLubinTateLevelField hπ n let : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σ : Gal(T / K) := + let σ : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -532,7 +532,7 @@ private theorem explicitRestrictNormalHom_toAlgAut_eq_one (B : IntermediateField K C) [Normal K B] (δ : Gal(C/B)) : AlgEquiv.restrictNormalHom B - (MulSemiringAction.toAlgAut Gal(C / B) K C δ) = + (MulSemiringAction.toAlgAut Gal(C/B) K C δ) = 1 := by apply AlgEquiv.ext intro x @@ -558,7 +558,7 @@ private theorem explicit_mem_fixingSubgroup_of_restrictNormalHom_eq_one rw [IntermediateField.mem_fixingSubgroup_iff] intro x hx let y : A := ⟨x, hx⟩ - have hy := congrArg (fun τ : Gal(A / K) => τ y) hσ + 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 @@ -607,7 +607,7 @@ 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 : ℕ) + (σ : 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) @@ -639,19 +639,19 @@ private theorem exists_explicitAlgEquiv_with_disjoint_restrictions [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), + ∃ σ : 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) := + 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 δ + 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δ @@ -672,7 +672,7 @@ private theorem exists_lubinTateUniformizerDiagonalAutomorphism let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -691,15 +691,15 @@ private theorem exists_lubinTateUniformizerDiagonalAutomorphism 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), + 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) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -732,8 +732,8 @@ private theorem exists_lubinTateUniformizerDiagonalAutomorphism 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 + 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 @@ -757,7 +757,7 @@ noncomputable def lubinTateUniformizerDiagonalAutomorphism (hπ : (standardLocalField K).toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : - Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u) / K) := + Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u)/K) := Classical.choose (exists_lubinTateUniformizerDiagonalAutomorphism K hπ n u) @@ -773,7 +773,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_restrict_unramified let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -786,7 +786,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_restrict_unramified 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) := + let φA : Gal(A/K) := (eU.symm.trans (arithmeticFrobeniusOfUnramifiedValuation K U)).trans eU AlgEquiv.restrictNormalHom A @@ -807,7 +807,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_restrict_level let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -820,7 +820,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_restrict_level 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 + let σB : Gal(B/K) := (eT.symm.trans σT).trans eT AlgEquiv.restrictNormalHom B (lubinTateUniformizerDiagonalAutomorphism K hπ n u) = σB := @@ -840,7 +840,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -853,7 +853,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique 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) := + let φA : Gal(A/K) := (eU.symm.trans (arithmeticFrobeniusOfUnramifiedValuation K U)).trans eU AlgEquiv.restrictNormalHom A σ = φA) @@ -861,7 +861,7 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -874,13 +874,13 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique 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 + 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) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -897,10 +897,10 @@ theorem lubinTateUniformizerDiagonalAutomorphism_unique 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) := + 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 σ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 @@ -937,7 +937,7 @@ private theorem lubinTateUniformizerDiagonalAutomorphism_order let T := standardLubinTateLevelField hπ n letI : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -947,7 +947,7 @@ private theorem lubinTateUniformizerDiagonalAutomorphism_order let T := standardLubinTateLevelField hπ n let : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass @@ -970,16 +970,16 @@ private theorem lubinTateUniformizerDiagonalAutomorphism_order 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 σ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) := + 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) := + let transportT : Gal(T/K) ≃* Gal(B/K) := { AlgEquiv.equivCongr eT eT with map_mul' := by intro g h @@ -1040,7 +1040,7 @@ theorem lubinTateUniformizerDiagonalFixedField_finrank let T := standardLubinTateLevelField hπ n let : FiniteDimensional K T := standardLubinTateLevelField_finiteDimensional hπ n - let σT : Gal(T / K) := + let σT : Gal(T/K) := (standardLubinTateUnitParameterEquivGal (standardLocalField K) hπ n (standardLubinTateUnitParameterClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean index 8bcdf22259..00adf3aacc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean @@ -98,7 +98,7 @@ theorem powMonoidHom_range_le_maximalKummerNormSubgroup 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 + ∀ a : Abelianization (Gal(E/K)), a ^ (n : ℕ) = 1 := by intro a apply (Abelianization.equivOfComm : Gal(E/K) ≃* Abelianization (Gal(E/K))).symm.injective diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean index 4bbe102a2a..c8dec5b2cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean @@ -97,7 +97,7 @@ theorem finiteAbelianSubextension_fixedField_isAbelianGalois (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 : L.extensionQuotient ≃* Gal(E/K) := by let e₀ := baseFixingExtensionQuotientEquivGaloisGroup K (SeparableClosure K) E have hclosed : closedFixingSubgroup K (SeparableClosure K) E = @@ -361,14 +361,14 @@ theorem finiteAbelianNormSubgroup_finiteIndex let : IsGalois K E := abstractFixedField_isGalois_of_base_normal K L.field (finiteAbelianSubextension_normal_over_absoluteBase K L) - let : Finite (Gal(E / K)) := by + 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))) := + 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))) + Finite.of_equiv (Abelianization (Gal(E/K))) (abelianizationEquivNormQuotient K E).toEquiv let : Finite (Kˣ ⧸ localNormSubgroup K E) := by change Finite (NormQuotient K E) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean index 73f8864cdf..72fe41ed3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean @@ -53,7 +53,7 @@ def finiteAbelianAbstractExtensionOfEmbedding simp only [map_mul] exact (inferInstance : - IsMulCommutative (Gal(L / K))).is_comm.comm (e x) (e y) } + 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 @@ -135,15 +135,15 @@ theorem exists_uniformizerPrincipalSubgroup_le_normSubgroup ∃ d n : ℕ, 0 < d ∧ 1 ≤ n ∧ LocalFieldTheory.uniformizerPrincipalSubgroup K ϖ d n ≤ localNormSubgroup K L := by - let : Finite (Gal(L / K)) := 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))) := + 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))) + (Abelianization (Gal(L/K))) (abelianizationEquivNormQuotient K L).toEquiv let : Finite (Kˣ ⧸ localNormSubgroup K L) := by change Finite (NormQuotient K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean index 9ddd385493..df0483ac6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean @@ -115,7 +115,7 @@ abbrev standardLubinTateDiagonalAutomorphism (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : - Gal((standardLubinTateDiagonalCompositumField K n u) / K) := + Gal((standardLubinTateDiagonalCompositumField K n u)/K) := lubinTateUniformizerDiagonalAutomorphism K (standardLocalFieldUniformizer_isUniformizer K) n u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean index aad5218a6e..a7510bda20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean @@ -63,7 +63,7 @@ private theorem valuationAt_baseField_coe v.toAddMonoidHom x := by have hdivided := v.residueDegree_nsmul_dividedAt (FiniteAbstractField.base G) x - simp at hdivided + simp? at hdivided change v.dividedAt (FiniteAbstractField.base G) x = v.toAddMonoidHom x rw [hdivided] let : Finite ((baseField G).toSubgroup ⧸ @@ -106,7 +106,6 @@ theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup change FiniteGaloisSubextension K₀ at h exact h dsimp only - let hUfinite : Finite (K₀.toSubgroup ⧸ extensionSubgroup K₀ U.field U.below) := U.finite @@ -126,12 +125,10 @@ theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup 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 @@ -144,7 +141,6 @@ theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup 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₀ ≃+ @@ -153,7 +149,6 @@ theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup (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 : @@ -186,7 +181,6 @@ theorem finiteUnramifiedNormSubgroup_map_le_unramifiedNormSubgroup ((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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean index 827de7bb87..d47a90c9c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean @@ -33,7 +33,7 @@ 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)) := +abbrev galoisAmbientUnitsRep : Rep ℤ (Gal(Ω/K)) := Rep.ofAlgebraAutOnUnits K Ω /-- Inclusion of the units of an intermediate field into the units of the @@ -91,10 +91,10 @@ theorem mem_galoisAmbientUnits_fixed_iff simpa only [closedFixingSubgroup] using σ.2 have hρ : (Rep.ofAlgebraAutOnUnits K Ω).ρ - (σ : Gal(Ω / K)) x = + (σ : Gal(Ω/K)) x = Additive.ofMul (Units.mapEquiv - (σ : Gal(Ω / K)).toMulEquiv (Additive.toMul x)) := + (σ : Gal(Ω/K)).toMulEquiv (Additive.toMul x)) := rfl rw [hρ] apply Additive.ext diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean index b50920174d..012e12e0c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -65,9 +65,9 @@ theorem relativeNorm_coe_eq_of_closedSubgroup_eq 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))) + (H : ClosedSubgroup (Gal(Ω/K))) [Finite ((baseField (Gal(Ω/K))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / K))) H (le_baseField H))] + extensionSubgroup (baseField (Gal(Ω/K))) H (le_baseField H))] [FiniteDimensional K (abstractFixedField K Ω H)] [Algebra.IsSeparable K (abstractFixedField K Ω H)] (x : (abstractFixedField K Ω H)ˣ) : @@ -90,7 +90,7 @@ theorem normToBase_abstractFixedFieldUnit_val_of_isSeparable have htransport := relativeNorm_coe_eq_of_closedSubgroup_eq (galoisAmbientUnitsRep K Ω) (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) - (baseField (Gal(Ω / K))) + (baseField (Gal(Ω/K))) (closedFixingSubgroup K Ω E) H (fixingSubgroupLeBase K Ω E) (le_baseField H) (closedFixingSubgroup_bot_eq_baseField K Ω) @@ -109,9 +109,9 @@ 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H + extensionSubgroup (baseField (Gal(SeparableClosure K/K))) H (le_baseField H))] [FiniteDimensional K (abstractFixedField K (SeparableClosure K) H)] @@ -174,9 +174,9 @@ 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(SeparableClosure K / K))) H + extensionSubgroup (baseField (Gal(SeparableClosure K/K))) H (le_baseField H))] [FiniteDimensional K (abstractFixedField K (SeparableClosure K) H)] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean index f00e1882e2..721fe95af9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean @@ -162,7 +162,7 @@ theorem abstractExtensionQuotientEquivGaloisGroup_mk_apply_val let := hnormal let : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal - let H : ClosedSubgroup (Gal(Ω / abstractFixedField k Ω K)) := + let H : ClosedSubgroup (Gal(Ω/abstractFixedField k Ω K)) := closedFixingSubgroup (abstractFixedField k Ω K) Ω (abstractRelativeFixedField k Ω hLK) let : H.toSubgroup.Normal := @@ -184,8 +184,8 @@ theorem abstractExtensionQuotientEquivGaloisGroup_mk_apply_val (closedFixingSubgroup (abstractFixedField k Ω K) Ω (abstractRelativeFixedField k Ω hLK)) ((abstractSubgroupEquivGaloisGroup k Ω K σ : - Gal(Ω / abstractFixedField k Ω K)) : - Gal(Ω / abstractFixedField k Ω K) ⧸ + Gal(Ω/abstractFixedField k Ω K)) : + Gal(Ω/abstractFixedField k Ω K) ⧸ (abstractRelativeFixedField k Ω hLK).fixingSubgroup))) x : abstractRelativeFixedField k Ω hLK) : Ω) rw [InfiniteGalois.normalAutEquivQuotient_apply, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index dfa3adb750..a4716d70da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -327,7 +327,8 @@ private theorem normResidueSymbol_congr subst hFinite' have ha : hAbsolute = hAbsolute' := Subsingleton.elim _ _ subst hAbsolute' - simp [extensionQuotientCongr, finiteNormQuotientCongr] + simp only [extensionQuotientCongr, abelianizationCongr_refl, AddEquiv.toAddMonoidHom_eq_coe, + finiteNormQuotientCongr, AddEquiv.coe_addMonoidHom_refl, AddMonoidHom.comp_id] apply AddMonoidHom.ext intro x rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index 26e571b1a7..9f5afa677f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -74,7 +74,7 @@ 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 (Abelianization Gal(L/K)) ≃+ Additive (NormQuotient K L) := (MulEquiv.toAdditive ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L @@ -90,17 +90,17 @@ 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)) ≃+ + 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))) ≃* + let em : Multiplicative (Additive (Abelianization Gal(L/K))) ≃* Multiplicative (Additive (NormQuotient K L)) := @AddEquiv.toMultiplicative - (Additive (Abelianization Gal(L / K))) + (Additive (Abelianization Gal(L/K))) (Additive (NormQuotient K L)) inferInstance inferInstance e exact (MulEquiv.multiplicativeAdditive - (Abelianization Gal(L / K))).symm.trans + (Abelianization Gal(L/K))).symm.trans (em.trans (MulEquiv.multiplicativeAdditive (NormQuotient K L))) @@ -110,7 +110,7 @@ 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) := + Kˣ →* Abelianization Gal(L/K) := (concreteReciprocityEquivOfEmbedding K L i D v hcf).symm.toMonoidHom.comp (normClass K L) @@ -120,7 +120,7 @@ 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 (Abelianization Gal(L/K)) ≃+ Additive (NormQuotient K L) := concreteReciprocityAddEquivOfEmbedding K L (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf @@ -130,7 +130,7 @@ 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 := + Abelianization Gal(L/K) ≃* NormQuotient K L := concreteReciprocityEquivOfEmbedding K L (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf @@ -139,7 +139,7 @@ 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) := + Kˣ →* Abelianization Gal(L/K) := concreteNormResidueSymbolOfEmbedding K L (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) D v hcf diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean index e37543e64d..483faaf790 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -29,7 +29,7 @@ variable (K L : Type) [Field K] [Field L] [Algebra K L] 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)) := + 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) @@ -39,7 +39,7 @@ 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 + MulEquiv.refl (Abelianization (Gal(L/K))) := by apply MulEquiv.ext intro z change @@ -100,12 +100,12 @@ end LocalAlgebraic 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))) := + 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)) := + let e : TopologicalAbelianization (Gal(L/K)) ≃* + TopologicalAbelianization (Gal(L/K)) := (topologicalAbelianizationFiniteEquiv K L).symm.trans ((abelianizedGaloisConjugationOfEmbeddings K L i j).trans (topologicalAbelianizationFiniteEquiv K L)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean index a4e257a71f..371d05ae7e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean @@ -249,7 +249,7 @@ private theorem baseFixingExtensionSubgroup_index_eq_finrank (⊥ : IntermediateField K Ω)) (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) := - Finite.of_equiv (Gal(E / K)) + Finite.of_equiv (Gal(E/K)) (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).symm.toEquiv calc _ = Nat.card @@ -261,7 +261,7 @@ private theorem baseFixingExtensionSubgroup_index_eq_finrank (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) := Subgroup.index_eq_card _ - _ = Nat.card (Gal(E / K)) := + _ = Nat.card (Gal(E/K)) := Nat.card_congr (baseFixingExtensionQuotientEquivGaloisGroup K Ω E).toEquiv _ = Module.finrank K E := @@ -327,7 +327,7 @@ theorem finiteAbstractField_degree_eq_abstractFixedField_finrank calc (H.toFiniteAbstractExtension.degree : ℕ) = (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H.field + (baseField (Gal(SeparableClosure K/K))) H.field (le_baseField H.field)).index := H.toFiniteAbstractExtension.extensionSubgroup_index_eq_degree.symm _ = H.field.toSubgroup.index := by @@ -388,7 +388,6 @@ theorem abstractFixedField_isUnramifiedValuedExtension 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 := @@ -407,7 +406,6 @@ theorem abstractFixedField_isUnramifiedValuedExtension localCompleteDVF_integerRing_isIntegralClosure K E let : Module.Finite 𝒪[K] 𝒪[E] := localCompleteDVF_integerRing_moduleFinite K E - let f : ℕ := @Module.finrank 𝓀[K] 𝓀[E] _ _ (IsLocalRing.ResidueField.instModule @@ -429,7 +427,6 @@ theorem abstractFixedField_isUnramifiedValuedExtension _ = Module.finrank K E := finiteAbstractField_degree_eq_abstractFixedField_finrank K H hnormal - have hdegree' : (𝓂[E] : Ideal 𝒪[E]).ramificationIdx 𝒪[K] * f = @@ -478,7 +475,6 @@ theorem localUpperRamificationGroup_abstractFixedField_eq_bot 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 := @@ -639,7 +635,6 @@ theorem (localFiniteUnramifiedAbelianSubextension K d hd).field) exact finiteAbelianSubextension_fixedField_isAbelianGalois K (localFiniteUnramifiedAbelianSubextension K d hd) - let : NontriviallyNormedField K := localFieldNontriviallyNormedField K let : IsUltrametricDist K := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean index a22abb03e4..be471ed8bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean @@ -30,7 +30,7 @@ def artinPrincipalUnitGroup [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [FiniteDimensional K L] [IsAbelianGalois K L] - (n : ℕ) : Subgroup (Gal(L / K)) := + (n : ℕ) : Subgroup (Gal(L/K)) := (LocalFieldTheory.fieldPrincipalUnits K n).map (abelianLocalArtinMonoidHom K L) /-- The Artin images of principal units form an antitone filtration. -/ @@ -108,7 +108,7 @@ def artinPrincipalUnitStepGroup [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] [FiniteDimensional K L] [IsAbelianGalois K L] - (t : ℝ) : Subgroup (Gal(L / K)) := + (t : ℝ) : Subgroup (Gal(L/K)) := natCeilStepFiltration (artinPrincipalUnitGroup K L) t /-- Restriction along a tower carries the real-indexed Artin principal-unit diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean index e7f0770068..de5eea3447 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean @@ -95,7 +95,7 @@ theorem equalCharacteristic_filteredLocalReciprocity (localUpperRamificationGroup K E) (localUpperRamificationGroup K F) hupper hcover t ht - let q : Gal(E / K) ≃* Gal(L / K) := + let q : Gal(E/K) ≃* Gal(L/K) := AlgEquiv.autCongr e.symm have hArtin : Subgroup.map q.toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean index a3294a9180..bfd30c9130 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean @@ -23,6 +23,19 @@ closure permits descent by restriction, and the resulting algebra equivalence transports both filtrations back to the original extension. -/ +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 @@ -93,7 +106,7 @@ theorem finiteAbelian_filteredLocalReciprocity (localUpperRamificationGroup K E) (localUpperRamificationGroup K F) hupper hcover t ht - let q : Gal(E / K) ≃* Gal(L / K) := + let q : Gal(E/K) ≃* Gal(L/K) := AlgEquiv.autCongr e.symm have hArtin : Subgroup.map q.toMonoidHom @@ -145,7 +158,7 @@ theorem finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationG (RamificationTheory.HilbertRamification.Higher.lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq)) 1 ≤ 1 exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_one_pos_le_one _ + herbrandFunction_one_pos_le_one _ have hStep (t : ℝ) (ht0 : 0 < t) (ht1 : t ≤ 1) : localUpperRamificationGroup K L t = artinPrincipalUnitGroup K L 1 := by @@ -170,7 +183,7 @@ theorem finiteAbelian_localUpperRamificationGroup_one_eq_localLowerRamificationG RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup (base := base) (target := target) huniq 1 exact - RamificationTheory.HilbertRamification.Higher.upperRamificationGroupOfUniqueExtension_herbrandFunction + upperRamificationGroupOfUniqueExtension_herbrandFunction (base := base) (target := target) huniq 1 calc localUpperRamificationGroup K L 1 = artinPrincipalUnitGroup K L 1 := @@ -246,7 +259,7 @@ theorem localConductorExponent_le_one_iff_residueChar_not_dvd_ramificationIndex let A := (chosenLocalExtensionCompleteDVF K L).valuation.valuationSubring rw [localConductorExponent_le_one_iff_hilbertRamificationGroup_eq_bot] exact - (RamificationTheory.HilbertRamification.ValuationSubring.ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card + (ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card K A p).trans (by rw [RamificationTheory.LocalField.chosenLocalExtension_inertia_card_eq_ramificationIndex K L]) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean index 426ebda78b..746d8d4f74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean @@ -75,16 +75,16 @@ theorem localIntermediateField_isUnramified_of_inertia_le letI : Module.Finite 𝒪[K] 𝒪[E] := localCompleteDVF_integerRing_moduleFinite K E IsUnramifiedValuedExtension K E := by - let H : FiniteAbstractField (Gal(SeparableClosure K / K)) := + 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))) + (baseField (Gal(SeparableClosure K/K))) (closedFixingSubgroup K (SeparableClosure K) E) (le_baseField _)).index ≠ 0 have hindex : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) + (baseField (Gal(SeparableClosure K/K))) (closedFixingSubgroup K (SeparableClosure K) E) (le_baseField _)).index = E.fixingSubgroup.index := by symm @@ -95,15 +95,15 @@ theorem localIntermediateField_isUnramified_of_inertia_le exact (Module.finrank_pos (R := K) (M := E)).ne' } have hnormal : (extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H.field + (baseField (Gal(SeparableClosure K/K))) H.field (le_baseField H.field)).Normal := by change (E.fixingSubgroup.subgroupOf - (⊤ : Subgroup (Gal(SeparableClosure K / K)))).Normal + (⊤ : Subgroup (Gal(SeparableClosure K/K)))).Normal infer_instance have hunramified : H.toFiniteAbstractExtension.IsUnramified (localResidueDatum K) := by change - (baseField (Gal(SeparableClosure K / K))).toSubgroup ⊓ + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean index addafa99bd..cbf1182054 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean @@ -36,7 +36,7 @@ theorem finiteAbelianUnramifiedCompositum_pow_eq_one [FiniteDimensional K E] [IsAbelianGalois K E] (d : ℕ) (hd : 0 < d) (hcard : Nat.card (E ≃ₐ[K] E) ∣ d) : - ∀ σ : Gal(↑(E ⊔ localFiniteUnramifiedField K d hd) / K), + ∀ σ : Gal(↑(E ⊔ localFiniteUnramifiedField K d hd)/K), σ ^ d = 1 := by let U := localFiniteUnramifiedField K d hd let F := E ⊔ U diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean index a0bbe217b4..11d97bea45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -48,29 +48,29 @@ 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))) + (H : ClosedSubgroup (Gal(Ω/k))) (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) H (le_baseField H))) : - Finite (Gal(Ω / k) ⧸ H.toSubgroup) := by + 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 + 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)) + (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))) + (H : ClosedSubgroup (Gal(Ω/k))) (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) H (le_baseField H))) : + extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H))) : IsOpen H.carrier := by - let : Finite (Gal(Ω / k) ⧸ H.toSubgroup) := + let : Finite (Gal(Ω/k) ⧸ H.toSubgroup) := ambientQuotientFiniteOfAbstractFinite k Ω H hfinite let : Subgroup.FiniteIndex H.toSubgroup := H.toSubgroup.finiteIndex_of_finite_quotient @@ -79,9 +79,9 @@ theorem abstractFiniteClosedSubgroup_isOpen /-- 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))) + (H : ClosedSubgroup (Gal(Ω/k))) (hfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) H (le_baseField H))) : + extensionSubgroup (baseField (Gal(Ω/k))) H (le_baseField H))) : FiniteDimensional k (abstractFixedField k Ω H) := by apply (InfiniteGalois.isOpen_iff_finite (K := Ω) (abstractFixedField k Ω H)).1 @@ -100,7 +100,7 @@ theorem abstractFixedField_le {K L : ClosedSubgroup (Gal(Ω/k))} absolute Galois group of the ambient extension over that fixed field. -/ def abstractSubgroupEquivGaloisGroup (H : ClosedSubgroup (Gal(Ω/k))) : - H.toSubgroup ≃* Gal(Ω / abstractFixedField k Ω H) := + H.toSubgroup ≃* Gal(Ω/abstractFixedField k Ω H) := (MulEquiv.subgroupCongr (InfiniteGalois.fixingSubgroup_fixedField H).symm).trans (IntermediateField.fixingSubgroupEquiv (abstractFixedField k Ω H)) @@ -133,7 +133,7 @@ theorem map_extensionSubgroup_abstractSubgroupEquiv · rintro ⟨σ, hσ, rfl⟩ rw [IntermediateField.mem_fixingSubgroup_iff] intro x hx - have hσL : (σ.1 : Gal(Ω / k)) ∈ L := + 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 @@ -147,7 +147,7 @@ theorem map_extensionSubgroup_abstractSubgroupEquiv (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)) ∈ + have hσfix : (σ.1 : Gal(Ω/k)) ∈ (abstractFixedField k Ω L).fixingSubgroup := by rw [IntermediateField.mem_fixingSubgroup_iff] intro x hx @@ -198,7 +198,7 @@ def abstractRelativeToAmbientQuotient (hnormal : (extensionSubgroup K L hLK).Normal) : letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal K.toSubgroup →* - Gal(Ω / abstractFixedField k Ω K) ⧸ + Gal(Ω/abstractFixedField k Ω K) ⧸ (abstractRelativeFixedField k Ω hLK).fixingSubgroup := by letI : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal @@ -262,7 +262,7 @@ def abstractExtensionQuotientEquivAmbient letI := hnormal letI := abstractRelativeFixingSubgroup_normal k Ω K L hLK hnormal K.toSubgroup ⧸ extensionSubgroup K L hLK ≃* - Gal(Ω / abstractFixedField k Ω K) ⧸ + Gal(Ω/abstractFixedField k Ω K) ⧸ (abstractRelativeFixedField k Ω hLK).fixingSubgroup := by letI := hnormal letI : (abstractRelativeFixedField k Ω hLK).fixingSubgroup.Normal := @@ -283,11 +283,11 @@ def abstractExtensionQuotientEquivGaloisGroup (hnormal : (extensionSubgroup K L hLK).Normal) : letI := hnormal K.toSubgroup ⧸ extensionSubgroup K L hLK ≃* - Gal(abstractRelativeFixedField k Ω hLK / abstractFixedField k Ω K) := by + 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)) := + let H : ClosedSubgroup (Gal(Ω/abstractFixedField k Ω K)) := closedFixingSubgroup (abstractFixedField k Ω K) Ω (abstractRelativeFixedField k Ω hLK) letI : H.toSubgroup.Normal := by @@ -303,10 +303,10 @@ def abstractExtensionQuotientEquivGaloisGroup /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))) + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : letI : Algebra (abstractFixedField k Ω K) (abstractFixedField k Ω L) := @@ -320,13 +320,13 @@ theorem abstractFixedField_relativeFiniteDimensional 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)) := + 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)) := + 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 @@ -336,10 +336,10 @@ theorem abstractFixedField_relativeFiniteDimensional /-- 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))) + (K L : ClosedSubgroup (Gal(Ω/k))) (hLK : L.toSubgroup ≤ K.toSubgroup) (hKfinite : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K (le_baseField K))) + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))) (hLKfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K L hLK)) : FiniteDimensional (abstractFixedField k Ω K) @@ -392,7 +392,7 @@ theorem finiteAbstractExtension_degree_eq_finrank _ = 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 (Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := Nat.card_congr (abstractExtensionQuotientEquivGaloisGroup k Ω K L hLK hnormal).toEquiv diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean index f24316c8c9..5b2850ab91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean @@ -58,7 +58,7 @@ theorem finiteExtensionUnits_tate_card_of_generator [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) : + (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 @@ -70,7 +70,6 @@ theorem finiteExtensionUnits_tate_card_of_generator 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 @@ -97,7 +96,6 @@ theorem finiteExtensionUnits_tate_card_of_generator { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - let : (ValuativeRel.valuation K).HasExtension (ValuativeRel.valuation L) := by apply Valuation.HasExtension.ofComapInteger @@ -109,7 +107,6 @@ theorem finiteExtensionUnits_tate_card_of_generator 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 @@ -168,7 +165,6 @@ theorem finiteExtensionUnits_tate_card_of_generator 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 @@ -186,7 +182,7 @@ theorem finiteTowerUnits_tate_card_of_generator [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) : + (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 @@ -198,7 +194,6 @@ theorem finiteTowerUnits_tate_card_of_generator 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 @@ -225,7 +220,6 @@ theorem finiteTowerUnits_tate_card_of_generator { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - exact finiteExtensionUnits_tate_card_of_generator K L g hg end diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean index a377b88c01..dc8de12cda 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean @@ -63,7 +63,7 @@ noncomputable instance finiteGaloisFieldRangeOfEmbedding_finiteDimensional `L/K` in the separable closure. -/ def finiteGaloisClosedFixingSubgroupOfEmbedding (i : L →ₐ[K] SeparableClosure K) : - ClosedSubgroup (Gal(SeparableClosure K / K)) := + ClosedSubgroup (Gal(SeparableClosure K/K)) := closedFixingSubgroup K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i) @@ -119,7 +119,7 @@ def finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) (fixingSubgroupLeBase K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i))) ≃* - Gal(L / K) := + Gal(L/K) := (baseFixingExtensionQuotientEquivGaloisGroup K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i)).trans (AlgEquiv.autCongr @@ -145,7 +145,7 @@ theorem finiteGaloisExtensionSubgroupOfEmbedding_index_eq_finrank (finiteGaloisClosedFixingSubgroupOfEmbedding K L i) (fixingSubgroupLeBase K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i))) := - Finite.of_equiv (Gal(L / K)) + Finite.of_equiv (Gal(L/K)) (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).symm.toEquiv calc _ = Nat.card @@ -158,7 +158,7 @@ theorem finiteGaloisExtensionSubgroupOfEmbedding_index_eq_finrank (fixingSubgroupLeBase K (SeparableClosure K) (finiteGaloisFieldRangeOfEmbedding K L i))) := Subgroup.index_eq_card _ - _ = Nat.card (Gal(L / K)) := + _ = Nat.card (Gal(L/K)) := Nat.card_congr (finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i).toEquiv _ = Module.finrank K L := IsGalois.card_aut_eq_finrank K L @@ -191,7 +191,7 @@ instance finiteGaloisFieldRange_finiteDimensional : /-- The concrete closed subgroup of the absolute separable Galois group attached to `L/K`. -/ def finiteGaloisClosedFixingSubgroup : - ClosedSubgroup (Gal(SeparableClosure K / K)) := + ClosedSubgroup (Gal(SeparableClosure K/K)) := finiteGaloisClosedFixingSubgroupOfEmbedding K L (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) @@ -245,7 +245,7 @@ def finiteGaloisAbstractQuotientEquivGaloisGroup : (finiteGaloisClosedFixingSubgroup K L) (fixingSubgroupLeBase K (SeparableClosure K) (finiteGaloisFieldRange K L))) ≃* - Gal(L / K) := + Gal(L/K) := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L (AlgebraicNumberTheory.separableEmbeddingIntoSeparableClosure K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean index e92f431966..722e060995 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -10,6 +10,15 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLoca import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing /-! # Finite Residue Finrank Transfer -/ + +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 @@ -163,10 +172,9 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank exact IsLocalRing.ResidueField.instModule change (H.residueDegree (localResidueDatum K) : ℕ) = Module.finrank kK kE - have hExtC : (localCompleteDVF K).valuation.HasExtension C.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change ValuativeRel.valuation E (algebraMap K E x) ≤ 1 ↔ (localCompleteDVF K).valuation x ≤ 1 @@ -176,10 +184,10 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank let : (localCompleteDVF K).valuation.HasExtension C.valuation := hExtC have hVC : V.valuation.HasExtension C.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x simpa only [V, ValuationSubring.valuationSubring_valuation] using - (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_pullback_of_hasExtension_valuation + (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 @@ -188,7 +196,6 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank (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' := @@ -197,7 +204,6 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank 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 @@ -224,7 +230,6 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank (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 := @@ -233,7 +238,6 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank 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 @@ -245,7 +249,6 @@ theorem localResidueDatum_residueDegree_eq_residueFinrank · 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index 023ad03b3d..7f34a1b222 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -91,7 +91,7 @@ theorem localAbstractFixedDecompositionGroup_eq_top let A := localSeparableValuationSubring K apply top_unique intro tau _htau - let sigma : Gal(SeparableClosure K / K) := tau.restrictScalars K + 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] @@ -259,16 +259,16 @@ 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H + (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 G := Gal(SeparableClosure K/K) let A := localSeparableValuationSubring K let k := decompositionResidueField K A let Omega := selectedResidueField A @@ -303,11 +303,11 @@ theorem localAbstractFixedResidueIntermediateField_finiteDimensional /-- 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))) + (H : ClosedSubgroup (Gal(SeparableClosure K/K))) [Finite ((baseField (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) H + (baseField (Gal(SeparableClosure K/K))) H (le_baseField H))] : FiniteGaloisIntermediateField (decompositionResidueField K (localSeparableValuationSubring K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index a156599431..d4f1bf9469 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -51,12 +51,11 @@ noncomputable def abstractFixedFieldNormResidueMonoidHom (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : (abstractFixedField k Ω K)ˣ →* Abelianization - Gal(abstractRelativeFixedField k Ω hLK / - abstractFixedField k Ω K) := + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := MonoidHom.toAdditive.symm (abstractFixedFieldNormResidueSymbol k Ω D v hcf K L hLK) @@ -89,11 +88,9 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMonoidHom [hLnormal : (extensionSubgroup K L hLK).Normal] [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : Abelianization - Gal(abstractRelativeFixedField k Ω hL'K' / - abstractFixedField k Ω K') →* + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K') →* Abelianization - Gal(abstractRelativeFixedField k Ω hLK / - abstractFixedField k Ω K) := + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := MonoidHom.toAdditive.symm (abstractFixedFieldAbelianizedRestriction k Ω K K' L L' hLK hL'K' hK'K hL'L) @@ -117,11 +114,9 @@ noncomputable def abstractFixedFieldAbelianizedTransferMonoidHom (hLK'.trans hK'K) hK'K hLK' Abelianization Gal(abstractRelativeFixedField k Ω - (hLK'.trans hK'K) / - abstractFixedField k Ω K) →* + (hLK'.trans hK'K)/abstractFixedField k Ω K) →* Abelianization - Gal(abstractRelativeFixedField k Ω hLK' / - abstractFixedField k Ω K') := + Gal(abstractRelativeFixedField k Ω hLK'/abstractFixedField k Ω K') := MonoidHom.toAdditive.symm (abstractFixedFieldAbelianizedTransfer k Ω K K' L hLK' hK'K) @@ -138,7 +133,7 @@ theorem abstractFixedFieldUnitsEquiv_finiteNormSubgroup_preimage (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK).comap @@ -196,7 +191,7 @@ theorem abstractFixedFieldNormResidueSymbol_ker (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : (abstractFixedFieldNormResidueSymbol k Ω D v hcf K L hLK).ker = @@ -204,7 +199,7 @@ theorem abstractFixedFieldNormResidueSymbol_ker (abstractFixedField k Ω K) (abstractRelativeFixedField k Ω hLK) := by let A := galoisAmbientUnitsRep k Ω - let KF : FiniteAbstractField (Gal(Ω / k)) := + let KF : FiniteAbstractField (Gal(Ω/k)) := ⟨K, hKabsolute⟩ let E : FiniteGaloisSubextension K := ⟨L, hLK, hnormal, hfinite⟩ @@ -244,7 +239,7 @@ theorem abstractFixedFieldNormResidueMonoidHom_ker (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : (abstractFixedFieldNormResidueMonoidHom k Ω D v hcf K L hLK).ker = @@ -275,7 +270,7 @@ noncomputable def abstractFixedFieldNormResidueMap (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : letI : FiniteDimensional k (abstractFixedField k Ω K) := abstractFixedField_finiteDimensional k Ω K hKabsolute @@ -283,8 +278,7 @@ noncomputable def abstractFixedFieldNormResidueMap finiteExtensionSpectralNormedField k (abstractFixedField k Ω K) (abstractFixedField k Ω K)ˣ →ₜ* Abelianization - Gal(abstractRelativeFixedField k Ω hLK / - abstractFixedField k Ω K) := by + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := by let F := abstractFixedField k Ω K let E := abstractRelativeFixedField k Ω hLK letI : FiniteDimensional k F := @@ -300,34 +294,58 @@ noncomputable def abstractFixedFieldNormResidueMap k Ω K L hLK hKabsolute hfinite letI : IsGalois F E := abstractRelativeFixedField_isGalois k Ω K L hLK hnormal - letI : DiscreteTopology (Abelianization Gal(E / F)) := + 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] + @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))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] [hK'absolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K' + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K'))] [hK'Kfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] : @@ -367,20 +385,50 @@ noncomputable def abstractFixedFieldNormUnitsMap 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))) + (K K' : ClosedSubgroup (Gal(Ω/k))) (hK'K : K'.toSubgroup ≤ K.toSubgroup) [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] [hK'absolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K' + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K'))] : letI : FiniteDimensional k (abstractFixedField k Ω K) := abstractFixedField_finiteDimensional k Ω K hKabsolute @@ -429,14 +477,12 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMap (K'.toSubgroup ⧸ extensionSubgroup K' L' hL'K')] [hK'absolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K' + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K'))] : Abelianization - Gal(abstractRelativeFixedField k Ω hL'K' / - abstractFixedField k Ω K') →ₜ* + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K') →ₜ* Abelianization - Gal(abstractRelativeFixedField k Ω hLK / - abstractFixedField k Ω K) := by + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K) := by let F' := abstractFixedField k Ω K' let E' := abstractRelativeFixedField k Ω hL'K' letI : FiniteDimensional F' E' := @@ -445,7 +491,7 @@ noncomputable def abstractFixedFieldAbelianizedRestrictionMap letI : IsGalois F' E' := abstractRelativeFixedField_isGalois k Ω K' L' hL'K' hL'normal - letI : DiscreteTopology (Abelianization Gal(E' / F')) := + 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 @@ -464,7 +510,7 @@ noncomputable def abstractFixedFieldAbelianizedTransferMap extensionSubgroup K L (hLK'.trans hK'K))] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : letI : (extensionSubgroup K' L hLK').Normal := transferNormNaturality_intermediateExtension_normal @@ -475,11 +521,9 @@ noncomputable def abstractFixedFieldAbelianizedTransferMap (hLK'.trans hK'K) hK'K hLK' Abelianization Gal(abstractRelativeFixedField k Ω - (hLK'.trans hK'K) / - abstractFixedField k Ω K) →ₜ* + (hLK'.trans hK'K)/abstractFixedField k Ω K) →ₜ* Abelianization - Gal(abstractRelativeFixedField k Ω hLK' / - abstractFixedField k Ω K') := by + Gal(abstractRelativeFixedField k Ω hLK'/abstractFixedField k Ω K') := by letI : (extensionSubgroup K' L hLK').Normal := transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K @@ -496,7 +540,7 @@ noncomputable def abstractFixedFieldAbelianizedTransferMap letI : IsGalois F E := abstractRelativeFixedField_isGalois k Ω K L (hLK'.trans hK'K) hLnormal - letI : DiscreteTopology (Abelianization Gal(E / F)) := + letI : DiscreteTopology (Abelianization Gal(E/F)) := QuotientGroup.discreteTopology (isOpen_discrete _) let f := abstractFixedFieldAbelianizedTransferMonoidHom k Ω K K' L hLK' hK'K @@ -523,8 +567,7 @@ noncomputable def lowerNormResidueMap (abstractFixedField k (SeparableClosure k) T.lowerBase)ˣ →ₜ* Abelianization Gal(abstractRelativeFixedField k (SeparableClosure k) - T.lowerTop_le_lowerBase / - abstractFixedField k (SeparableClosure k) T.lowerBase) := by + T.lowerTop_le_lowerBase/abstractFixedField k (SeparableClosure k) T.lowerBase) := by letI := T.lowerNormal letI := T.lowerFinite letI := T.lowerAbsoluteFinite @@ -562,8 +605,7 @@ noncomputable def upperNormResidueMap (abstractFixedField k (SeparableClosure k) T.upperBase)ˣ →ₜ* Abelianization Gal(abstractRelativeFixedField k (SeparableClosure k) - T.upperTop_le_upperBase / - abstractFixedField k (SeparableClosure k) T.upperBase) := by + T.upperTop_le_upperBase/abstractFixedField k (SeparableClosure k) T.upperBase) := by letI := T.upperNormal letI := T.upperFinite letI := upperAbsoluteFinite T @@ -759,8 +801,7 @@ noncomputable def baseNormResidueMap (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 + (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 @@ -801,8 +842,7 @@ noncomputable def intermediateNormResidueMap (abstractFixedField k (SeparableClosure k) T.intermediate)ˣ →ₜ* Abelianization Gal(abstractRelativeFixedField k (SeparableClosure k) - T.top_le_intermediate / - abstractFixedField k (SeparableClosure k) T.intermediate) := by + T.top_le_intermediate/abstractFixedField k (SeparableClosure k) T.intermediate) := by letI := intermediateNormal T letI := intermediateFinite T letI := intermediateAbsoluteFinite T diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean index 07dcd020d2..903486eb4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -29,15 +29,11 @@ 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] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation F)] - (j : E →ₐ[K] SeparableClosure K) := @AlgEquiv F (SeparableClosure F) (SeparableClosure K) _ _ _ @@ -66,7 +62,7 @@ structure AmbientEmbeddedFixedFieldPresentation /-- 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) + 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. -/ @@ -92,7 +88,7 @@ structure AmbientEmbeddedFixedFieldPresentation SeparableClosure K) = baseEmbedding x /-- The actual quotient equivalence to the original Galois group. -/ - quotientEquiv : extension.extensionQuotient ≃* Gal(E / F) + quotientEquiv : extension.extensionQuotient ≃* Gal(E/F) /-- The quotient equivalence acts through the supplied ambient embedding. -/ quotientEquiv_mk_apply (sigma : base.field.toSubgroup) (x : E) : @@ -119,8 +115,7 @@ noncomputable def fixedFieldQuotientEquiv (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.below/abstractFixedField K (SeparableClosure K) P.base.field) := P.extension.extensionQuotientMulEquiv.trans (abstractExtensionQuotientEquivGaloisGroup K (SeparableClosure K) P.base.field P.extension.field @@ -146,9 +141,8 @@ noncomputable def abelianizedTransport Additive (Abelianization Gal(abstractRelativeFixedField K (SeparableClosure K) - P.extension.below / - abstractFixedField K (SeparableClosure K) P.base.field)) ≃+ - Additive (Abelianization Gal(E / F)) := + 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 @@ -168,7 +162,7 @@ noncomputable def normResidueAbelianElement [FiniteDimensional F E] [IsGalois F E] {j : E →ₐ[K] SeparableClosure K} (P : AmbientEmbeddedFixedFieldPresentation K F E j) - (a : Fˣ) : Abelianization Gal(E / F) := by + (a : Fˣ) : Abelianization Gal(E/F) := by letI : (extensionSubgroup P.base.field P.extension.field P.extension.below).Normal := P.extension.normal @@ -179,9 +173,9 @@ noncomputable def normResidueAbelianElement P.extension.finite letI : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) P.base.field (le_baseField P.base.field)) := P.base.finite exact @@ -224,9 +218,9 @@ theorem normResidueAbelianElement_apply P.extension.finite letI : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) P.base.field (le_baseField P.base.field)) := P.base.finite P.normResidueAbelianElement a = @@ -290,13 +284,13 @@ noncomputable def ambientEmbeddedFixedFieldPresentation ambientEmbeddedExtensionQuotient_finite K F E j e letI _hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, _hHabsolute⟩ let T : FiniteGaloisSubextension H.field := ⟨J₀, hJH, _hTargetNormal, _hTargetFinite⟩ @@ -352,7 +346,7 @@ noncomputable def ambientEmbeddedNormResidueAbelianElement [FiniteDimensional F E] [IsGalois F E] (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) - (a : Fˣ) : Abelianization Gal(E / F) := + (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 @@ -371,8 +365,8 @@ noncomputable def ambientEmbeddedNormResidueElement [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 + (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 index 0b31b31e20..3247a2c413 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean @@ -96,9 +96,9 @@ theorem ambientEmbeddedExtensionQuotient_finite K F E j e let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let F₀ := @@ -248,11 +248,11 @@ theorem ambientEmbeddedNormResidueAbelianElement_eq_of_normClass_eq K F E j e a x hnormClass change - (Abelianization.equivOfComm (H := Gal(E / F))).symm + (Abelianization.equivOfComm (H := Gal(E/F))).symm (localArtinMonoidHom F E a) = - (Abelianization.equivOfComm (H := Gal(E / F))).symm + (Abelianization.equivOfComm (H := Gal(E/F))).symm (ambientEmbeddedNormResidueAbelianElement K F E j e a) - apply congrArg (Abelianization.equivOfComm (H := Gal(E / F))).symm + apply congrArg (Abelianization.equivOfComm (H := Gal(E/F))).symm calc localArtinMonoidHom F E a = ambientEmbeddedNormResidueAbelianElement K F E j e x := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean index 9515bd76ec..681d737f6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -359,7 +359,7 @@ theorem ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H (le_baseField H))] (p : (abstractRelativeFixedField K (SeparableClosure K) hLH)ˣ) @@ -414,9 +414,9 @@ theorem (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) + Gal(SeparableClosure K/K)) (J : ClosedSubgroup - Gal(SeparableClosure K / K)) + Gal(SeparableClosure K/K)) (hJH : J.toSubgroup ≤ H.field.toSubgroup) [hJnormal : (extensionSubgroup H.field J hJH).Normal] @@ -470,9 +470,9 @@ theorem intro p x hprime hnorm let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H.field (le_baseField H.field)) := H.finite let S := @@ -493,7 +493,7 @@ theorem (H.toFiniteResidueAbstractField (localResidueDatum K)) J hJH sigma let SigmaS : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨S, hSabsolute⟩ let pi : ambientFixedAddSubgroup (galoisAmbientUnitsRep K (SeparableClosure K)) S := @@ -557,9 +557,9 @@ theorem [ValuativeRel L] [TopologicalSpace L] [IsNonarchimedeanLocalField L] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) + Gal(SeparableClosure K/K)) (J : ClosedSubgroup - Gal(SeparableClosure K / K)) + Gal(SeparableClosure K/K)) (hJH : J.toSubgroup ≤ H.field.toSubgroup) [hJnormal : (extensionSubgroup H.field J hJH).Normal] @@ -652,7 +652,7 @@ theorem let pH := Units.mapEquiv phi.toMulEquiv pF let SigmaH : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨(localResidueDatum K).frobeniusFixedField (H.toFiniteResidueAbstractField (localResidueDatum K)) J hJH sigma, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean index 2468f19215..6f03bf5d51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -39,7 +39,7 @@ noncomputable def ambientEmbeddedPrimeTransportValue (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) (z : Abelianization Gal(E/F)) : - Abelianization Gal(E / F) := by + Abelianization Gal(E/F) := by let i := j.comp (IsScalarTower.toAlgHom K F E) letI : Algebra F (SeparableClosure K) := @@ -66,9 +66,9 @@ noncomputable def ambientEmbeddedPrimeTransportValue ambientEmbeddedExtensionQuotient_finite K F E j e letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let F₀ := @@ -158,13 +158,13 @@ noncomputable def ambientEmbeddedPrimeSymbolProperty ambientEmbeddedExtensionQuotient_finite K F E j e letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -283,13 +283,13 @@ theorem ambientEmbeddedExtensionQuotient_finite K F E j e letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean index 64dafce8db..76704ab9d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -120,13 +120,13 @@ noncomputable def ambientEmbeddedPrimeWitness ambientEmbeddedExtensionQuotient_finite K F E j e letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding @@ -270,7 +270,7 @@ noncomputable def ambientEmbeddedPrimeTarget (j : E →ₐ[K] SeparableClosure K) (e : ambientEmbeddedSeparableClosureEquiv K F E j) (z : Abelianization Gal(E/F)) : - Abelianization Gal(E / F) := by + Abelianization Gal(E/F) := by let i := j.comp (IsScalarTower.toAlgHom K F E) letI : Algebra F (SeparableClosure K) := @@ -312,13 +312,13 @@ noncomputable def ambientEmbeddedPrimeTarget ambientEmbeddedExtensionQuotient_finite K F E j e letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean index d7f12c58aa..d6cd56fd30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -86,13 +86,13 @@ theorem ambientEmbeddedExtensionQuotient_finite K F E j e let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding @@ -148,7 +148,7 @@ theorem extensionSubgroup RF.field SF hSFB) exact hSFfinite let SigmaF : FiniteAbstractField - Gal(SeparableClosure F / F) := + Gal(SeparableClosure F/F) := ⟨SF, hSFabsolute⟩ let LF := abstractFixedField F (SeparableClosure F) SF @@ -379,13 +379,13 @@ theorem ambientEmbeddedExtensionQuotient_finite K F E j e let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -569,7 +569,7 @@ theorem IsNonarchimedeanLocalField.valuationMap LH (Additive.ofMul pH) = 1 at hpHvalue let SigmaH : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨SH, hSHabsolute⟩ let piH : ambientFixedAddSubgroup (galoisAmbientUnitsRep K (SeparableClosure K)) SH := @@ -718,13 +718,13 @@ theorem ambientEmbeddedExtensionQuotient_finite K F E j e let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean index 7783e77e88..88147c3466 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -422,7 +422,7 @@ noncomputable def (extensionSubgroup H₀ J₀ hJH).Normal := ambientEmbeddedExtensionSubgroup_normal K F E j e (H₀.toSubgroup ⧸ extensionSubgroup H₀ J₀ hJH) ≃* - Gal(E / F) := by + Gal(E/F) := by dsimp only let i := j.comp (IsScalarTower.toAlgHom K F E) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean index 3e95f18938..b42d34983e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean @@ -101,13 +101,13 @@ theorem exact (AlgHom.fieldRange i).fixingSubgroup_le hRange let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let RF := (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean index f3b39622cb..8865de2055 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -34,7 +34,7 @@ theorem map_fixedFieldFiniteNormSubgroup_eq_additiveNormSubgroup (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] : (finiteNormSubgroup (galoisAmbientUnitsRep k Ω) K L hLK).map (abstractFixedFieldUnitsEquivGaloisFixed @@ -101,7 +101,7 @@ noncomputable def fixedFieldFiniteNormQuotientEquivNormQuotient (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] : FiniteNormQuotient (galoisAmbientUnitsRep k Ω) K L hLK ≃+ Additive @@ -193,7 +193,7 @@ theorem fixedFieldFiniteNormQuotientEquivNormQuotient_finiteNormClass (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] (a : ambientFixedAddSubgroup (galoisAmbientUnitsRep k Ω) K) : fixedFieldFiniteNormQuotientEquivNormQuotient @@ -254,7 +254,7 @@ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] (q : K.toSubgroup ⧸ extensionSubgroup K L hLK) (σ : D.FrobeniusElements @@ -269,7 +269,7 @@ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm Gal(Ω/k)).toFiniteResidueAbstractField D) L hLK σ)) (hπ : - let KF : FiniteAbstractField Gal(Ω / k) := + let KF : FiniteAbstractField Gal(Ω/k) := ⟨K, hKabsolute⟩ let KR := KF.toFiniteResidueAbstractField D let S := D.frobeniusFixedField KR L hLK σ @@ -277,10 +277,10 @@ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm letI : Finite (K.toSubgroup ⧸ extensionSubgroup K S hSK) := D.frobeniusFixedField_finite KR L hLK σ - let Sigma : FiniteAbstractField Gal(Ω / k) := + let Sigma : FiniteAbstractField Gal(Ω/k) := ⟨S, D.frobeniusFixedField_absoluteFinite KF L hLK σ⟩ v.IsPrimeElement Sigma π) : - let KF : FiniteAbstractField Gal(Ω / k) := + let KF : FiniteAbstractField Gal(Ω/k) := ⟨K, hKabsolute⟩ let KR := KF.toFiniteResidueAbstractField D let S := D.frobeniusFixedField KR L hLK σ @@ -300,7 +300,7 @@ theorem abstractFixedFieldNormResidueSymbol_apply_primeNorm k Ω K L hLK hnormal).abelianizationCongr (Abelianization.of q)) := by dsimp only - let KF : FiniteAbstractField Gal(Ω / k) := + let KF : FiniteAbstractField Gal(Ω/k) := ⟨K, hKabsolute⟩ let E : FiniteGaloisSubextension KF.field := ⟨L, hLK, hnormal, hfinite⟩ @@ -366,7 +366,7 @@ theorem abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField Gal(Ω/k)).toSubgroup ⧸ - extensionSubgroup (baseField Gal(Ω / k)) K + extensionSubgroup (baseField Gal(Ω/k)) K (le_baseField K))] (x y : (abstractFixedField k Ω K)ˣ) (hxy : @@ -404,7 +404,7 @@ theorem abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq (D.normResidueSymbol (galoisAmbientUnitsRep k Ω) v hcf (⟨K, hKabsolute⟩ : FiniteAbstractField - Gal(Ω / k)) + Gal(Ω/k)) (⟨L, hLK, hnormal, hfinite⟩ : FiniteGaloisSubextension K) (finiteNormClass (galoisAmbientUnitsRep k Ω) @@ -415,7 +415,7 @@ theorem abstractFixedFieldNormResidueSymbol_eq_of_normClass_eq (D.normResidueSymbol (galoisAmbientUnitsRep k Ω) v hcf (⟨K, hKabsolute⟩ : FiniteAbstractField - Gal(Ω / k)) + Gal(Ω/k)) (⟨L, hLK, hnormal, hfinite⟩ : FiniteGaloisSubextension K) (finiteNormClass (galoisAmbientUnitsRep k Ω) @@ -428,8 +428,8 @@ equivalence. -/ theorem fixedFieldQuotientEquiv_mk_compatibility (K : Type) [Field K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -449,7 +449,7 @@ theorem fixedFieldQuotientEquiv_mk_compatibility let i : E →ₐ[F] SeparableClosure F := e.symm.toAlgHom.comp E.val let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -474,7 +474,7 @@ theorem fixedFieldQuotientEquiv_mk_compatibility let i : E →ₐ[F] SeparableClosure F := e.symm.toAlgHom.comp E.val let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean index dd64784724..ca7eb18607 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -35,8 +35,8 @@ 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)) + 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 @@ -57,7 +57,7 @@ theorem intrinsicExtensionSubgroup_iff_ambientFixedField e.symm.toAlgHom.comp E.val let EI := finiteGaloisAbstractExtensionOfEmbedding F E i let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -81,7 +81,7 @@ theorem intrinsicExtensionSubgroup_iff_ambientFixedField e.symm.toAlgHom.comp E.val let EI := finiteGaloisAbstractExtensionOfEmbedding F E i let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -149,8 +149,8 @@ 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)) + 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 @@ -180,7 +180,7 @@ theorem intrinsicExtensionInertia_iff_ambientFixedField e.symm.toAlgHom.comp E.val let EI := finiteGaloisAbstractExtensionOfEmbedding F E i let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -214,7 +214,7 @@ theorem intrinsicExtensionInertia_iff_ambientFixedField e.symm.toAlgHom.comp E.val let EI := finiteGaloisAbstractExtensionOfEmbedding F E i let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -287,8 +287,8 @@ abbrev intrinsicFixedFieldFrobeniusQuotient (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean index 2de589cc6e..d61c64113d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -33,16 +33,16 @@ theorem ambientEmbeddedAbsoluteQuotientFinite (AlgHom.fieldRange i) Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (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 G := Gal(SeparableClosure K/K) let Bases := { B : ClosedSubgroup G // H₀.toSubgroup ≤ B.toSubgroup } let Bfix : Bases := @@ -160,7 +160,7 @@ noncomputable def intrinsicBaseEquivAmbientFixedField (separableClosure F (AlgebraicClosure F)).algebra intro e let φ : - Gal(SeparableClosure F / F) ≃* + Gal(SeparableClosure F/F) ≃* H.field.toSubgroup := (AlgEquiv.autCongr e).trans (abstractSubgroupEquivGaloisGroup @@ -211,13 +211,13 @@ noncomputable def (AlgHom.fieldRange i) letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -254,8 +254,8 @@ noncomputable def rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] rfl let theta : - Gal(SeparableClosure F / F) ≃* - Gal(SeparableClosure F₀ / F₀) := { + Gal(SeparableClosure F/F) ≃* + Gal(SeparableClosure F₀/F₀) := { toFun := fun sigma => { c.symm.trans (sigma.toRingEquiv.trans c) with commutes' := fun x => by @@ -322,13 +322,13 @@ theorem (AlgHom.fieldRange i) letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let _H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -339,7 +339,7 @@ theorem let phi : F ≃+* F₀ := ((i.equivFieldRange).trans (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv - let rho : Gal(SeparableClosure K / F₀) := + let rho : Gal(SeparableClosure K/F₀) := { e.symm.toRingEquiv.trans (tau.1.toRingEquiv.trans e.toRingEquiv) with commutes' := fun x => by @@ -380,13 +380,13 @@ theorem (AlgHom.fieldRange i) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -422,7 +422,7 @@ theorem apply e₀.injective rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] rfl - let thetaTau : Gal(SeparableClosure F₀ / F₀) := + 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 @@ -435,7 +435,7 @@ theorem 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₀) := + let rho : Gal(SeparableClosure K/F₀) := { e.symm.toRingEquiv.trans (tau.1.toRingEquiv.trans e.toRingEquiv) with commutes' := fun x => by @@ -517,13 +517,13 @@ theorem (AlgHom.fieldRange i) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -534,7 +534,7 @@ theorem let phi : F ≃+* F₀ := ((i.equivFieldRange).trans (IntermediateField.equivOfEq hfixed.symm)).toRingEquiv - let rho : Gal(SeparableClosure K / F₀) := + let rho : Gal(SeparableClosure K/F₀) := { e.symm.toRingEquiv.trans (tau.1.toRingEquiv.trans e.toRingEquiv) with commutes' := fun y => by @@ -602,13 +602,13 @@ theorem (AlgHom.fieldRange i) letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ (localResidueDatum F).normalizedDegree ((intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField @@ -625,13 +625,13 @@ theorem (AlgHom.fieldRange i) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ rw [intrinsicBase_normalizedDegree_eq_localResidueDegree F tau] have hdegree := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index 9c47be80d1..702603d113 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -33,8 +33,8 @@ 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)) + 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 @@ -167,13 +167,13 @@ theorem (AlgHom.fieldRange i) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -210,8 +210,8 @@ theorem rw [e₀.apply_symm_apply, e.commutes, e₀.commutes] rfl let theta : - Gal(SeparableClosure F / F) ≃* - Gal(SeparableClosure F₀ / F₀) := { + Gal(SeparableClosure F/F) ≃* + Gal(SeparableClosure F₀/F₀) := { toFun := fun sigma => { c.symm.trans (sigma.toRingEquiv.trans c) with commutes' := fun x => by @@ -263,7 +263,7 @@ theorem have hpsi₀ : Continuous psi₀ := intrinsicBaseEquivAmbientFixedField_continuous K H e₀ have hlift : Continuous - (fun sigma : Gal(SeparableClosure F₀ / F₀) => + (fun sigma : Gal(SeparableClosure F₀/F₀) => (⟨sigma, by rw [intrinsicAbstractBase, closedFixingSubgroup_bot_eq_baseField] @@ -313,6 +313,21 @@ noncomputable def 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 @@ -510,14 +525,9 @@ theorem intro x hx rcases hx with ⟨y, rfl⟩ exact ⟨algebraMap F E y, rfl⟩ - letI _hSourceNormal : - (extensionSubgroup - (intrinsicAbstractBase F) EI.field EI.below).Normal := + letI _hSourceNormal := EI.normal - letI _hSourceFinite : Finite - ((intrinsicAbstractBase F).toSubgroup ⧸ - extensionSubgroup - (intrinsicAbstractBase F) EI.field EI.below) := + letI _hSourceFinite := EI.finite letI hTargetNormal : (extensionSubgroup H₀ J₀ hJH).Normal := @@ -532,15 +542,9 @@ theorem 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) := + let hHabsolute := ambientEmbeddedAbsoluteQuotientFinite K F i + let H : FiniteAbstractField + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -578,14 +582,9 @@ theorem (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 := + let hSourceNormal := EI.normal - let hSourceFinite : Finite - ((intrinsicAbstractBase F).toSubgroup ⧸ - extensionSubgroup - (intrinsicAbstractBase F) EI.field EI.below) := + let hSourceFinite := EI.finite let hTargetNormal : (extensionSubgroup H₀ J₀ hJH).Normal := @@ -599,13 +598,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -615,10 +614,8 @@ theorem intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField K F E j e (QuotientGroup.mk tau) = QuotientGroup.mk - (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := by - exact - LocalFieldTheory.QuotientGroup.continuousCongr_mk - _ _ _ _ tau + (intrinsicBaseEquivAmbientEmbeddedField K F i e tau) := + LocalFieldTheory.QuotientGroup.continuousCongr_mk _ _ _ _ tau rw [hquotientMk, (localResidueDatum K).extensionNormalizedDegree_mk, (localResidueDatum F).extensionNormalizedDegree_mk] @@ -689,13 +686,13 @@ noncomputable def (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -704,71 +701,14 @@ noncomputable def (localResidueDatum K).FrobeniusElements RH 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 - 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₀, hHabsolute⟩ - let RH := - H.toFiniteResidueAbstractField (localResidueDatum K) - intro sigma - refine - ⟨intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField - K F E j e sigma.1, ?_⟩ + (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] + rw [intrinsicFrobeniusQuotientContinuousEquivAmbientEmbeddedField_normalizedDegree] exact hdegree /-- Extension restriction commutes with the intrinsic-to-ambient quotient @@ -1008,13 +948,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1103,13 +1043,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1176,13 +1116,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1194,78 +1134,14 @@ theorem 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 - change - q ∈ - (closedSubgroupGenerated - (Set.range (fun _ : Unit => sigma.1) : Set - ((intrinsicAbstractBase F).toSubgroup ⧸ - (localResidueDatum F).extensionInertiaWithin - (intrinsicAbstractBase F) EI.field EI.below)) : - Subgroup _) at hq - have hmap := - map_mem_closedSubgroupGenerated_image - xiHom - hq - have hgenerators : - xiHom '' - Set.range (fun _ : Unit => sigma.1) = - Set.range (fun _ : Unit => xiHom sigma.1) := by - ext y - constructor - · rintro ⟨x, ⟨u, rfl⟩, rfl⟩ - exact ⟨u, rfl⟩ - · rintro ⟨u, rfl⟩ - exact ⟨sigma.1, ⟨u, rfl⟩, rfl⟩ - rw [hgenerators] at hmap - change - xiHom q ∈ - (closedSubgroupGenerated - (Set.range (fun _ : Unit => xiHom sigma.1) : Set - (H₀.toSubgroup ⧸ - (localResidueDatum K).extensionInertiaWithin - H₀ J₀ hJH)) : - Subgroup _) - exact hmap - · intro hq - change - xiHom q ∈ - (closedSubgroupGenerated - (Set.range (fun _ : Unit => xiHom sigma.1) : Set - (H₀.toSubgroup ⧸ - (localResidueDatum K).extensionInertiaWithin - H₀ J₀ hJH)) : - Subgroup _) at hq - have hmap := - map_mem_closedSubgroupGenerated_image - xiInvHom - hq - have hgenerators : - xiInvHom '' - Set.range (fun _ : Unit => xiHom sigma.1) = - Set.range (fun _ : Unit => sigma.1) := by - ext y - constructor - · rintro ⟨x, ⟨u, rfl⟩, rfl⟩ - exact ⟨u, (xi.symm_apply_apply sigma.1).symm⟩ - · rintro ⟨u, rfl⟩ - exact - ⟨xiHom sigma.1, ⟨u, rfl⟩, - xi.symm_apply_apply sigma.1⟩ - rw [hgenerators] at hmap - have hvalue : xiInvHom (xiHom q) = q := - xi.symm_apply_apply q - rw [hvalue] at hmap - change - q ∈ - (closedSubgroupGenerated - (Set.range (fun _ : Unit => sigma.1) : Set - ((intrinsicAbstractBase F).toSubgroup ⧸ - (localResidueDatum F).extensionInertiaWithin - (intrinsicAbstractBase F) EI.field EI.below)) : - Subgroup _) - exact hmap + 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. -/ @@ -1319,13 +1195,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1386,13 +1262,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1478,13 +1354,13 @@ noncomputable def (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1567,13 +1443,13 @@ noncomputable def (localResidueDatum F) letI hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, ambientEmbeddedAbsoluteQuotientFinite K F i⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) @@ -1660,7 +1536,7 @@ noncomputable def calc rho (e x) = (psi tau).1.1 (e x) := by exact congrArg - (fun g : Gal(SeparableClosure K / K) => g (e x)) + (fun g : Gal(SeparableClosure K/K) => g (e x)) hrhoeq.symm _ = e (tau.1 x) := by rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, @@ -1809,13 +1685,13 @@ theorem (localResidueDatum F) let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H₀ (le_baseField H₀)) := by exact ambientEmbeddedAbsoluteQuotientFinite K F i let H : FiniteAbstractField - Gal(SeparableClosure K / K) := + Gal(SeparableClosure K/K) := ⟨H₀, hHabsolute⟩ let RH := H.toFiniteResidueAbstractField (localResidueDatum K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean index 32b339bf57..70879ea7dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean @@ -27,8 +27,8 @@ variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -37,9 +37,9 @@ variable local instance intrinsicFixedFieldArtin_absoluteFinite : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H.field (le_baseField H.field)) := H.finite diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean index a5d6ae4120..1c3af1a242 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean @@ -27,8 +27,8 @@ 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)) + 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 @@ -127,8 +127,8 @@ 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)) + 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 @@ -223,8 +223,8 @@ 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)) + 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 @@ -298,8 +298,8 @@ 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)) + 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 @@ -338,8 +338,8 @@ 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)) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean index 7fff1ae318..6180887eca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean @@ -27,8 +27,8 @@ 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)) + 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 @@ -174,8 +174,8 @@ 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)) + 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 @@ -328,8 +328,8 @@ 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)) + 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 @@ -496,8 +496,8 @@ 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)) + 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 @@ -658,8 +658,8 @@ 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)) + 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 @@ -722,8 +722,8 @@ noncomputable def (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -847,8 +847,8 @@ theorem (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean index 3bef64c75f..254ca01a7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean @@ -55,8 +55,8 @@ noncomputable def (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -141,8 +141,8 @@ 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)) + 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 @@ -189,8 +189,8 @@ 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)) + 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 @@ -215,8 +215,8 @@ theorem (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -319,8 +319,8 @@ abbrev intrinsicFixedFieldFrobeniusElements (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -366,8 +366,8 @@ abbrev ambientFixedFieldFrobeniusQuotient (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 ⧸ @@ -380,8 +380,8 @@ abbrev ambientFixedFieldFrobeniusProperty (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 := @@ -397,8 +397,8 @@ abbrev ambientFixedFieldFrobeniusElements (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 // @@ -411,8 +411,8 @@ theorem (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -441,8 +441,8 @@ noncomputable def (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -463,8 +463,8 @@ 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)) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index fa3bdb301c..8c2526f4eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -61,20 +61,20 @@ theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction [_hHabsolute : Finite ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (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)) + (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)) + (restrictActual : Gal(L'/K') →* Gal(L/K)) (hbase : ∀ x : L, jUpper (algebraMap L L' x) = jLower x) - (hcompat : ∀ (τ : Gal(L' / K')) (x : L), + (hcompat : ∀ (τ : Gal(L'/K')) (x : L), jLower (restrictActual τ x) = jUpper (τ (algebraMap L L' x))) (z : Abelianization @@ -82,10 +82,10 @@ theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction extensionSubgroup upper.base.field upper.extension.field upper.extension.below)) : restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm ((upper.extension.extensionQuotientMulEquiv.symm.trans upper.quotientEquiv).abelianizationCongr z)) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm ((lower.extension.extensionQuotientMulEquiv.symm.trans lower.quotientEquiv).abelianizationCongr (normResidueNaturalityAbelianizedRestriction @@ -103,10 +103,10 @@ theorem AmbientEmbeddedFixedFieldPresentation.quotientRestriction obtain ⟨sigma, rfl⟩ := QuotientGroup.mk_surjective q change restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm (qUpper.abelianizationCongr (Abelianization.of (QuotientGroup.mk sigma)))) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (qLower.abelianizationCongr (normResidueNaturalityAbelianizedRestriction lower.base.field upper.base.field @@ -223,12 +223,12 @@ theorem AmbientEmbeddedFixedFieldPresentation.fixedFieldNormResidueTransport [_hHabsolute : Finite ((baseField Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (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)) + (baseField Gal(SeparableClosure K/K)) upper.base.field (le_baseField upper.base.field))] [_hH'finite : Finite (lower.base.field.toSubgroup ⧸ @@ -490,16 +490,16 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction upper.extension.finite let hHabsolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H (le_baseField H)) := lower.base.finite let hH'absolute : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H' (le_baseField H')) := upper.base.finite let hH'finite : Finite @@ -517,10 +517,10 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction let phiUpper : K' ≃ₐ[K] FUpper := upper.baseEquiv let restrictActual : - Gal(L' / K') →* Gal(L / K) := + Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) - have hcompat : ∀ (τ : Gal(L' / K')) (x : L), + have hcompat : ∀ (τ : Gal(L'/K')) (x : L), jLower (restrictActual τ x) = j (τ (algebraMap L L' x)) := by intro τ x @@ -581,9 +581,9 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction have htarget (z : Abelianization upper.extension.extensionQuotient) : restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm (upper.quotientEquiv.abelianizationCongr z)) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.quotientEquiv.abelianizationCongr (lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm (normResidueNaturalityAbelianizedRestriction @@ -637,9 +637,9 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction lower.quotientEquiv.abelianizationCongr lowerQuotientValue := by exact lower.normResidueAbelianElement_apply aNorm - let ambientUpper : Gal(L' / K') := + let ambientUpper : Gal(L'/K') := ambientEmbeddedNormResidueElement K K' L' j eUpper a - let ambientLower : Gal(L / K) := + let ambientLower : Gal(L/K) := ambientEmbeddedNormResidueElement K K L jLower eLower aNorm have htransport : restrictActual ambientUpper = ambientLower := by @@ -648,17 +648,17 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction ambientEmbeddedNormResidueAbelianElement] change restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm (upper.normResidueAbelianElement a)) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.normResidueAbelianElement aNorm) rw [hupperEval, hlowerEval] calc restrictActual - ((Abelianization.equivOfComm (H := Gal(L' / K'))).symm + ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm (upper.quotientEquiv.abelianizationCongr upperQuotientValue)) = - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.quotientEquiv.abelianizationCongr (lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm (normResidueNaturalityAbelianizedRestriction @@ -666,12 +666,12 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction (upper.extension.extensionQuotientMulEquiv.abelianizationCongr upperQuotientValue)))) := htarget upperQuotientValue - _ = (Abelianization.equivOfComm (H := Gal(L / K))).symm + _ = (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.quotientEquiv.abelianizationCongr lowerQuotientValue) := congrArg (fun z => - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.quotientEquiv.abelianizationCongr z)) hambient change @@ -743,14 +743,14 @@ theorem abelianLocalArtinMonoidHom_norm_restriction IsSepClosure.equiv K' (SeparableClosure K') (SeparableClosure K) let restrictActual : - Gal(L' / K') →* Gal(L / K) := + Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) let aNorm : Kˣ := normUnits K K' a - let ambientUpper : Gal(L' / K') := + let ambientUpper : Gal(L'/K') := ambientEmbeddedNormResidueElement K K' L' j eUpper a - let ambientLower : Gal(L / K) := + let ambientLower : Gal(L/K) := ambientEmbeddedNormResidueElement K K L jLower eLower aNorm have hUpper : abelianLocalArtinMonoidHom K' L' a = ambientUpper := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean index 1f4be32d16..409fda8ebe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -27,8 +27,8 @@ variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] (H : FiniteAbstractField - Gal(SeparableClosure K / K)) - (J : ClosedSubgroup Gal(SeparableClosure K / K)) + 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 @@ -75,9 +75,9 @@ local instance intrinsicPrimeComparisonSeparableClosureAlgebra : local instance intrinsicPrimeComparison_absoluteFinite : Finite ((baseField - Gal(SeparableClosure K / K)).toSubgroup ⧸ + Gal(SeparableClosure K/K)).toSubgroup ⧸ extensionSubgroup - (baseField Gal(SeparableClosure K / K)) + (baseField Gal(SeparableClosure K/K)) H.field (le_baseField H.field)) := H.finite @@ -135,13 +135,13 @@ local instance intrinsicPrimeComparison_residueExtensionFinite : /-- 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)) := + 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) := + (x : Fˣ) : Abelianization Gal(E/F) := concreteNormResidueSymbolOfEmbedding F E iFE (localResidueDatum F) @@ -168,7 +168,7 @@ private def intrinsicFixedFieldAmbientPrimeComparison intrinsic finite-extension Galois group. -/ def intrinsicFixedFieldSourceFrobeniusAbelianization (q : (EI).extensionQuotient) : - Abelianization Gal(E / F) := + Abelianization Gal(E/F) := Abelianization.of (qF q) /-- Restrict a transported ambient Frobenius element and map the resulting @@ -177,7 +177,7 @@ def intrinsicFixedFieldAmbientFrobeniusAbelianization (σ : (localResidueDatum F).FrobeniusElements RF (EI).field (EI).below) : - Abelianization Gal(E / F) := + Abelianization Gal(E/F) := (qH).abelianizationCongr (Abelianization.of ((localResidueDatum K).frobeniusRestriction @@ -352,6 +352,13 @@ local instance intrinsicPrimeComparisonFrobeniusAmbientAlgebraF (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 @@ -643,7 +650,7 @@ local instance intrinsicPrimeComparison_frobeniusSourceQuotientFinite inside the intrinsic absolute Galois group. -/ def intrinsicFixedFieldFrobeniusSourceAbstractField (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : - FiniteAbstractField Gal(SeparableClosure F / F) := by + FiniteAbstractField Gal(SeparableClosure F/F) := by letI _hExtensionFinite : Finite ((intrinsicAbstractBase F).toSubgroup ⧸ @@ -721,7 +728,7 @@ private theorem intrinsicFixedFieldFrobeniusPrimeNorm_relativeNorm abstract field inside the ambient absolute Galois group. -/ def intrinsicFixedFieldFrobeniusAmbientAbstractField (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : - FiniteAbstractField Gal(SeparableClosure K / K) := + FiniteAbstractField Gal(SeparableClosure K/K) := ⟨intrinsicFixedFieldFrobeniusAmbientClosedField K H J hJH e σ, (localResidueDatum K).frobeniusFixedField_absoluteFinite @@ -941,18 +948,18 @@ private noncomputable def intrinsicFixedFieldAmbientQuotientResult (q : H.field.toSubgroup ⧸ extensionSubgroup H.field J hJH) : - Gal(E / F) := + Gal(E/F) := qH q private noncomputable def intrinsicFixedFieldSourceQuotientResult (q : (EI).extensionQuotient) : - Gal(E / F) := + Gal(E/F) := qF q private noncomputable def intrinsicFixedFieldFrobeniusAmbientRestrictionResult (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : - Gal(E / F) := + Gal(E/F) := intrinsicFixedFieldAmbientQuotientResult K H J hJH ((localResidueDatum K).frobeniusRestriction RH J hJH @@ -962,7 +969,7 @@ private noncomputable def private noncomputable def intrinsicFixedFieldFrobeniusSourceRestrictionResult (σ : intrinsicFixedFieldFrobeniusElements K H J hJH e) : - Gal(E / F) := + Gal(E/F) := intrinsicFixedFieldSourceQuotientResult K H J hJH e ((localResidueDatum F).frobeniusRestriction RF (EI).field (EI).below σ) @@ -1224,7 +1231,7 @@ theorem exists_intrinsicFixedFieldNormClassRepresentative H.field J hJH (Additive.ofMul x) = intrinsicFixedFieldLocalArtinMonoidHom K H J hJH (Additive.ofMul a) := by - let z : Abelianization Gal(E / F) := + let z : Abelianization Gal(E/F) := concreteNormResidueSymbolOfEmbedding F E iFE (localResidueDatum F) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 4ba20beb22..981598ad3c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -18,6 +18,15 @@ of its concrete fixed field. The concrete field is equipped with the canonical spectral extension of the topology on the original local field. -/ +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 @@ -247,7 +256,7 @@ theorem localSeparableValuationSubring_eq_comap_finiteExtensionEquiv have hBext : (localCompleteDVF F).valuation.HasExtension B.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change e (algebraMap F (SeparableClosure F) x) ∈ A ↔ x ∈ (localCompleteDVF F).valuation.valuationSubring @@ -300,7 +309,7 @@ theorem localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv localSeparableDecompositionGroup_eq_top F apply top_unique intro sigma _hsigma - let sigmaF : Gal(SeparableClosure F / F) := + let sigmaF : Gal(SeparableClosure F/F) := AlgEquiv.autCongr e.symm sigma have hsigmaF : sigmaF • AF = AF := by @@ -399,7 +408,7 @@ theorem letI : IsSepClosure F (SeparableClosure K) := ⟨inferInstance, inferInstance⟩ ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) - (sigma : Gal(SeparableClosure F / F)), + (sigma : Gal(SeparableClosure F/F)), letI : Fintype (decompositionResidueField F (localSeparableValuationSubring K)) := finiteExtensionDecompositionResidueFintype K F i e @@ -560,8 +569,8 @@ theorem localResidueDegree_semilinear_conjugation (hvaluation : localSeparableValuationSubring K = (localSeparableValuationSubring F).comap e.toRingHom) - (sigma : Gal(SeparableClosure K / K)) : - let sigmaF : Gal(SeparableClosure F / F) := + (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 @@ -654,7 +663,7 @@ theorem localResidueDegree_semilinear_conjugation congr 1 apply Subtype.ext exact (hr _).trans (he (a : K)) - let sigmaF : Gal(SeparableClosure F / F) := + let sigmaF : Gal(SeparableClosure F/F) := { e.symm.trans (sigma.toRingEquiv.trans e) with commutes' := fun x => by change e (sigma (e.symm @@ -773,7 +782,7 @@ theorem localSeparableValuationSubring_eq_comap_abstractFixedFieldEquiv have hBext : (localCompleteDVF F).valuation.HasExtension B.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change e (algebraMap F (SeparableClosure F) x) ∈ A ↔ x ∈ (localCompleteDVF F).valuation.valuationSubring @@ -830,7 +839,7 @@ private theorem exists_abstractFixedFieldResidueEquiv (abstractFixedField K (SeparableClosure K) H.field).val let : (localCompleteDVF K).valuation.HasExtension C.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change ValuativeRel.valuation F (algebraMap K F x) ≤ 1 ↔ (localCompleteDVF K).valuation x ≤ 1 @@ -839,10 +848,10 @@ private theorem exists_abstractFixedFieldResidueEquiv rfl have hVC : V.valuation.HasExtension C.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x simpa only [V, ValuationSubring.valuationSubring_valuation] using - (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_pullback_of_hasExtension_valuation + (valuationSubring_pullback_of_hasExtension_valuation (localCompleteDVF K).valuation C x) have hC : A.comap (algebraMap F (SeparableClosure K)) = C := by simpa only [ @@ -936,8 +945,7 @@ private theorem residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEq (localSeparableValuationSubring K))] (e : SeparableClosure (finiteFixedField K H) ≃ₐ[ finiteFixedField K H] SeparableClosure K) - (sigma : Gal(SeparableClosure (finiteFixedField K H) / - finiteFixedField K H)) + (sigma : Gal(SeparableClosure (finiteFixedField K H)/finiteFixedField K H)) (htop : decompositionGroup (finiteFixedField K H) (localSeparableValuationSubring K) = ⊤) (tau : decompositionResidueField (finiteFixedField K H) @@ -1031,8 +1039,7 @@ theorem localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv (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)) : + (sigma : Gal(SeparableClosure (finiteFixedField K H)/finiteFixedField K H)) : letI : FiniteDimensional K (finiteFixedField K H) := abstractFixedField_finiteDimensional @@ -1103,7 +1110,7 @@ private theorem finite_absoluteFixingQuotient_fieldRange 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 G := Gal(SeparableClosure K/K) let Bases := { B : ClosedSubgroup G // H₀.toSubgroup ≤ B.toSubgroup } let Bfix : Bases := @@ -1167,19 +1174,19 @@ theorem letI : Algebra F (SeparableClosure K) := i.toRingHom.toAlgebra ∀ (e : SeparableClosure F ≃ₐ[F] SeparableClosure K) - (sigma : Gal(SeparableClosure F / F)), + (sigma : Gal(SeparableClosure F/F)), let H₀ := closedFixingSubgroup K (SeparableClosure K) (AlgHom.fieldRange i) letI hHabsolute : Finite ((baseField - (Gal(SeparableClosure K / K))).toSubgroup ⧸ + (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) + (baseField (Gal(SeparableClosure K/K))) H₀ (le_baseField H₀)) := finite_absoluteFixingQuotient_fieldRange K F i let H : FiniteAbstractField - (Gal(SeparableClosure K / K)) := + (Gal(SeparableClosure K/K)) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ @@ -1212,13 +1219,13 @@ theorem (AlgHom.fieldRange i) let hHabsolute : Finite ((baseField - (Gal(SeparableClosure K / K))).toSubgroup ⧸ + (Gal(SeparableClosure K/K))).toSubgroup ⧸ extensionSubgroup - (baseField (Gal(SeparableClosure K / K))) + (baseField (Gal(SeparableClosure K/K))) H₀ (le_baseField H₀)) := finite_absoluteFixingQuotient_fieldRange K F i let H : FiniteAbstractField - (Gal(SeparableClosure K / K)) := + (Gal(SeparableClosure K/K)) := ⟨H₀, hHabsolute⟩ let F₀ := abstractFixedField K (SeparableClosure K) H₀ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean index c1185453c9..da5464bbbe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -70,13 +70,12 @@ noncomputable def abstractFixedFieldNormResidueSymbol (K.toSubgroup ⧸ extensionSubgroup K L hLK)] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + 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)) := + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := by + let KF : FiniteAbstractField (Gal(Ω/k)) := ⟨K, hKabsolute⟩ let E : FiniteGaloisSubextension KF.field := ⟨L, hLK, hnormal, hfinite⟩ @@ -113,11 +112,9 @@ noncomputable def abstractFixedFieldAbelianizedRestriction [hLnormal : (extensionSubgroup K L hLK).Normal] [hL'normal : (extensionSubgroup K' L' hL'K').Normal] : Additive (Abelianization - Gal(abstractRelativeFixedField k Ω hL'K' / - abstractFixedField k Ω K')) →+ + Gal(abstractRelativeFixedField k Ω hL'K'/abstractFixedField k Ω K')) →+ Additive (Abelianization - Gal(abstractRelativeFixedField k Ω hLK / - abstractFixedField k Ω K)) := + Gal(abstractRelativeFixedField k Ω hLK/abstractFixedField k Ω K)) := MonoidHom.toAdditive ((abstractExtensionQuotientEquivGaloisGroup k Ω K L hLK hLnormal).abelianizationCongr.toMonoidHom.comp @@ -190,13 +187,13 @@ theorem abstractFixedFieldNormResidueSymbol_norm_restriction [hK'Kfinite : Finite (K.toSubgroup ⧸ extensionSubgroup K K' hK'K)] [hKabsolute : Finite - ((baseField (Gal(Ω / k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : - letI : Finite ((baseField (Gal(Ω / k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K' + letI : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K')) := - relativeTowerQuotientFinite (baseField (Gal(Ω / k))) K K' hK'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 @@ -205,16 +202,16 @@ theorem abstractFixedFieldNormResidueSymbol_norm_restriction (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' + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K')) := - relativeTowerQuotientFinite (baseField (Gal(Ω / k))) K K' hK'K + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K (le_baseField K) - let KF : FiniteAbstractField (Gal(Ω / k)) := + let KF : FiniteAbstractField (Gal(Ω/k)) := ⟨K, hKabsolute⟩ - let K'F : FiniteAbstractField (Gal(Ω / k)) := + let K'F : FiniteAbstractField (Gal(Ω/k)) := ⟨K', inferInstance⟩ - let T : FiniteAbstractFieldExtension (Gal(Ω / k)) := + let T : FiniteAbstractFieldExtension (Gal(Ω/k)) := { field := K'F base := KF below := hK'K @@ -300,11 +297,9 @@ noncomputable def abstractFixedFieldAbelianizedTransfer FiniteGaloisSubextension.finite_extension_over_intermediate (hLK'.trans hK'K) hK'K hLK' Additive (Abelianization - Gal(abstractRelativeFixedField k Ω (hLK'.trans hK'K) / - abstractFixedField k Ω K)) →+ + Gal(abstractRelativeFixedField k Ω (hLK'.trans hK'K)/abstractFixedField k Ω K)) →+ Additive (Abelianization - Gal(abstractRelativeFixedField k Ω hLK' / - abstractFixedField k Ω K')) := by + 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 @@ -338,7 +333,7 @@ theorem abstractFixedFieldNormResidueSymbol_transfer_inclusion extensionSubgroup K L (hLK'.trans hK'K))] [hKabsolute : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(Ω / k))) K + extensionSubgroup (baseField (Gal(Ω/k))) K (le_baseField K))] : letI : (extensionSubgroup K' L hLK').Normal := transferNormNaturality_intermediateExtension_normal K K' L hLK' hK'K @@ -350,10 +345,10 @@ theorem abstractFixedFieldNormResidueSymbol_transfer_inclusion (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' + letI : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K')) := - relativeTowerQuotientFinite (baseField (Gal(Ω / k))) K K' hK'K + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K (le_baseField K) (abstractFixedFieldAbelianizedTransfer k Ω K K' L hLK' hK'K).comp @@ -372,16 +367,16 @@ theorem abstractFixedFieldNormResidueSymbol_transfer_inclusion (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' + let : Finite ((baseField (Gal(Ω/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(Ω/k))) K' (le_baseField K')) := - relativeTowerQuotientFinite (baseField (Gal(Ω / k))) K K' hK'K + relativeTowerQuotientFinite (baseField (Gal(Ω/k))) K K' hK'K (le_baseField K) - let KF : FiniteAbstractField (Gal(Ω / k)) := + let KF : FiniteAbstractField (Gal(Ω/k)) := ⟨K, hKabsolute⟩ - let K'F : FiniteAbstractField (Gal(Ω / k)) := + let K'F : FiniteAbstractField (Gal(Ω/k)) := ⟨K', inferInstance⟩ - let T : FiniteAbstractFieldExtension (Gal(Ω / k)) := + let T : FiniteAbstractFieldExtension (Gal(Ω/k)) := { field := K'F base := KF below := hK'K @@ -455,13 +450,13 @@ 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)) + lowerBase : ClosedSubgroup (Gal(SeparableClosure k/k)) /-- The subgroup fixing the upper base field. -/ - upperBase : ClosedSubgroup (Gal(SeparableClosure k / k)) + upperBase : ClosedSubgroup (Gal(SeparableClosure k/k)) /-- The subgroup fixing the top field of the lower horizontal extension. -/ - lowerTop : ClosedSubgroup (Gal(SeparableClosure k / k)) + lowerTop : ClosedSubgroup (Gal(SeparableClosure k/k)) /-- The subgroup fixing the top field of the upper horizontal extension. -/ - upperTop : ClosedSubgroup (Gal(SeparableClosure k / k)) + 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. -/ @@ -491,8 +486,8 @@ structure LocalFixedFieldNormRestrictionSquare /-- 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))) + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) lowerBase (le_baseField lowerBase)) namespace LocalFixedFieldNormRestrictionSquare @@ -504,14 +499,14 @@ variable {k : Type} [Field k] [ValuativeRel k] [TopologicalSpace k] theorem upperAbsoluteFinite (T : LocalFixedFieldNormRestrictionSquare k) : Finite - ((baseField (Gal(SeparableClosure k / k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(SeparableClosure k / k))) + ((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))) + (baseField (Gal(SeparableClosure k/k))) T.lowerBase T.upperBase T.upperBase_le_lowerBase (le_baseField T.lowerBase) @@ -595,11 +590,11 @@ 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)) + base : ClosedSubgroup (Gal(SeparableClosure k/k)) /-- The subgroup fixing the intermediate field of the tower. -/ - intermediate : ClosedSubgroup (Gal(SeparableClosure k / k)) + intermediate : ClosedSubgroup (Gal(SeparableClosure k/k)) /-- The subgroup fixing the top field of the tower. -/ - top : ClosedSubgroup (Gal(SeparableClosure k / k)) + 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. -/ @@ -616,8 +611,8 @@ structure LocalFixedFieldTransferTower /-- The base field is finite over the original local field. -/ baseAbsoluteFinite : Finite - ((baseField (Gal(SeparableClosure k / k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(SeparableClosure k / k))) + ((baseField (Gal(SeparableClosure k/k))).toSubgroup ⧸ + extensionSubgroup (baseField (Gal(SeparableClosure k/k))) base (le_baseField base)) namespace LocalFixedFieldTransferTower @@ -664,14 +659,14 @@ theorem baseIntermediateFinite theorem intermediateAbsoluteFinite (T : LocalFixedFieldTransferTower k) : Finite - ((baseField (Gal(SeparableClosure k / k))).toSubgroup ⧸ - extensionSubgroup (baseField (Gal(SeparableClosure k / k))) + ((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))) + (baseField (Gal(SeparableClosure k/k))) T.base T.intermediate T.intermediate_le_base (le_baseField T.base) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index 1b91c57585..ace36bb45f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -108,7 +108,7 @@ private theorem abstractFixedFieldCosetToAlgHom_surjective (K := abstractFixedField k Ω K) (L := abstractRelativeFixedField k Ω hLK) (M := Ω) (E := Ω)) f - let σReal : Gal(Ω / abstractFixedField k Ω K) := + let σReal : Gal(Ω/abstractFixedField k Ω K) := AlgEquiv.ofBijective φ (Normal.toIsAlgebraic.algHom_bijective₂ φ (AlgHom.id (abstractFixedField k Ω K) Ω)).1 @@ -232,7 +232,6 @@ theorem relativeNorm_abstractFixedFieldUnit_eq_normUnits K L hLK (abstractRelativeFixedFieldUnitsEquivGaloisFixed k Ω K L hLK (Additive.ofMul x)) q) : Ωˣ) : Ω) = _ - change (Units.coeHom Ω) (∏ q : Q, Additive.toMul (relativeCosetAction (galoisAmbientUnitsRep k Ω) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean index 619d2b83cb..67442dc732 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean @@ -31,10 +31,10 @@ variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] [IsGalois K Ω] base field of the class formation. -/ theorem closedFixingSubgroup_bot_eq_baseField : closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω) = - baseField (Gal(Ω / K)) := by + baseField (Gal(Ω/K)) := by ext σ change σ ∈ (⊥ : IntermediateField K Ω).fixingSubgroup ↔ - σ ∈ (⊤ : Subgroup (Gal(Ω / K))) + σ ∈ (⊤ : Subgroup (Gal(Ω/K))) rw [IntermediateField.fixingSubgroup_bot] /-- The fixing subgroup of an intermediate field lies in the fixing subgroup @@ -78,7 +78,7 @@ ambient quotient by `Gal(Ω/E)`. -/ def baseFixingToAmbientQuotient (E : IntermediateField K Ω) [IsGalois K E] : (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup →* - Gal(Ω / K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := + Gal(Ω/K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := (QuotientGroup.mk' (closedFixingSubgroup K Ω E).toSubgroup).comp (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup.subtype @@ -121,7 +121,7 @@ def baseFixingExtensionQuotientEquivAmbient extensionSubgroup (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃* - Gal(Ω / K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := + Gal(Ω/K) ⧸ (closedFixingSubgroup K Ω E).toSubgroup := (QuotientGroup.quotientMulEquivOfEq (baseFixingToAmbientQuotient_ker K Ω E).symm).trans (QuotientGroup.quotientKerEquivOfSurjective @@ -146,8 +146,8 @@ def baseFixingExtensionQuotientEquivGaloisGroup extensionSubgroup (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃* - Gal(E / K) := by - let H : ClosedSubgroup (Gal(Ω / K)) := closedFixingSubgroup 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean index bd22aeb114..09e18b6837 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -155,10 +155,10 @@ private theorem towerRestrict_abstractAbelianization (z : Abelianization (finiteGaloisAbstractExtensionOfEmbedding K L iL).extensionQuotient) : AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L iL).abelianizationCongr z)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E (towerLowerEmbedding K E L iL)).abelianizationCongr (normResidueNaturalityAbelianizedRestriction @@ -186,10 +186,10 @@ private theorem towerRestrict_abstractAbelianization obtain ⟨sigma, rfl⟩ := QuotientGroup.mk_surjective q change AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm (qL.abelianizationCongr (Abelianization.of (QuotientGroup.mk sigma)))) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (normResidueNaturalityAbelianizedRestriction B B EE.field EL.field EE.below EL.below le_rfl @@ -199,7 +199,7 @@ private theorem towerRestrict_abstractAbelianization change AlgEquiv.restrictNormalHom E (qL (QuotientGroup.mk sigma)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (normResidueNaturalityAbelianizedRestriction B B EE.field EL.field EE.below EL.below le_rfl @@ -209,7 +209,7 @@ private theorem towerRestrict_abstractAbelianization change AlgEquiv.restrictNormalHom E (qL (QuotientGroup.mk sigma)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (Abelianization.of (QuotientGroup.mk (Subgroup.inclusion le_rfl sigma)))) @@ -236,10 +236,10 @@ theorem concreteNormResidueAutomorphism_restrict_tower (hcf : SatisfiesClassFieldAxiom (towerAbsoluteUnits K)) (a : Kˣ) : AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm (concreteNormResidueSymbolOfEmbedding K L iL D v hcf a)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (concreteNormResidueSymbolOfEmbedding K E (towerLowerEmbedding K E L iL) D v hcf a) := by let B := towerAbstractBase K @@ -329,25 +329,25 @@ theorem concreteNormResidueAutomorphism_restrict_tower K E (towerLowerEmbedding K E L iL) D v hcf a] change AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm (qL.abelianizationCongr (Additive.toMul zL))) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (Additive.toMul zE)) calc AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm (qL.abelianizationCongr (Additive.toMul zL))) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (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 + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (Additive.toMul zE)) := congrArg - (fun w => (Abelianization.equivOfComm (H := Gal(E / K))).symm + (fun w => (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr w)) hz /-- Pointwise restriction naturality for the canonical local Artin @@ -363,9 +363,9 @@ theorem localArtinAutomorphism_restrict_tower [IsAbelianGalois K E] [IsAbelianGalois K L] (a : Kˣ) : AlgEquiv.restrictNormalHom E - ((Abelianization.equivOfComm (H := Gal(L / K))).symm + ((Abelianization.equivOfComm (H := Gal(L/K))).symm (localArtinMonoidHom K L a)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (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, @@ -412,7 +412,7 @@ theorem restrictNormalHom_eq_autCongr intro x exact (e.symm.commutes x).symm) (AlgEquiv.restrictNormalHom M : - Gal(L / K) →* Gal(M / K)) = + Gal(L/K) →* Gal(M/K)) = (AlgEquiv.autCongr e).toMonoidHom := by let : Algebra M L := e.symm.toRingHom.toAlgebra let : IsScalarTower K M L := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean index 2a7feff0ea..45e72ae3f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean @@ -31,7 +31,7 @@ noncomputable section variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] -private abbrev G := Gal(SeparableClosure K / K) +private abbrev G := Gal(SeparableClosure K/K) private abbrev A : Rep ℤ (G K) := galoisAmbientUnitsRep K (SeparableClosure K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean index d537d35c48..b22a164ee3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -200,11 +200,11 @@ private theorem intermediateFieldRestrict_abstractAbelianization_of_mk [IsAbelianGalois K E] [IsAbelianGalois K F] (sigma : (abstractBase K).toSubgroup) : intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((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 + (Abelianization.equivOfComm (H := Gal(E/K))).symm ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val).abelianizationCongr (normResidueNaturalityAbelianizedRestriction @@ -232,7 +232,7 @@ private theorem intermediateFieldRestrict_abstractAbelianization_of_mk (embeddedAbstractExtension_field_le K E F hEF) sigma calc intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((Abelianization.equivOfComm (H := Gal(F/K))).symm (qF.abelianizationCongr (Abelianization.of (QuotientGroup.mk sigma)))) = intermediateFieldRestrictNormalHom E F hEF @@ -242,13 +242,13 @@ private theorem intermediateFieldRestrict_abstractAbelianization_of_mk 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 + _ = (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 + _ = (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (normResidueNaturalityAbelianizedRestriction B B EE.field EF.field EE.below EF.below le_rfl @@ -256,7 +256,7 @@ private theorem intermediateFieldRestrict_abstractAbelianization_of_mk (Abelianization.of (QuotientGroup.mk sigma)))) := congrArg (fun w => (Abelianization.equivOfComm - (H := Gal(E / K))).symm (qE.abelianizationCongr w)) + (H := Gal(E/K))).symm (qE.abelianizationCongr w)) hrestriction.symm omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in @@ -267,10 +267,10 @@ private theorem intermediateFieldRestrict_abstractAbelianization (z : Abelianization (finiteGaloisAbstractExtensionOfEmbedding K F F.val).extensionQuotient) : intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((Abelianization.equivOfComm (H := Gal(F/K))).symm ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K F F.val).abelianizationCongr z)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm ((finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K E E.val).abelianizationCongr (normResidueNaturalityAbelianizedRestriction (abstractBase K) (abstractBase K) @@ -298,10 +298,10 @@ theorem concreteNormResidueAutomorphism_restrict (v : ValuationData D (absoluteUnits K)) (hcf : SatisfiesClassFieldAxiom (absoluteUnits K)) (a : Kˣ) : intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((Abelianization.equivOfComm (H := Gal(F/K))).symm (concreteNormResidueSymbolOfEmbedding K F F.val D v hcf a)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (concreteNormResidueSymbolOfEmbedding K E E.val D v hcf a) := by let B := abstractBase K @@ -385,26 +385,26 @@ theorem concreteNormResidueAutomorphism_restrict concreteNormResidueSymbolOfEmbedding_eq_abstract K E E.val D v hcf a] change intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((Abelianization.equivOfComm (H := Gal(F/K))).symm (qF.abelianizationCongr (Additive.toMul zF))) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (Abelianization.equivOfComm (H := Gal(E/K))).symm (qE.abelianizationCongr (Additive.toMul zE)) calc intermediateFieldRestrictNormalHom E F hEF - ((Abelianization.equivOfComm (H := Gal(F / K))).symm + ((Abelianization.equivOfComm (H := Gal(F/K))).symm (qF.abelianizationCongr (Additive.toMul zF))) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (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 + _ = (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 + (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. -/ @@ -413,9 +413,9 @@ theorem localArtinAutomorphism_restrict [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 + ((Abelianization.equivOfComm (H := Gal(F/K))).symm (localArtinMonoidHom K F a)) = - (Abelianization.equivOfComm (H := Gal(E / K))).symm + (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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean index a1c749e39b..de91dfcc97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean @@ -24,7 +24,7 @@ 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) + Gal(SeparableClosure F/F) /-- The integral representation of the intrinsic absolute Galois group on the units of the chosen separable closure. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean index a3ce963b76..e85754fc6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean @@ -57,18 +57,17 @@ private theorem galoisAmbientUnits_satisfiesClassFieldAxiom k Ω K L hLK hKfinite hfinite let : IsGalois F E := abstractRelativeFixedField_isGalois k Ω K L hLK hnormal - let eQ : Q ≃* Gal(E / F) := + 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' := + 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)) := + let : IsCyclic (Gal(E/F)) := CyclicCohomology.isCyclic_of_generator g' hg' - let : CommGroup (Gal(E / F)) := IsCyclic.commGroup + let : CommGroup (Gal(E/F)) := IsCyclic.commGroup let M := extensionFixedRepresentation (galoisAmbientUnitsRep k Ω) K L hLK hnormal let U := Rep.ofAlgebraAutOnUnits F E diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean index b19a000420..17844f604c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean @@ -9,6 +9,11 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom /-! # Local Henselian Valuation -/ + +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + namespace LocalClassFieldTheory open ClassFormation LocalFieldTheory @@ -46,7 +51,6 @@ noncomputable def localHenselianValuation 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 @@ -58,7 +62,6 @@ noncomputable def localHenselianValuation 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 @@ -85,7 +88,6 @@ noncomputable def localHenselianValuation { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - let : (ValuativeRel.valuation K).HasExtension (ValuativeRel.valuation E) := by apply Valuation.HasExtension.ofComapInteger @@ -97,7 +99,6 @@ noncomputable def localHenselianValuation 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 @@ -142,7 +143,6 @@ noncomputable def localHenselianValuation 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 @@ -151,14 +151,13 @@ noncomputable def localHenselianValuation let hIntegralClosure : IsIntegralClosure (ValuativeRel.valuation E).valuationSubring (ValuativeRel.valuation K).valuationSubring E := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index 2bfc7dd775..33cffbab94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -10,6 +10,19 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation. import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF /-! # Local Residue Datum -/ + +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 @@ -79,7 +92,7 @@ private theorem localAbsoluteValuationSubring_pullback (x : K) : private noncomputable instance localAbsoluteValuationHasExtension : (localCompleteDVF K).valuation.HasExtension (localAbsoluteValuationSubring K).valuation := - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback (localCompleteDVF K).valuation (localAbsoluteValuationSubring K) (localAbsoluteValuationSubring_pullback K) @@ -107,7 +120,7 @@ theorem localSeparableValuationSubring_pullback (x : K) : noncomputable instance localSeparableValuationHasExtension : (localCompleteDVF K).valuation.HasExtension (localSeparableValuationSubring K).valuation := - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback (localCompleteDVF K).valuation (localSeparableValuationSubring K) (localSeparableValuationSubring_pullback K) @@ -126,7 +139,7 @@ theorem localSeparableValuationSubring_eq_of_hasExtension (Algebra.IsIntegral.isIntegral z) let : Algebra.IsSeparable K E := inferInstance obtain ⟨target, hExt, _hIntegralClosure, _hFundamental⟩ := - ValuationTheory.DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + exists_integralClosure_standard_fundamental_identity (K := K) (L := E) (localCompleteDVF K) let : (localCompleteDVF K).valuation.HasExtension target.valuation := hExt let : IsScalarTower (localCompleteDVF K).valuationSubring @@ -142,10 +155,10 @@ theorem localSeparableValuationSubring_eq_of_hasExtension RamificationTheory.ValuationSubring.restrictIntermediateField_hasExtension (localCompleteDVF K).valuation B E have hA : target.valuation.valuationSubring = Ares := - ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + target_valuationSubring_eq_of_finite_separable (localCompleteDVF K) target Ares have hB : target.valuation.valuationSubring = Bres := - ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + target_valuationSubring_eq_of_finite_separable (localCompleteDVF K) target Bres have hAB : Ares = Bres := hA.symm.trans hB let zE : E := @@ -375,7 +388,7 @@ private theorem localSeparableResidueAlgAction_continuous : /-- The continuous residue action on the chosen residue algebraic closure. -/ noncomputable def localSeparableResidueAlgAction : - Gal(SeparableClosure K / K) →ₜ* + Gal(SeparableClosure K/K) →ₜ* (selectedResidueField (localSeparableValuationSubring K) ≃ₐ[ decompositionResidueField K (localSeparableValuationSubring K)] selectedResidueField (localSeparableValuationSubring K)) where @@ -396,7 +409,7 @@ theorem localSeparableResidueAlgAction_surjective : defined directly on the separable-closure model used by the local reciprocity formalization. -/ noncomputable def localResidueDegree : - Gal(SeparableClosure K / K) →ₜ* ZHatMul where + Gal(SeparableClosure K/K) →ₜ* ZHatMul where toMonoidHom := (residueAbsoluteDegreeIn (decompositionResidueField K (localSeparableValuationSubring K)) @@ -431,7 +444,7 @@ theorem localResidueDegree_surjective : /-- **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 + DegreeData (Gal(SeparableClosure K/K)) where degree := localResidueDegree K degree_surjective := localResidueDegree_surjective K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean index 9c1bb0e56b..607af68f53 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean @@ -37,7 +37,7 @@ isomorphism 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 := + Abelianization (Gal(L/K)) ≃* NormQuotient K L := concreteReciprocityEquiv K L (localResidueDatum K) (localHenselianValuation K) @@ -63,7 +63,7 @@ private theorem abelianizationEquivNormQuotient_eq_of_embedding /-- 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)) := + Kˣ →* Abelianization (Gal(L/K)) := (abelianizationEquivNormQuotient K L).symm.toMonoidHom.comp (normClass K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean index 62db5a656d..09862e2b79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean @@ -29,14 +29,14 @@ variable (K L : Type) [Field K] [Field L] [Algebra 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 + 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 + (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 @@ -50,7 +50,7 @@ theorem abelianLocalArtinMonoidHom_ker : MonoidHom.coe_comp, Function.comp_apply] constructor · intro ha - apply (Abelianization.equivOfComm (H := Gal(L / K))).symm.injective + apply (Abelianization.equivOfComm (H := Gal(L/K))).symm.injective simpa using ha · intro ha rw [ha, map_one] @@ -58,12 +58,12 @@ theorem abelianLocalArtinMonoidHom_ker : /-- 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)) := + 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) := + let e : TopologicalAbelianization Gal(L/K) ≃* Gal(L/K) := (topologicalAbelianizationFiniteEquiv K L).symm.trans - (Abelianization.equivOfComm (H := Gal(L / K))).symm + (Abelianization.equivOfComm (H := Gal(L/K))).symm exact { e with continuous_toFun := continuous_of_discreteTopology @@ -72,7 +72,7 @@ noncomputable def topologicalAbelianizationEquivSelf : /-- The continuous local Artin map with values in the actual Galois group of a finite abelian extension. -/ noncomputable def abelianLocalArtinMap : - Kˣ →ₜ* Gal(L / K) := + Kˣ →ₜ* Gal(L/K) := (ContinuousMonoidHom.toContinuousMonoidHom (topologicalAbelianizationEquivSelf K L)).comp (localArtinMap K L) @@ -83,10 +83,10 @@ theorem abelianLocalArtinMap_toMonoidHom : (abelianLocalArtinMap K L).toMonoidHom = abelianLocalArtinMonoidHom K L := by change - ((Abelianization.equivOfComm (H := Gal(L / K))).symm).toMonoidHom.comp + ((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 + ((Abelianization.equivOfComm (H := Gal(L/K))).symm).toMonoidHom.comp (localArtinMonoidHom K L) rw [localArtinMap_toMonoidHom K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean index 321f707c49..7b19545be6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean @@ -30,7 +30,7 @@ noncomputable def intermediateFieldRestrictContinuous (E F : IntermediateField K (SeparableClosure K)) (hEF : E ≤ F) [FiniteDimensional K E] [FiniteDimensional K F] [IsGalois K E] [IsGalois K F] : - Gal(F / K) →ₜ* Gal(E / K) := + Gal(F/K) →ₜ* Gal(E/K) := { intermediateFieldRestrictNormalHom E F hEF with continuous_toFun := continuous_of_discreteTopology } diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean index 562943cba8..6b6c8ad59e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean @@ -58,9 +58,9 @@ noncomputable def semilinearGaloisGroupCongr (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') := + 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 @@ -73,8 +73,8 @@ noncomputable def semilinearGaloisGroupCongr 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) := + let unconjugate (τ : Gal(L'/K')) : + Gal(L/K) := AlgEquiv.ofRingEquiv (f := eL.trans (τ.toRingEquiv.trans eL.symm)) (fun x => by @@ -113,7 +113,7 @@ theorem semilinearGaloisGroupCongr_apply_equiv (hcomm : ∀ x : K, eL (algebraMap K L x) = algebraMap K' L' (eK x)) - (σ : Gal(L / K)) (x : L) : + (σ : 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) @@ -189,10 +189,10 @@ theorem abelianLocalArtinMonoidHom_semilinear_conjugation let conjugation := semilinearGaloisGroupCongr K K' L L' eK eL hcomm let restriction : - Gal(L' / K') →* Gal(L / K) := + Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) - have hrestriction (τ : Gal(L' / K')) : + have hrestriction (τ : Gal(L'/K')) : restriction τ = conjugation.symm τ := by apply AlgEquiv.ext intro x @@ -350,6 +350,6 @@ theorem abelianLocalArtinMonoidHom_semilinear_action (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 + 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 index d3aee8b633..95faabc006 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -176,7 +176,6 @@ 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 @@ -228,7 +227,6 @@ theorem relativeNorm_intermediateFieldUnit_val_of_isSeparable (x : Eˣ) : (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E) (intermediateFieldUnitsEquivGaloisFixed K Ω E (Additive.ofMul x)) q) : Ωˣ) : Ω) = _ - change (Units.coeHom Ω) (∏ q : Q, Additive.toMul (relativeCosetAction (galoisAmbientUnitsRep K Ω) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean index c35c6cf726..d577384cbc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -36,7 +36,6 @@ 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) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean index 8416ff287f..0680b1b174 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -159,11 +159,11 @@ theorem relativeNorm_intermediateFieldUnit_val (x : Eˣ) : (intermediateFieldUnitsEquivGaloisFixed K Ω E (Additive.ofMul x)) q) : Ωˣ) : Ω)) = _ calc - _ = ∏ σ : Gal(E / K), E.val (σ (x : E)) := by + _ = ∏ σ : 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))) + (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] @@ -353,7 +353,6 @@ noncomputable local instance embeddedFieldRangeIsGalois : 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) @@ -364,7 +363,6 @@ theorem normUnits_embeddedExtensionAlgEquiv (x : Lˣ) : (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 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean index f0f2d39802..5c111e0574 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -22,6 +22,11 @@ finite Galois extension is open. Consequently its quotient is discrete, as is the topological abelianization of the finite Krull Galois group. -/ +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + valuationSubring_isIntegralClosure_of_isIntegral → + valuationSubring_isIntegralClosure_of_isIntegral + + noncomputable section namespace LocalClassFieldTheory @@ -139,16 +144,15 @@ private theorem localNormSubgroup_isOpen_of_compatibleLocalField integerUnitNormSubgroup_isCompact K L have hclosed : IsClosed (integerUnitNormSubgroup K L : Set Kˣ) := hcompact.isClosed - - let : Finite (Gal(L / K)) := 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))) := + 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))) + (Abelianization (Gal(L/K))) (abelianizationEquivNormQuotient K L).toEquiv let : Finite (Kˣ ⧸ localNormSubgroup K L) := by change Finite (NormQuotient K L) @@ -157,7 +161,6 @@ private theorem localNormSubgroup_isOpen_of_compatibleLocalField Subgroup.finiteIndex_of_finite_quotient let : ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K)).FiniteIndex := inferInstance - have hrelativeClosed : IsClosed ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : @@ -180,7 +183,6 @@ private theorem localNormSubgroup_isOpen_of_compatibleLocalField exact ⟨hz, z.property⟩ · exact fun hz => hz.1] exact hpreimage - have hrelativeOpen : IsOpen ((localNormSubgroup K L).subgroupOf (localBaseUnitSubgroup K) : @@ -206,7 +208,6 @@ private theorem localNormSubgroup_isOpen_of_compatibleLocalField 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 @@ -233,7 +234,6 @@ theorem localNormSubgroup_isOpen 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 @@ -260,7 +260,6 @@ theorem localNormSubgroup_isOpen { toIsValuativeTopology := inferInstance toLocallyCompactSpace := inferInstance toIsNontrivial := inferInstance } - let : (ValuativeRel.valuation K).HasExtension (ValuativeRel.valuation L) := by apply Valuation.HasExtension.ofComapInteger @@ -272,7 +271,6 @@ theorem localNormSubgroup_isOpen 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 @@ -315,7 +313,6 @@ theorem localNormSubgroup_isOpen 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 @@ -324,14 +321,13 @@ theorem localNormSubgroup_isOpen let hIntegralClosure : IsIntegralClosure (ValuativeRel.valuation L).valuationSubring (ValuativeRel.valuation K).valuationSubring L := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + 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. -/ @@ -365,20 +361,20 @@ private theorem commutator_topologicalClosure_eq /-- 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 - let h : Subgroup.topologicalClosure (commutator (Gal(L / K))) = - commutator (Gal(L / K)) := - commutator_topologicalClosure_eq (Gal(L / K)) + Abelianization (Gal(L/K)) ≃* TopologicalAbelianization (Gal(L/K)) := by + let h : Subgroup.topologicalClosure (commutator (Gal(L/K))) = + commutator (Gal(L/K)) := + commutator_topologicalClosure_eq (Gal(L/K)) exact QuotientGroup.quotientMulEquivOfEq h.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 + NormQuotient K L ≃ₜ* TopologicalAbelianization (Gal(L/K)) := by letI : DiscreteTopology (NormQuotient K L) := normQuotient_discrete K L - letI : DiscreteTopology (TopologicalAbelianization (Gal(L / K))) := + letI : DiscreteTopology (TopologicalAbelianization (Gal(L/K))) := QuotientGroup.discreteTopology (isOpen_discrete _) - let e : NormQuotient K L ≃* TopologicalAbelianization (Gal(L / K)) := + let e : NormQuotient K L ≃* TopologicalAbelianization (Gal(L/K)) := (abelianizationEquivNormQuotient K L).symm.trans (topologicalAbelianizationFiniteEquiv K L) exact @@ -403,7 +399,7 @@ noncomputable def normClassContinuous : /-- The continuous finite local Artin map. -/ noncomputable def localArtinMap : - Kˣ →ₜ* TopologicalAbelianization (Gal(L / K)) := + Kˣ →ₜ* TopologicalAbelianization (Gal(L/K)) := (ContinuousMonoidHom.toContinuousMonoidHom (localReciprocityEquiv K L)).comp (normClassContinuous K L) @@ -466,7 +462,7 @@ theorem localArtinMap_ker : local Artin map. -/ noncomputable def localArtinMapQuotientKerEquiv : Kˣ ⧸ (localArtinMap K L).toMonoidHom.ker ≃* - TopologicalAbelianization (Gal(L / K)) := + TopologicalAbelianization (Gal(L/K)) := QuotientGroup.quotientKerEquivOfSurjective (localArtinMap K L).toMonoidHom (localArtinMap_surjective K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index b5f0cfa152..d5aa1bad64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -17,6 +17,19 @@ closure with the ordinary unramified valuation extension and its arithmetic Frobenius. -/ +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 @@ -161,7 +174,7 @@ theorem localSeparableValuationSubring_comap_embedding let C := (ValuativeRel.valuation L).valuationSubring have hBext : (localCompleteDVF K).valuation.HasExtension B.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change i (algebraMap K L x) ∈ A ↔ x ∈ (localCompleteDVF K).valuation.valuationSubring @@ -169,7 +182,7 @@ theorem localSeparableValuationSubring_comap_embedding exact localSeparableValuationSubring_pullback K x have hCext : (localCompleteDVF K).valuation.HasExtension C.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change ValuativeRel.valuation L (algebraMap K L x) ≤ 1 ↔ (localCompleteDVF K).valuation x ≤ 1 @@ -177,17 +190,17 @@ theorem localSeparableValuationSubring_comap_embedding (ValuativeRel.valuation K) (ValuativeRel.valuation L)] rfl obtain ⟨target, htarget, _hintegral, _hFundamental⟩ := - ValuationTheory.DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + 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 := - ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + target_valuationSubring_eq_of_finite_separable (localCompleteDVF K) target B have hC : target.valuation.valuationSubring = C := - ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_eq_of_finite_separable + target_valuationSubring_eq_of_finite_separable (localCompleteDVF K) target C exact hB.symm.trans hC @@ -241,7 +254,7 @@ theorem finiteGaloisResidueEmbeddingOfEmbedding_equivariant localSeparableResidueAlgAction K τ.1 (finiteGaloisResidueEmbeddingOfEmbedding K L i x) := by let A := localSeparableValuationSubring K - let σ : Gal(L / K) := + let σ : Gal(L/K) := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i (QuotientGroup.mk τ) obtain ⟨a, rfl⟩ := IsLocalRing.residue_surjective x @@ -300,7 +313,7 @@ theorem finiteGaloisAbstractExtensionOfEmbedding_isUnramified : let k := decompositionResidueField K A let Omega := selectedResidueField A let τ : (abstractBase K).toSubgroup := ⟨g, hg.1⟩ - let q : Gal(L / K) := + let q : Gal(L/K) := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i (QuotientGroup.mk τ) have hdegree : localResidueDegree K g = 1 := hg.2 @@ -373,7 +386,7 @@ theorem finiteGaloisAbstractUnramifiedFrobenius_eq_arithmeticFrobenius : (finiteGaloisAbstractExtensionOfEmbedding K L i).below) = arithmeticFrobeniusOfUnramifiedValuation K L := by let phi := abstractBaseFrobeniusLift K - let q : Gal(L / K) := + let q : Gal(L/K) := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding K L i (QuotientGroup.mk phi) have hselected : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean index 7c939532d4..04edc532bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -90,12 +90,12 @@ theorem normQuotientToUnramifiedNormQuotient_surjective : /-- 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)) := + 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)) + 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] @@ -107,19 +107,19 @@ theorem galoisGroupEquivAbelianizationOfUnramifiedValuation_apply noncomputable local instance unramifiedNormComparisonNormQuotientFinite : Finite (NormQuotient K L) := - Finite.of_equiv (Gal(L / K)) + 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))) := + 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 (Abelianization (Gal(L/K))) := Nat.card_congr (abelianizationEquivNormQuotient K L).symm.toEquiv - _ = Nat.card (Gal(L / K)) := + _ = Nat.card (Gal(L/K)) := (Nat.card_congr (galoisGroupEquivAbelianizationOfUnramifiedValuation K L).toEquiv).symm _ = Module.finrank K L := @@ -131,7 +131,7 @@ theorem normQuotientToUnramifiedNormQuotient_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)) + Finite.of_equiv (Gal(L/K)) ((galoisGroupEquivAbelianizationOfUnramifiedValuation K L).trans (abelianizationEquivNormQuotient K L)).toEquiv have hcard : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean index 2659f0aa73..c70ec2fc3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -493,10 +493,10 @@ theorem abelianLocalArtinMonoidHom_eq_frobenius_zpow (x : Kˣ) : rw [localArtinMonoidHom_eq_frobenius_zpow K L x, map_zpow] exact congrArg - (fun σ : Gal(L / K) => + (fun σ : Gal(L/K) => σ ^ LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul x)) - ((Abelianization.equivOfComm (H := Gal(L / K))).symm_apply_apply + ((Abelianization.equivOfComm (H := Gal(L/K))).symm_apply_apply (arithmeticFrobeniusOfUnramifiedValuation K L)) end AbelianUnramifiedPrimeClass @@ -573,7 +573,7 @@ theorem finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow (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 σ : Gal(L/K) := LocalClassFieldTheory.abelianLocalArtinMap K L π let z : 𝒪[L] := LocalFieldTheory.galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x refine ⟨z, ?_, ?_⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean index b0263a0914..ee33939e84 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean @@ -34,7 +34,7 @@ noncomputable def unramifiedLocalReciprocityIsoToGaloisGroup [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [IsUnramifiedValuedExtension K L] : - NormQuotient K L ≃* Gal(L / K) := + NormQuotient K L ≃* Gal(L/K) := (normQuotientUnramifiedValuationEquivZModOfIsIntegralClosure K L).trans (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm @@ -62,7 +62,7 @@ theorem unramifiedLocalReciprocityIsoToGaloisGroup_inverseIntegerRingUniformizer rw [LocalClassFieldTheory.valuationModDegreeMulHom_apply, LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply, v_inverseIntegerRingUniformizerFieldUnit] - simp + simp only [Int.cast_one] rw [← galoisGroupEquivZModOfUnramifiedValuationNormalized_arithmeticFrobenius K L] exact (galoisGroupEquivZModOfUnramifiedValuationNormalized K L).symm_apply_apply _ @@ -123,7 +123,7 @@ noncomputable def unramifiedLocalReciprocityIso [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [IsUnramifiedValuedExtension K L] : - NormQuotient K L ≃* Abelianization (Gal(L / K)) := + NormQuotient K L ≃* Abelianization (Gal(L/K)) := (unramifiedLocalReciprocityIsoToGaloisGroup K L).trans (galoisGroupEquivAbelianizationOfUnramifiedValuation K L) @@ -203,7 +203,7 @@ noncomputable def unramifiedLocalArtinMap [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [IsUnramifiedValuedExtension K L] : - Kˣ →* Abelianization (Gal(L / K)) := + Kˣ →* Abelianization (Gal(L/K)) := (unramifiedLocalReciprocityIso K L).toMonoidHom.comp (normClass K L) /-- States the theorem `unramifiedLocalArtinMap_apply`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean index 68094a90df..b587975bd1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean @@ -13,6 +13,11 @@ Henselian uniqueness then identifies the selected valuation rings on the separable closures; no equality of the extension valuations is assumed. -/ +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + hasExtension_valuation_of_valuationSubring_pullback → + hasExtension_valuation_of_valuationSubring_pullback + + noncomputable section namespace ClassFieldTower.Martinet.Shafarevich @@ -36,7 +41,7 @@ theorem localSeparableValuationSubring_comap_semilinear let B := (localSeparableValuationSubring K').comap e.toRingHom let _ : (localCompleteDVF K).valuation.HasExtension B.valuation := by apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x change e (algebraMap K (SeparableClosure K) x) ∈ localSeparableValuationSubring K' ↔ x ∈ (localCompleteDVF K).valuation.valuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index 7c10a71502..5d6d21bdcb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -40,7 +40,7 @@ def galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure [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 + MulDistribMulAction Gal(L/K) (principalUnits L n) where smul sigma a := galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n sigma a one_smul := by intro a @@ -97,10 +97,10 @@ private theorem principalUnitsIntegerUnits_shortExact letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n - (∀ (sigma : Gal(L / K)) (a : principalUnits 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]ˣ), + (∀ (sigma : Gal(L/K)) (a : 𝒪[L]ˣ), integerUnitsPrincipalUnitsQuotientMap L n (sigma • a) = sigma • integerUnitsPrincipalUnitsQuotientMap L n a) ∧ (∀ a : 𝒪[L]ˣ, integerUnitsPrincipalUnitsQuotientMap L n a = 1 ↔ @@ -139,10 +139,10 @@ private theorem exists_integerUnit_map_eq_of_galoisGroup_fixed [IsIntegralClosure 𝒪[L] 𝒪[K] L] (a : 𝒪[L]ˣ) (ha : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - ∀ sigma : Gal(L / K), sigma • a = a) : + ∀ 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), + 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) @@ -193,10 +193,10 @@ private theorem integerUnits_herbrandQuotient_eq_one [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) : + (g : Gal(L/K)) (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - ∃ hU : HerbrandQuotientDefined Gal(L / K) 𝒪[L]ˣ g, - @herbrandQuotient Gal(L / K) 𝒪[L]ˣ _ _ _ + ∃ hU : HerbrandQuotientDefined Gal(L/K) 𝒪[L]ˣ g, + @herbrandQuotient Gal(L/K) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g hU.1 hU.2 = 1 := by rcases exists_chosenNormalBasisPrincipalUnitSubgroup (K := K) (L := L) with @@ -248,17 +248,17 @@ private theorem unramified_integerUnits_herbrand_subsingleton [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) : + (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 + 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 + 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⟩ @@ -266,19 +266,19 @@ private theorem unramified_integerUnits_herbrand_subsingleton ⟨z, hz⟩ refine ⟨z, ?_⟩ calc - tateNorm Gal(L / K) 𝒪[L]ˣ z = - Finset.univ.prod (fun sigma : Gal(L / K) => + 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]ˣ) := + 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⟩ + 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`, @@ -293,11 +293,11 @@ private theorem unramified_principalUnits_herbrand_subsingleton [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) : + (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n - Subsingleton (HerbrandH0 Gal(L / K) (principalUnits L n)) ∧ + Subsingleton (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ Subsingleton - (HerbrandHMinusOne Gal(L / K) (principalUnits L n) g) := by + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) g) := by let := galoisGroupPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure @@ -306,45 +306,45 @@ private theorem unramified_principalUnits_herbrand_subsingleton ⟨hU, hUone⟩ let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n - let hQ : HerbrandQuotientDefined Gal(L / K) + let hQ : HerbrandQuotientDefined Gal(L/K) (IntegerUnitsModPrincipalUnitsAtLevel L n) g := ⟨inferInstance, inferInstance⟩ - have hQone : herbrandQuotient (G := Gal(L / K)) + 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 := + 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]ˣ) + (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) + 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) + 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) + 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)) + 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]ˣ) + (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 + 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), + have haUnits : ∀ sigma : Gal(L/K), letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L sigma • ((a : principalUnits L n) : 𝒪[L]ˣ) = ((a : principalUnits L n) : 𝒪[L]ˣ) := by @@ -363,8 +363,8 @@ private theorem unramified_principalUnits_herbrand_subsingleton exact hb refine ⟨z, ?_⟩ calc - tateNorm Gal(L / K) (principalUnits L n) z = - Finset.univ.prod (fun sigma : Gal(L / K) => + 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 @@ -376,11 +376,11 @@ private theorem unramified_principalUnits_herbrand_subsingleton _ = principalUnitsMapOfUnramifiedValuation K L n bP := by rw [hz] _ = a := hmap let : Subsingleton - (HerbrandH0 Gal(L / K) (principalUnits L n)) := + (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⟩ + 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. -/ @@ -393,15 +393,15 @@ theorem unramified_units_tateCohomology_and_norm_surjective_for_generator [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) : + (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)) ∧ + (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 (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ Subsingleton - (HerbrandHMinusOne Gal(L / K) (principalUnits L n) g)) ∧ + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) g)) ∧ MonoidHom.range (normIntegerUnits K L) = ⊤ ∧ ∀ n : Nat, 1 ≤ n → MonoidHom.range (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) = ⊤ := by @@ -430,13 +430,13 @@ theorem unramified_units_tateCohomology_and_norm_surjective [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)) ∧ + (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 (HerbrandH0 Gal(L/K) (principalUnits L n)) ∧ Subsingleton - (HerbrandHMinusOne Gal(L / K) (principalUnits L n) phi)) ∧ + (HerbrandHMinusOne Gal(L/K) (principalUnits L n) phi)) ∧ MonoidHom.range (normIntegerUnits K L) = ⊤ ∧ ∀ n : Nat, 1 ≤ n → MonoidHom.range (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n) = ⊤ := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean index 5aadafea31..97ed7f086b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -115,7 +115,7 @@ theorem norm_oneAdd_sub_galoisSum_mem_next (principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure K L n (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)) : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L]) - 1 - - (Finset.univ.sum fun σ : Gal(L / K) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ∈ (𝓂[L] ^ (n + 1) : Ideal 𝒪[L]) := by rw [principalUnitsMap_normOfUnramifiedValuationOfIsIntegralClosure_eq_normExtensionSide @@ -184,7 +184,7 @@ theorem principalUnitsSuccQuotMap_normOfUnramifiedValuationOfIsIntegralClosure_o [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) => + ⟨Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L]), by classical diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean index a37d8fa7b7..3fe8ce2d0f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -495,7 +495,6 @@ theorem principalUnitsNormOfUnramifiedValuationOfIsIntegralClosure_eq_of_error_m [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]ˣ)) ∈ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean index 66d7bf3ca9..8a9ea03c96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -43,7 +43,7 @@ theorem integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosur [IsIntegralClosure 𝒪[L] 𝒪[K] L] [LocalFieldTheory.ValuativeExtension K L] (u : 𝒪[L]ˣ) : integerUnitsMapOfValuationExtension K L (normIntegerUnits K L u) = - Finset.univ.prod (fun σ : Gal(L / K) => + Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) := by ext @@ -53,7 +53,7 @@ theorem integerUnitsMap_normIntegerUnits_eq_galoisGroup_prod_of_isIntegralClosur 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) => + (((Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) : 𝒪[L]ˣ) : 𝒪[L]) : L) @@ -69,12 +69,12 @@ theorem galoisGroup_prod_mem_principalUnits_of_isIntegralClosure (K L : Type u) [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) => + 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) => + (f := fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).toMulEquiv u) (fun σ _ => @@ -144,7 +144,7 @@ theorem principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod [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) => + Finset.univ.prod (fun σ : Gal(L/K) => galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u) := by apply Subtype.ext simpa [principalUnitsNormExtensionSideOfIsIntegralClosure_apply, @@ -165,7 +165,7 @@ theorem (((principalUnitsNormExtensionSideOfIsIntegralClosure K L n (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2) : principalUnits L n) : 𝒪[L]ˣ) : 𝒪[L]) - 1 - - (Finset.univ.sum fun σ : Gal(L / K) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ∈ (𝓂[L] ^ (n + 1) : Ideal 𝒪[L]) := by classical @@ -226,20 +226,20 @@ theorem principalUnitsSuccQuotNormExtensionSideOfIsIntegralClosure_eq_galoisGrou [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) => + 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) => + (Finset.univ.prod (fun σ : Gal(L/K) => galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ u)) = - Finset.univ.prod (fun σ : Gal(L / K) => + 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) => + (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 index 4b980c7274..eb711ff882 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -50,7 +50,7 @@ theorem quotientNorm_oneAdd_uniformizerPow_eq_trace classical intro πL hπL a let b : (𝓂[L] ^ n : Ideal 𝒪[L]) := - ⟨Finset.univ.sum fun σ : Gal(L / K) => + ⟨Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L]), by exact Ideal.sum_mem _ fun σ _ => @@ -85,23 +85,23 @@ theorem quotientNorm_oneAdd_uniformizerPow_eq_trace congr 1 have hb_eq : (b : 𝒪[L]) = - (Finset.univ.sum fun σ : Gal(L / K) => + (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) => + (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) => + (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) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) : (𝓂[L] ^ n : Ideal 𝒪[L])) : 𝒪[L]) := by rw [maximalIdealPowMulUniformizerPowMap_apply]] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean index 18d0f019dd..5822438247 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -74,7 +74,7 @@ theorem residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_prod_of_isIntegr (u : 𝒪[L]ˣ) : residueUnitsMapOfValuationExtension K L (integerUnitsToResidueUnits K (normIntegerUnits K L u)) = - Finset.univ.prod (fun σ : Gal(L / K) => + Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupResidueFieldEquivOfIsIntegralClosure K L σ).toMulEquiv (integerUnitsToResidueUnits L u)) := by @@ -99,7 +99,7 @@ theorem residueUnitsMap_normIntegerUnits_eq_galoisGroup_residue_algEquiv_prod_of (u : 𝒪[L]ˣ) : residueUnitsMapOfValuationExtension K L (integerUnitsToResidueUnits K (normIntegerUnits K L u)) = - Finset.univ.prod (fun σ : Gal(L / K) => + Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv (integerUnitsToResidueUnits L u)) := by @@ -125,7 +125,7 @@ theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_alg residueUnitsMapOfValuationExtension K L (integerUnitsModPrincipalUnitsEquivResidueUnits K (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L x)) = - Finset.univ.prod (fun σ : Gal(L / K) => + Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv (integerUnitsModPrincipalUnitsEquivResidueUnits L x)) := by @@ -134,7 +134,7 @@ theorem integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_residue_alg residueUnitsMapOfValuationExtension K L (integerUnitsModPrincipalUnitsEquivResidueUnits K (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L x)) = - Finset.univ.prod (fun σ : Gal(L / K) => + Finset.univ.prod (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv (integerUnitsModPrincipalUnitsEquivResidueUnits L x))) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean index 881a3d2a59..12119e6edd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -35,8 +35,8 @@ private theorem normQuotientFiniteOfIsAbelianGalois [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 + 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 @@ -119,16 +119,16 @@ theorem card_normQuotient_eq_finrank_of_isAbelianGalois 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 + 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 (Abelianization Gal(L/K)) := Nat.card_congr (abelianizationEquivNormQuotient K L).toEquiv.symm - _ = Nat.card Gal(L / K) := + _ = Nat.card Gal(L/K) := Nat.card_congr (Abelianization.equivOfComm - (H := Gal(L / K))).toEquiv.symm + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean index 0bb002a83a..ad368e41f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -149,7 +149,7 @@ isomorphism theorem and infinite Galois correspondence. -/ noncomputable def absoluteFiniteQuotientMulEquiv (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : localAbsoluteAbelianProfinite K ⧸ N.toSubgroup ≃* - Gal(absoluteFiniteQuotientField K N / K) := + Gal(absoluteFiniteQuotientField K N/K) := (QuotientGroup.quotientMulEquivOfEq (finiteQuotientPreimage_map_eq K N).symm).trans ((QuotientGroup.quotientQuotientEquivQuotient @@ -163,7 +163,7 @@ noncomputable def absoluteFiniteQuotientMulEquiv noncomputable def absoluteFiniteQuotientEquiv (N : OpenNormalSubgroup (localAbsoluteAbelianProfinite K)) : localAbsoluteAbelianProfinite K ⧸ N.toSubgroup ≃ₜ* - Gal(absoluteFiniteQuotientField K N / K) := by + Gal(absoluteFiniteQuotientField K N/K) := by letI : DiscreteTopology (localAbsoluteAbelianProfinite K ⧸ N.toSubgroup) := QuotientGroup.discreteTopology N.isOpen' diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean index 91cba2c2c1..dfdf463ff0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean @@ -44,7 +44,7 @@ instance localMaximalAbelianExtension_isGalois : /-- Compatibility name for the underlying multiplicative equivalence. -/ noncomputable abbrev localAbsoluteAbelianizationMulEquiv : TopologicalAbelianization (intrinsicAbsoluteGalois K) ≃* - Gal(localMaximalAbelianExtension K / K) := + Gal(localMaximalAbelianExtension K/K) := absoluteAbelianizationMulEquivMaximalAbelianGalois K /-- The compatibility equivalence sends a quotient class to restriction. -/ @@ -63,7 +63,7 @@ theorem localAbsoluteAbelianizationMulEquiv_continuous : /-- Compatibility name for the canonical topological equivalence. -/ noncomputable abbrev localAbsoluteAbelianizationEquiv : TopologicalAbelianization (intrinsicAbsoluteGalois K) ≃ₜ* - Gal(localMaximalAbelianExtension K / K) := + Gal(localMaximalAbelianExtension K/K) := absoluteTopologicalAbelianizationEquivMaximalAbelianGalois K /-- Compatibility instance for total disconnectedness. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean index d44bf2c7ed..8b008efe83 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean @@ -35,8 +35,8 @@ 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) := + 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 @@ -47,7 +47,7 @@ noncomputable def absoluteAbelianRestriction (commutator (intrinsicAbsoluteGalois K)).topologicalClosure ≤ r.ker := (commutator (intrinsicAbsoluteGalois K)).topologicalClosure_minimal hcomm hkerClosed - let q : localAbsoluteAbelianProfinite K →* Gal(E / K) := + let q : localAbsoluteAbelianProfinite K →* Gal(E/K) := QuotientGroup.lift (commutator (intrinsicAbsoluteGalois K)).topologicalClosure r (fun σ hσ ↦ MonoidHom.mem_ker.mp (hclosure hσ)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean index d62c30b833..58c39b5920 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -71,7 +71,7 @@ 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)) + (Gal(absoluteFiniteQuotientField K N/K)) map {N M} f := ProfiniteGrp.ofHom <| intermediateFieldRestrictContinuous K (absoluteFiniteQuotientField K M) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean index 5316eaf752..c538f6609e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -64,7 +64,7 @@ noncomputable instance standardLocalAbsoluteAbelianization_compactSpace : noncomputable instance standardLocalAbsoluteAbelianization_t2Space : T2Space (_root_.Field.absoluteGaloisGroupAbelianization K) := by - have htarget : T2Space Gal(localMaximalAbelianExtension K / K) := + have htarget : T2Space Gal(localMaximalAbelianExtension K/K) := krullTopology_t2 have hsource : T2Space (TopologicalAbelianization (intrinsicAbsoluteGalois K)) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean index e3796b9de1..b71bb57463 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean @@ -121,9 +121,9 @@ theorem maximalLocalKummerPairingRightHom_eq_localHilbertSymbolHom let betaE : Eˣ := chosenSimpleKummerRootUnit K n hnK b let betaF : Fˣ := Units.map (IntermediateField.inclusion hEF).toMonoidHom betaE - let sigmaF : Gal(F / K) := + let sigmaF : Gal(F/K) := maximalLocalKummerNormResidueAutomorphism K n hnK hmu a - let sigmaE : Gal(E / K) := + let sigmaE : Gal(E/K) := chosenSimpleKummerNormResidueAutomorphism K n hnK hmu b a let : FiniteDimensional K E := chosenSimpleKummerExtension_finiteDimensional K n hnK b diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 8c48b1b393..2898a9650c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -70,7 +70,7 @@ theorem localHilbertSymbol_left_kernel (K := K) (Omega := SeparableClosure K) n hmu Delta.1 constructor · intro h - let sigma : Gal(E / K) := + let sigma : Gal(E/K) := maximalLocalKummerNormResidueAutomorphism K n hnK hmu a have hsigma : sigma = 1 := by apply diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean index d376d4d5d7..df7e3f84b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -218,7 +218,7 @@ theorem residue_arithmeticFrobenius_integerUnitQuotient (residueUnitsConcreteEquiv L (integerUnitsToResidueUnits L u)) ^ (Nat.card 𝓀[K] - 1) := by let : Fintype 𝓀[K] := Fintype.ofFinite _ - let phi : Gal(L / K) := + let phi : Gal(L/K) := arithmeticFrobeniusOfUnramifiedValuation K L let uBar : 𝓀[L]ˣ := residueUnitsConcreteEquiv L (integerUnitsToResidueUnits L u) @@ -571,10 +571,10 @@ theorem nthRootsSubgroupMap_localTamePowerResidueSymbol_eq_arithmeticFrobenius_r rootQuotient (K := K) (L := L) beta (arithmeticFrobeniusOfUnramifiedValuation K L) := by let : Fintype 𝓀[K] := Fintype.ofFinite _ - let phi : Gal(L / K) := + let phi : Gal(L/K) := arithmeticFrobeniusOfUnramifiedValuation K L have hbetaPowFixed : - ∀ sigma : Gal(L / K), sigma • (beta ^ (n : ℕ)) = beta ^ (n : ℕ) := by + ∀ sigma : Gal(L/K), sigma • (beta ^ (n : ℕ)) = beta ^ (n : ℕ) := by intro sigma rw [hbetaPow] exact RadicalDatum.smul_algebraMap_unit diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean index b330cb26e6..1eed6f2498 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean @@ -107,7 +107,7 @@ theorem let e : E ≃ₐ[K] M := equalCharacteristicTransportedLubinTateFixedFieldEquiv K p ϖ hϖ m - let q : Gal(E / K) ≃* Gal(M / K) := + let q : Gal(E/K) ≃* Gal(M/K) := AlgEquiv.autCongr e have hArtin : Subgroup.map q.toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean index 3a1efc2b72..8bca2d78b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean @@ -56,7 +56,7 @@ noncomputable def letI : Algebra K L := equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ n - Gal(L / K) →* Gal(E / K) := by + Gal(L/K) →* Gal(E/K) := by let F := equalCharacteristicTargetLocalField K let B := F.residueField⸨X⸩ letI hKq : CharP K F.residueCharacteristic := @@ -104,7 +104,7 @@ theorem letI : Algebra K L := equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ n - Gal(L / K)) + Gal(L/K)) (x : let F := equalCharacteristicTargetLocalField K letI : CharP K F.residueCharacteristic := @@ -175,7 +175,7 @@ theorem L.val (σ (IntermediateField.inclusion hEL x)) := by have h := congrArg - (fun τ : Gal(L / K) => + (fun τ : Gal(L/K) => L.val (τ (IntermediateField.inclusion hEL x))) (qL.apply_symm_apply σ) rw [equalCharacteristicTransportedLubinTateGaloisEquiv_apply] at h @@ -201,7 +201,7 @@ theorem let L := equalCharacteristicLubinTateLevelField F n letI : Algebra B L := equalCharacteristicLubinTateLevelAlgebra F n - Gal(L / B)) : + Gal(L/B)) : let F := equalCharacteristicTargetLocalField K let B := F.residueField⸨X⸩ letI : CharP K F.residueCharacteristic := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean index 4d5f67b860..9b1b617392 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -184,7 +184,7 @@ theorem let : IsAbelianGalois K L := equalCharacteristicTransportedLubinTateLevel_isAbelianGalois K p ϖ hϖ n - let φ : Kˣ →* Gal(L / K) := + let φ : Kˣ →* Gal(L/K) := abelianLocalArtinMonoidHom K L have hφ : Function.Surjective φ := by change Function.Surjective (abelianLocalArtinMonoidHom K L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean index ed87b37589..207ab0b477 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean @@ -165,7 +165,7 @@ noncomputable def equalCharacteristicTransportedLubinTateGaloisEquiv letI : Algebra K E := equalCharacteristicTransportedLubinTateLevelAlgebra K p ϖ hϖ n - Gal(E / B) ≃* Gal(E / K) := by + Gal(E/B) ≃* Gal(E/K) := by let F := equalCharacteristicTargetLocalField K let B := F.residueField⸨X⸩ letI : CharP K F.residueCharacteristic := @@ -197,7 +197,7 @@ theorem equalCharacteristicTransportedLubinTateGaloisEquiv_apply let E := equalCharacteristicLubinTateLevelField F n letI : Algebra B E := equalCharacteristicLubinTateLevelAlgebra F n - Gal(E / B)) + Gal(E/B)) (x : let F := equalCharacteristicTargetLocalField K letI : CharP K F.residueCharacteristic := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index 386a956bc7..9466420fdc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -664,9 +664,9 @@ theorem equalCharacteristicTransportedLubinTateLevel_isAbelianGalois equalCharacteristicTransportedLubinTateLevel_isGalois K p ϖ hϖ m let restrictToLaurent : - Gal(E / K) →* Gal(E / B) := - { toFun := fun (σ : Gal(E / K)) => - show Gal(E / B) from + 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] @@ -685,7 +685,7 @@ theorem equalCharacteristicTransportedLubinTateLevel_isAbelianGalois exact DFunLike.congr_fun hστ x refine { is_comm.comm := fun σ τ => hrestrict ?_ } exact - (inferInstance : IsMulCommutative (Gal(E / B))).is_comm.comm + (inferInstance : IsMulCommutative (Gal(E/B))).is_comm.comm (restrictToLaurent σ) (restrictToLaurent τ) /-- The actual norm subgroup of the transported level field. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean index 5a5e28d91c..7c0f2334f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -285,7 +285,7 @@ theorem padicCompletedChangedUniformizerRelativeArtinCandidate_apply, padicCompletedChangedUniformizerArtinCandidate_standardLevel] exact congrArg - (fun σ : Gal(T / ℚ_[p]) => + (fun σ : Gal(T/ℚ_[p]) => padicStandardLevelToCompletedChangedCompositum p u n (σ x)) (standardLubinTateUnitParameterEquivGal_apply (padicLocalField p) hπ n (standardLubinTateUnitParameterClass (padicLocalField p) n u)).symm @@ -563,7 +563,7 @@ theorem padicMultiplicativeAbelianLocalArtin_primitiveRoot (standardLubinTateUnitParameterClass F n u) := padicMultiplicativeAbelianLocalArtin_eq_unitParameter p n u exact - (congrArg (fun σ : Gal(T / ℚ_[p]) => + (congrArg (fun σ : Gal(T/ℚ_[p]) => σ (padicMultiplicativePrimitiveRoot p n)) hArtin).trans (padicMultiplicativePrimitiveRoot_unitParameterGaloisAction p n u) @@ -614,7 +614,7 @@ noncomputable def padicMultiplicativeArtinUnitParameterHom (p : ℕ) [Fact p.Prime] (n : ℕ) : standardLubinTateUnitParameter (padicLocalField p) n →* Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p]) := by + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p]) := by let F := padicLocalField p let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p let L := standardLubinTateLevelField hπ n @@ -698,7 +698,7 @@ noncomputable def padicMultiplicativeArtinUnitParameterEquiv (p : ℕ) [Fact p.Prime] (n : ℕ) : standardLubinTateUnitParameter (padicLocalField p) n ≃* Gal((standardLubinTateLevelField - (padicMultiplicativeLubinTateSeries_isUniformizer p) n) / ℚ_[p]) := by + (padicMultiplicativeLubinTateSeries_isUniformizer p) n)/ℚ_[p]) := by let F := padicLocalField p let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p let L := standardLubinTateLevelField hπ n @@ -980,7 +980,7 @@ theorem padicMultiplicativeAbelianLocalArtin_eq_unitParameter_of_mem_higherPrincipalUnitGroup p n u hu exact - (congrArg (fun σ : Gal(L / ℚ_[p]) => + (congrArg (fun σ : Gal(L/ℚ_[p]) => σ (padicMultiplicativePrimitiveRoot p n)) hArtin).trans (padicMultiplicativePrimitiveRoot_galoisAction p n u) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean index ef9cbc993c..1c84ba7217 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean @@ -282,9 +282,9 @@ theorem (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 + Nat.card (Gal(E/B)) = (q - 1) * q ^ m := by calc - Nat.card (Gal(E / B)) = + Nat.card (Gal(E/B)) = Module.finrank B E := by simpa [B, E] using equalCharacteristicLubinTateLevelField_natCard_gal F m @@ -292,9 +292,9 @@ theorem simpa [B, E, q] using equalCharacteristicLubinTateLevelField_finrank F m have hcardGalL : - Nat.card (Gal(L / B)) = (q - 1) * q ^ n := by + Nat.card (Gal(L/B)) = (q - 1) * q ^ n := by calc - Nat.card (Gal(L / B)) = + Nat.card (Gal(L/B)) = Module.finrank B L := by simpa [B, L] using equalCharacteristicLubinTateLevelField_natCard_gal F n diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean index 6197430318..0e76512623 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean @@ -80,7 +80,7 @@ theorem standardLubinTateFiniteAbelianSubextension_filteredLocalReciprocity finiteAbelianSubextension_fixedField_isAbelianGalois K T let e : E ≃ₐ[K] M := standardLubinTateFiniteAbelianSubextensionFixedFieldEquiv K m - let q : Gal(E / K) ≃* Gal(M / K) := + let q : Gal(E/K) ≃* Gal(M/K) := AlgEquiv.autCongr e have hArtin : Subgroup.map q.toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index df63129b57..686e5f6bd4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -33,6 +33,23 @@ field theory files. It also specializes the least-exponent degree formula to roots of unity of order `p ^ f - 1`. -/ +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 @@ -850,10 +867,10 @@ theorem padicCyclotomicUnramified_padic_isFiniteUnramified_prime_pow_sub_one intro x rfl let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target let : FiniteDimensional base.residueField target.residueField := - ValuationTheory.DiscreteValuationField.ValuedExtension.residueField_finiteDimensional_of_moduleFinite + residueField_finiteDimensional_of_moduleFinite base target let : Finite base.residueField := by simpa [base] using @@ -864,7 +881,7 @@ theorem padicCyclotomicUnramified_padic_isFiniteUnramified_prime_pow_sub_one infer_instance refine ⟨hresidueSeparable, ?_⟩ exact - ((LocalFieldTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable + ((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 @@ -898,7 +915,7 @@ theorem exists_padicCyclotomic_completeDVF_isFiniteUnramified_degree_eq let : Algebra.IsSeparable ℚ_[p] L := by infer_instance let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p obtain ⟨target, hExt, hTarget, _hfundamental⟩ := - ValuationTheory.DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index 11280c4830..bbbf8938be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -436,7 +436,6 @@ theorem equalCharacteristicChangedCompletedLevelUniformizer_norm_lt_one 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean index 45f9a3dec9..f10707969f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -287,7 +287,6 @@ noncomputable def equalCharacteristicChangedCompletedUnitRoot 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean index 58c0f8e448..26fccf3a44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean @@ -32,7 +32,6 @@ variable {K : Type u} [Field K] 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean index a1d2421ec3..4bb6d6f4e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean @@ -140,7 +140,6 @@ theorem equalCharacteristicLubinTatePrimitivePolynomial_natDegree 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) = @@ -329,7 +328,6 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean index 43ee98c1b1..f1f96f5101 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean @@ -45,12 +45,10 @@ theorem equalCharacteristicLubinTateUnitParameterToGal_surjective (equalCharacteristicLubinTateLevelField F n) := equalCharacteristicLubinTateLevelField_finiteDimensional F n let : Finite - (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) := + (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := equalCharacteristicLubinTateLevelField_galFinite F n have hcard : - Nat.card (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) ≤ + Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) ≤ Nat.card (equalCharacteristicLubinTateUnitParameter F n) := by rw [equalCharacteristicLubinTateLevelField_natCard_gal, equalCharacteristicLubinTateLevelField_finrank, @@ -66,8 +64,7 @@ theorem equalCharacteristicLubinTateLevelField_exists_unitParameter (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) - (σ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) : + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : ∃ a : equalCharacteristicLubinTateUnitParameter F n, σ = equalCharacteristicLubinTateUnitParameterAlgEquiv F n a := by obtain ⟨a, ha⟩ := @@ -326,8 +323,7 @@ theorem equalCharacteristicLubinTateLevelField_gal_comm (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) - (σ τ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) : + (σ τ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : σ * τ = τ * σ := by obtain ⟨a, rfl⟩ := equalCharacteristicLubinTateLevelField_exists_unitParameter F n σ obtain ⟨b, rfl⟩ := equalCharacteristicLubinTateLevelField_exists_unitParameter F n τ @@ -339,8 +335,7 @@ instance equalCharacteristicLubinTateLevelField_isMulCommutative [CharP K F.residueCharacteristic] (n : ℕ) : IsMulCommutative - (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) := + (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := ⟨⟨equalCharacteristicLubinTateLevelField_gal_comm F n⟩⟩ /-- Every explicit equal-characteristic Lubin--Tate level extension is diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean index 12b57a705a..55838aaf0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean @@ -281,8 +281,7 @@ noncomputable def equalCharacteristicLubinTateUnitParameterToGal [CharP K F.residueCharacteristic] (n : ℕ) : equalCharacteristicLubinTateUnitParameter F n → - Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) := + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := equalCharacteristicLubinTateUnitParameterAlgEquiv F n /-- Faithfulness of the bracket action makes the parameter-to-automorphism @@ -296,8 +295,7 @@ theorem equalCharacteristicLubinTateUnitParameterToGal_injective intro a b hab apply equalCharacteristicLubinTateUnitParameterLevelRoot_injective F n have hgen := congrArg - (fun σ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) => + (fun σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) => σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen) hab simpa [equalCharacteristicLubinTateUnitParameterToGal] using hgen @@ -306,8 +304,7 @@ noncomputable instance equalCharacteristicLubinTateLevelField_galFinite (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) : - Finite (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) := by + Finite (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := by let : FiniteDimensional F.residueField⸨X⸩ (equalCharacteristicLubinTateLevelField F n) := equalCharacteristicLubinTateLevelField_finiteDimensional F n @@ -327,8 +324,7 @@ theorem equalCharacteristicLubinTateLevelField_natCard_gal (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) : - Nat.card (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) = + Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) = Module.finrank F.residueField⸨X⸩ (equalCharacteristicLubinTateLevelField F n) := by let : FiniteDimensional F.residueField⸨X⸩ @@ -343,8 +339,7 @@ theorem equalCharacteristicLubinTateLevelField_natCard_gal Nat.card (equalCharacteristicLubinTateUnitParameter F n) := by rw [equalCharacteristicLubinTateLevelField_finrank, equalCharacteristicLubinTateUnitParameter_natCard] - _ ≤ Nat.card (Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) := + _ ≤ Nat.card (Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) := Nat.card_le_card_of_injective (equalCharacteristicLubinTateUnitParameterToGal F n) (equalCharacteristicLubinTateUnitParameterToGal_injective F n) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean index d64c24dcac..ccd3d90e87 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean @@ -280,8 +280,7 @@ noncomputable def equalCharacteristicLubinTateArtinUnitToGal [CharP K F.residueCharacteristic] (n : ℕ) : F.residueField⟦X⟧ˣ →* - Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) where + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) where toFun := equalCharacteristicLubinTateArtinUnitAlgEquiv F n map_one' := equalCharacteristicLubinTateArtinUnitAlgEquiv_one F n map_mul' := equalCharacteristicLubinTateArtinUnitAlgEquiv_mul F n @@ -309,8 +308,7 @@ theorem equalCharacteristicLubinTateArtinUnitToGal_ker constructor · intro ha have hgen := congrArg - (fun σ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) => + (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 @@ -383,8 +381,7 @@ noncomputable def equalCharacteristicLubinTateArtinUnitQuotientEquivGal (n : ℕ) : F.residueField⟦X⟧ˣ ⧸ equalCharacteristicLubinTateHigherUnitSubgroup F n ≃* - Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) := + Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := (QuotientGroup.quotientMulEquivOfEq (equalCharacteristicLubinTateArtinUnitToGal_ker F n).symm).trans (QuotientGroup.quotientKerEquivOfSurjective diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean index 4e5d157b15..2af7e03438 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -537,7 +537,7 @@ theorem equalCharacteristicFiniteUnramifiedExtension_isGalois : /-- Its distinguished arithmetic Frobenius. -/ noncomputable def equalCharacteristicFiniteUnramifiedFrobenius : - Gal(equalCharacteristicFiniteUnramifiedExtension k p n / k⸨X⸩) := + Gal(equalCharacteristicFiniteUnramifiedExtension k p n/k⸨X⸩) := laurentSeriesCoefficientGalHom (FiniteField.Extension.frob k p n) /-- Finite unramified Frobenius applies finite-field Frobenius coefficientwise. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean index 422c61710f..94e138323b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean @@ -17,6 +17,11 @@ function and the resulting upper ramification groups of the chosen equal-characteristic Lubin--Tate level. -/ +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandSlope → + herbrandSlope + + noncomputable section open scoped LaurentSeries Pointwise PowerSeries @@ -109,8 +114,7 @@ private noncomputable def [CharP K₀ F.residueCharacteristic] (n : ℕ) : RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration - Gal((equalCharacteristicLubinTateLevelField F n) / - LaurentSeries F.residueField) := + Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := lowerRamificationFiltrationOfUniqueExtension (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) @@ -123,13 +127,13 @@ private theorem equalCharacteristicLubinTateHerbrandSlope_eq_of_pow_interval (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) : - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + herbrandSlope (equalCharacteristicLubinTateLowerRamificationFiltration F n) i = (Nat.card F.residueField ^ (n + 1 - k) : ℕ) / ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n : ℕ) := by rw [ - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope] + herbrandSlope] change (Nat.card (equalCharacteristicLubinTateRealLowerRamificationGroup F n @@ -186,7 +190,7 @@ private theorem equalCharacteristicLubinTateHerbrandValueNat_pow_sub_one omega have hslope : ∀ x ∈ Finset.range b, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + herbrandSlope filtration (a + x) = (q ^ (n + 1 - (k + 1)) : ℕ) / ((q - 1) * q ^ n : ℕ) := by @@ -222,7 +226,7 @@ private theorem equalCharacteristicLubinTateHerbrandValueNat_pow_sub_one Nat.mul_pos (Nat.sub_pos_of_lt hqone) (Nat.pow_pos hqpos) have htail : (∑ x ∈ Finset.range b, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + herbrandSlope filtration (a + x)) = 1 := by calc _ = ∑ _x ∈ Finset.range b, @@ -240,14 +244,14 @@ private theorem equalCharacteristicLubinTateHerbrandValueNat_pow_sub_one exact_mod_cast (Nat.ne_of_gt hdenpos) change (∑ i ∈ Finset.range (q ^ (k + 1) - 1), - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + herbrandSlope filtration i) = ((k + 1 : ℕ) : ℝ) rw [hdecomp, Finset.sum_range_add] change RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat filtration a + (∑ x ∈ Finset.range b, - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandSlope + herbrandSlope filtration (a + x)) = ((k + 1 : ℕ) : ℝ) rw [show a = q ^ k - 1 by rfl, ihval, htail] @@ -292,8 +296,7 @@ noncomputable def equalCharacteristicLubinTateRealUpperRamificationGroup (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) (s : ℝ) : - Subgroup Gal((equalCharacteristicLubinTateLevelField F n) / - LaurentSeries F.residueField) := + Subgroup Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := upperRamificationGroupOfUniqueExtension (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean index 9c7788e8e4..f144e855da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean @@ -435,7 +435,6 @@ private theorem equalCharacteristicLubinTateBracketInteger_addVal_eq_order 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 ≤ @@ -479,8 +478,7 @@ private theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = @@ -505,8 +503,7 @@ private theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = @@ -540,8 +537,7 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = @@ -595,8 +591,7 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean index 3e566e21af..0195f2f7d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean @@ -34,8 +34,7 @@ theorem equalCharacteristicLubinTate_galoisAction_eq_bracket_unique (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) - (σ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) : + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : ∃! a : equalCharacteristicLubinTateUnitParameter F n, σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = equalCharacteristicLubinTateLevelBracket F n (n + 1) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean index 072357850e..0ec3feb33e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean @@ -43,8 +43,7 @@ noncomputable def equalCharacteristicLubinTateRealLowerRamificationGroup (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) (s : ℝ) : - Subgroup Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) := + Subgroup Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) := RamificationTheory.HilbertRamification.Higher.lowerRamificationGroup (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) (target := (equalCharacteristicLubinTateLevelCompleteDVF F n).toDVF) @@ -82,8 +81,7 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n i : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) : + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) : sigma ∈ equalCharacteristicLubinTateRealLowerRamificationGroup F n (i : ℝ) ↔ ((i + 1 : ℕ) : ℕ∞) ≤ @@ -151,8 +149,7 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n i : ℕ) - (sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : sigma (equalCharacteristicLubinTateLevelPowerBasis F n).gen = @@ -179,8 +176,7 @@ noncomputable def equalCharacteristicLubinTateUnitParameterEquivGal [CharP K F.residueCharacteristic] (n : ℕ) : equalCharacteristicLubinTateUnitParameter F n ≃ - Gal((equalCharacteristicLubinTateLevelField F n) / - LaurentSeries F.residueField) := + Gal((equalCharacteristicLubinTateLevelField F n)/LaurentSeries F.residueField) := Equiv.ofBijective (equalCharacteristicLubinTateUnitParameterToGal F n) ⟨equalCharacteristicLubinTateUnitParameterToGal_injective F n, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index 3c55ba0ac6..d888d8a127 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -24,6 +24,15 @@ finite equal-characteristic Lubin--Tate level. It proves that the chosen primitive point generates the integral closure and is a uniformizer. -/ +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 @@ -338,7 +347,7 @@ private theorem equalCharacteristicLubinTateLevelCompleteDVFData_exists (equalCharacteristicLubinTateLevelField F n) := equalCharacteristicLubinTateLevelField_isGalois F n exact - ValuationTheory.DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + exists_integralClosure_standard_fundamental_identity (K := F.residueField⸨X⸩) (L := equalCharacteristicLubinTateLevelField F n) (equalCharacteristicLubinTateBaseCompleteDVF F) @@ -514,7 +523,6 @@ chosen Laurent uniformizer. -/ theorem equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring_isEisensteinAt (F : LocalField.{0, v} K₀) - (n : ℕ) : (equalCharacteristicLubinTatePrimitivePolynomialInBaseValuationSubring F n).IsEisensteinAt @@ -624,7 +632,7 @@ theorem (equalCharacteristicLubinTateLevelField F n) := equalCharacteristicLubinTateLevelField_isGalois F n exact - (ValuationTheory.DiscreteValuationField.ValuedExtension.hasUniqueValuationExtension_of_finite_separable + (hasUniqueValuationExtension_of_finite_separable (equalCharacteristicLubinTateBaseCompleteDVF F) (equalCharacteristicLubinTateLevelCompleteDVF F n) : ValuationTheory.DiscreteValuationField.ValuedExtension.HasUniqueValuationExtension.{0, 0, @@ -740,8 +748,7 @@ theorem equalCharacteristicLubinTateBaseUniformizer_orbitProduct let target := equalCharacteristicLubinTateLevelCompleteDVF F n integerMap base.toDVF target.toDVF (equalCharacteristicLubinTateBaseUniformizerInteger F) = - ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩), + ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), valuationSubringAutOfUniqueExtension (base := base.toDVF) (target := target.toDVF) (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero @@ -757,8 +764,7 @@ theorem equalCharacteristicLubinTateBaseUniformizer_orbitProduct (equalCharacteristicLubinTateLevelField F n) (equalCharacteristicLaurentUniformizer F) = (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring.subtype - (∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩), + (∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), valuationSubringAutOfUniqueExtension (base := (equalCharacteristicLubinTateBaseCompleteDVF F).toDVF) @@ -777,14 +783,12 @@ theorem equalCharacteristicLubinTateBaseUniformizer_orbitProduct (Algebra.norm F.residueField⸨X⸩ (-equalCharacteristicLubinTateLevelGenerator F n)) := by rw [equalCharacteristicLubinTate_norm_neg_levelGenerator] - _ = ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩), + _ = ∏ 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⸩), + _ = ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), (equalCharacteristicLubinTateLevelCompleteDVF F n).valuation.valuationSubring.subtype (valuationSubringAutOfUniqueExtension (base := @@ -827,8 +831,7 @@ theorem equalCharacteristicLubinTatePrimitivePointInteger_addVal (IsDiscreteValuationRing.addVal target.valuationSubring) horbit have hnorm : (e : ℕ∞) = - Nat.card Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) • + Nat.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) • IsDiscreteValuationRing.addVal target.valuationSubring lambda := by rw [hbase] at hadd rw [addVal_prod_valuationSubringAut @@ -837,8 +840,7 @@ theorem equalCharacteristicLubinTatePrimitivePointInteger_addVal F n)] at hadd simpa [lambda] using hadd have hcard : - Nat.card Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩) = d := by + 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)) @@ -936,8 +938,7 @@ theorem (F : LocalField.{0, v} K₀) [CharP K₀ F.residueCharacteristic] (n : ℕ) - (σ : Gal((equalCharacteristicLubinTateLevelField F n) / - F.residueField⸨X⸩)) + (σ : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩)) (a : equalCharacteristicLubinTateUnitParameter F n) (ha : σ (equalCharacteristicLubinTateLevelPowerBasis F n).gen = @@ -1063,8 +1064,7 @@ theorem equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal_eq_degree 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 + _ = (Fintype.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) : ℕ∞) := hadd _ = ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n : ℕ) := by congr 1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean index a72f320c70..874b71a551 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean @@ -33,7 +33,7 @@ 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 (Gal((standardLubinTateLevelField hπ n)/K)) := Subgroup.map (standardLubinTateUnitParameterToGalHom F hπ n) (standardLubinTateUnitParameterSubgroup F n k) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean index 34a1d6d00b..f4d3301b9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -38,6 +38,11 @@ old primitive point, and the derivative exponent controls the product of the other changed-root displacements. -/ +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 @@ -241,7 +246,7 @@ private theorem standardLubinTate_iterate_derivative_factor_addVal IsUnit (1 + standardLubinTateLevelCoefficientHom hπ n c * y ^ (q - 1)) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.isUnit_one_add_of_mem_maximalIdeal_pow + isUnit_one_add_of_mem_maximalIdeal_pow target (n := 1) le_rfl (standardLubinTateLevelCoefficientHom hπ n c * y ^ (q - 1)) (by @@ -1048,7 +1053,7 @@ private theorem let : level.valuation.HasExtension target.valuation := standardLubinTateLevelToChangedLevelCompositum_hasExtension hπ u n - let tau : Gal(L / K) := σ.restrictNormal L + let tau : Gal(L/K) := σ.restrictNormal L have hrestrict := valuationSubringAutOfUniqueExtension_integerMap_restrictNormal (base := F.toCompleteDVF.toDVF) @@ -1265,7 +1270,7 @@ private theorem exists_standardLubinTateChangedPrimitiveRootInCompositum_close hπ u n hu have hstabilizer : - ∀ σ : Gal(M / K), + ∀ σ : Gal(M/K), σ (beta : M) = (beta : M) → σ (alpha : M) = (alpha : M) := by intro σ hfix diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean index 54138faa29..2b9639c14e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -37,7 +37,7 @@ noncomputable def standardLubinTateUnitParameterToGalHom (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : standardLubinTateUnitParameter F n →* - Gal((standardLubinTateLevelField hπ n) / K) where + 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 @@ -60,7 +60,7 @@ noncomputable def standardLubinTateUnitParameterEquivGal (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : standardLubinTateUnitParameter F n ≃* - Gal((standardLubinTateLevelField hπ n) / K) := + Gal((standardLubinTateLevelField hπ n)/K) := MulEquiv.ofBijective (standardLubinTateUnitParameterToGalHom F hπ n) (by @@ -137,7 +137,7 @@ instance standardLubinTateLevelField_isMulCommutative (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : IsMulCommutative - (Gal((standardLubinTateLevelField hπ n) / K)) := + (Gal((standardLubinTateLevelField hπ n)/K)) := ⟨⟨standardLubinTateLevelField_gal_comm F hπ n⟩⟩ /-- Every standard finite Lubin--Tate level is abelian Galois over its base diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean index fc368db37d..ae8e652084 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -238,7 +238,7 @@ private theorem (standardLubinTateLevelField hπ n) := standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n have hforward - (τ : Gal((standardLubinTateLevelField hπ n) / K)) + (τ : Gal((standardLubinTateLevelField hπ n)/K)) {y : standardLubinTateLevelField hπ n} (hy : y ∈ target.valuation.valuationSubring) : τ y ∈ target.valuation.valuationSubring := by @@ -537,7 +537,7 @@ noncomputable def standardLubinTateUnitParameterToGal (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : standardLubinTateUnitParameter F n → - Gal((standardLubinTateLevelField hπ n) / K) := + Gal((standardLubinTateLevelField hπ n)/K) := standardLubinTateUnitParameterAlgEquiv F hπ n /-- Faithfulness of the primitive action makes the parameter-to-automorphism @@ -551,7 +551,7 @@ theorem standardLubinTateUnitParameterToGal_injective intro a b hab apply standardLubinTateUnitParameterLevelRoot_injective F hπ n have hgen := congrArg - (fun σ : Gal((standardLubinTateLevelField hπ n) / K) => + (fun σ : Gal((standardLubinTateLevelField hπ n)/K) => σ (standardLubinTateLevelPowerBasis hπ n).gen) hab simpa [standardLubinTateUnitParameterToGal] using hgen @@ -579,7 +579,7 @@ theorem standardLubinTateUnitParameterToGal_mul 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 + Finite (Gal((standardLubinTateLevelField hπ n)/K)) := by let : FiniteDimensional K (standardLubinTateLevelField hπ n) := standardLubinTateLevelField_finiteDimensional hπ n let : Module.Free K (standardLubinTateLevelField hπ n) := @@ -595,7 +595,7 @@ 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)) ≤ + Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) ≤ Module.finrank K (standardLubinTateLevelField hπ n) := by let : FiniteDimensional K (standardLubinTateLevelField hπ n) := standardLubinTateLevelField_finiteDimensional hπ n @@ -607,7 +607,7 @@ 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)) = + Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) = Module.finrank K (standardLubinTateLevelField hπ n) := by let : FiniteDimensional K (standardLubinTateLevelField hπ n) := standardLubinTateLevelField_finiteDimensional hπ n @@ -618,7 +618,7 @@ theorem standardLubinTateLevelField_natCard_gal Nat.card (standardLubinTateUnitParameter F n) := by rw [standardLubinTateLevelField_finrank hπ n, standardLubinTateUnitParameter_natCard F n] - _ ≤ Nat.card (Gal((standardLubinTateLevelField hπ n) / K)) := + _ ≤ Nat.card (Gal((standardLubinTateLevelField hπ n)/K)) := Nat.card_le_card_of_injective (standardLubinTateUnitParameterToGal F hπ n) (standardLubinTateUnitParameterToGal_injective F hπ n) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean index 4ea42d193f..d7492242af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean @@ -185,15 +185,15 @@ theorem standardLubinTateRealUpperRamificationGroup_eq_restrictKer IsScalarTower.of_algebraMap_eq' rfl change Function.Surjective (AlgEquiv.restrictNormalHom E : - Gal(L / K) →* Gal(E / K)) + 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 + Nat.card (Gal(E/K)) = (q - 1) * q ^ m := by calc - Nat.card (Gal(E / K)) = + Nat.card (Gal(E/K)) = Module.finrank K E := by simpa [E] using standardLubinTateLevelField_natCard_gal @@ -203,9 +203,9 @@ theorem standardLubinTateRealUpperRamificationGroup_eq_restrictKer standardLubinTateLevelField_finrank (F := F) hπ m have hcardGalL : - Nat.card (Gal(L / K)) = (q - 1) * q ^ n := by + Nat.card (Gal(L/K)) = (q - 1) * q ^ n := by calc - Nat.card (Gal(L / K)) = + Nat.card (Gal(L/K)) = Module.finrank K L := by simpa [L] using standardLubinTateLevelField_natCard_gal @@ -215,13 +215,13 @@ theorem standardLubinTateRealUpperRamificationGroup_eq_restrictKer standardLubinTateLevelField_finrank (F := F) hπ n have hindex : - ψ.ker.index = Nat.card (Gal(E / K)) := by + ψ.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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean index 0b7e0acfff..49f8902d89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean @@ -35,7 +35,7 @@ noncomputable def standardLubinTateRealLowerRamificationGroup {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) (s : ℝ) : - Subgroup Gal((standardLubinTateLevelField hπ n) / K) := + Subgroup Gal((standardLubinTateLevelField hπ n)/K) := lowerRamificationGroup (base := F.toCompleteDVF.toDVF) (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean index a2fe0bea34..a1a4c47fad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -52,8 +52,9 @@ private theorem standardLubinTateSeries_hasLinearTerm linearForm (fun _ : Unit => π) = (PowerSeries.X : PowerSeries F.valuationSubring) ^ Nat.card F.residueField := by - simp [LubinTateSeries.standardLubinTateSeries_toPowerSeries, - standardLubinTatePowerSeries, linearForm] + 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean index 8dc948b13e..9de793af06 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean @@ -45,7 +45,7 @@ noncomputable def standardLubinTateLowerRamificationFiltration (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration - Gal((standardLubinTateLevelField hπ n) / K) := + Gal((standardLubinTateLevelField hπ n)/K) := lowerRamificationFiltrationOfUniqueExtension (base := F.toCompleteDVF.toDVF) (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) @@ -79,7 +79,7 @@ noncomputable def standardLubinTateRealUpperRamificationGroup {F : LocalField.{u, v} K} {π : F.valuationSubring} (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) (t : ℝ) : - Subgroup Gal((standardLubinTateLevelField hπ n) / K) := + Subgroup Gal((standardLubinTateLevelField hπ n)/K) := upperRamificationGroupOfUniqueExtension (base := F.toCompleteDVF.toDVF) (target := (standardLubinTateLevelCompleteDVF hπ n).toDVF) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean index 3620d655c7..3f91302afa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean @@ -144,7 +144,7 @@ theorem padicCompletedChangedUniformizerRelativeArtinCandidate p u n let σ := padicCompletedChangedUniformizerArtinCandidate p u n - let forget : Gal(M / D) →* Gal(M / ℚ_[p]) := + let forget : Gal(M/D) →* Gal(M/ℚ_[p]) := AlgEquiv.restrictScalarsHom ℚ_[p] apply top_unique intro g _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean index ae99d70c75..11354d4521 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean @@ -23,6 +23,19 @@ the finite standard/changed compositum. Since the same element is a uniformizer on both sides, their relative ramification index is one. -/ +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 @@ -227,7 +240,7 @@ theorem rw [integerMap_apply] exact hthetaM exact - LocalFieldTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_eq_one_of_integerMap_uniformizer + ramificationIndex_eq_one_of_integerMap_uniformizer base target thetaInteger (by simpa only [thetaInteger] using hthetaD) hthetaMap @@ -277,7 +290,7 @@ theorem Module.Finite (localCompleteDVF D).valuationSubring (localCompleteDVF M).valuationSubring exact - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable (localCompleteDVF D) (localCompleteDVF M) LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension D M := by @@ -319,13 +332,13 @@ theorem Module.Finite (localCompleteDVF D).valuationSubring (localCompleteDVF M).valuationSubring exact - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + 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 := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleIsTorsionFree_target_valuationSubring_of_finite_separable + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target have hramification : ramificationIndex base.toDVF target.toDVF = 1 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean index 99e8ebb234..4c51b873a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -23,6 +23,11 @@ an actual `ℚ_[p]`-algebra automorphism. No second Witt ring, p-adic field, or Frobenius is introduced. -/ +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + valuation_hasExtension_of_local_valuationSubring_map → + valuation_hasExtension_of_local_valuationSubring_map + + noncomputable section namespace LubinTate @@ -367,7 +372,7 @@ theorem padicCompletedUnramifiedValuation_hasExtension apply ((IsLocalRing.local_hom_TFAE f).out 3 1).mp rw [padicCompletedUnramifiedIntegerMap_map_maximalIdeal] exact - ValuationTheory.DiscreteValuationField.ValuedExtension.valuation_hasExtension_of_local_valuationSubring_map + valuation_hasExtension_of_local_valuationSubring_map (padicLocalField p).toCompleteDVF (padicCompletedUnramifiedCompleteDVF p) f diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean index 47165fa89b..e784a96b1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -643,7 +643,7 @@ private theorem padicMultiplicativeLevelAlgEquiv_mem_valuationSubring_iff (padicLocalField p).valuationSubring L := standardLubinTateLevelCompleteDVF_isIntegralClosure hπ n have hforward - (τ : Gal(L / ℚ_[p])) {y : L} + (τ : Gal(L/ℚ_[p])) {y : L} (hy : y ∈ target.valuation.valuationSubring) : τ y ∈ target.valuation.valuationSubring := by have hyIntegral : @@ -769,7 +769,7 @@ private theorem let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p let target := standardLubinTateLevelCompleteDVF hπ n let L := standardLubinTateLevelField hπ n - let σ : Gal(L / ℚ_[p]) := + let σ : Gal(L/ℚ_[p]) := (standardLubinTateUnitParameterEquivGal (padicLocalField p) hπ n (standardLubinTateUnitParameterClass @@ -871,7 +871,7 @@ theorem padicMultiplicativePrimitiveRoot_galoisAction let hπ := padicMultiplicativeLubinTateSeries_isUniformizer p let target := standardLubinTateLevelCompleteDVF hπ n let L := standardLubinTateLevelField hπ n - let σ : Gal(L / ℚ_[p]) := + let σ : Gal(L/ℚ_[p]) := (standardLubinTateUnitParameterEquivGal (padicLocalField p) hπ n (standardLubinTateUnitParameterClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean index 5d821222d7..a84bc8211e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -29,6 +29,11 @@ by hypothesis. -/ +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 @@ -347,7 +352,7 @@ theorem globalPadicPrime_localizationValuationSubring_eq rw [hmk, map_div₀, hsEq, div_one] exact haLe apply - (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_mem_maximalIdeal_iff + (valuationSubring_eq_of_le_of_mem_maximalIdeal_iff V A hVA ?_).symm intro x rcases x.property with ⟨a, s, hs, hx⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean index e47c9c282e..53633bdd6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean @@ -16,6 +16,23 @@ finite Galois extension of `ℚ_p` with the intrinsic value-group ramification index, then applies the prime-power cyclotomic ramification bound. -/ +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 @@ -40,7 +57,7 @@ theorem natCard_padicCanonicalInertia_eq_exponentialRamificationIndex (padicFiniteExtensionExponentialValuation p E) := by let base := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p obtain ⟨target, hExt, hTarget, _hFundamental⟩ := - ValuationTheory.DiscreteValuationField.ValuedExtension.exists_integralClosure_standard_fundamental_identity + 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 @@ -49,12 +66,12 @@ theorem natCard_padicCanonicalInertia_eq_exponentialRamificationIndex intro x rfl let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target let : FiniteDimensional (base.valuationSubring ⧸ base.maximalIdeal) (target.valuationSubring ⧸ target.maximalIdeal) := - ValuationTheory.DiscreteValuationField.ValuedExtension.residueField_finiteDimensional_of_moduleFinite + residueField_finiteDimensional_of_moduleFinite base target let : Algebra.IsAlgebraic (base.valuationSubring ⧸ base.maximalIdeal) @@ -73,7 +90,7 @@ theorem natCard_padicCanonicalInertia_eq_exponentialRamificationIndex (target.valuationSubring ⧸ target.maximalIdeal) := by exact Algebra.IsAlgebraic.isSeparable_of_perfectField have hCard := - RamificationTheory.HilbertRamification.CompleteDVF.natCard_decompositionInertiaSubgroup_eq_ramificationIndex + natCard_decompositionInertiaSubgroup_eq_ramificationIndex (K := ℚ_[p]) (L := E) base target have hAssociated : LubinTate.Valuations.exponentialValuationSubringAsValuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean index 4dd911cd5b..43fa043f8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -26,11 +26,8 @@ universe u v 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] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : Antitone (ClassFieldTheory.realLowerRamificationGroup K (ValuativeRel.valuation L).valuationSubring) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean index 0fec1c14f7..4094d23222 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean @@ -25,6 +25,11 @@ finite levels. Arithmetic Frobenius on unramified extensions removes it for the entire coherent family, including ramified extensions. -/ +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension renaming + maximalIdeal_ramificationIdx_eq_one → + maximalIdeal_ramificationIdx_eq_one + + open scoped ValuativeRel noncomputable section @@ -137,7 +142,7 @@ theorem finiteAbelianLocalReciprocity_family_ext norm_num have hUnram : (𝓂[U] : Ideal 𝒪[U]).ramificationIdx 𝒪[K] = 1 := - LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension.maximalIdeal_ramificationIdx_eq_one + maximalIdeal_ramificationIdx_eq_one have hUeq : f Upack = g Upack := finiteAbelianLocalReciprocity_unramified_family_ext K f g hfker hgker hfrob hgrob Upack hUnram π hπ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean index 13e8a52472..d2185ad288 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -59,7 +59,7 @@ noncomputable def cyclicH1IsoHminusOne {k G : Type} [CommRing k] [Group G] /-- 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) : + (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 @@ -69,7 +69,7 @@ This is low-degree cyclic Tate cohomology for the coefficient group `Lˣ`: the v `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) : + (hg : ∀ x : Gal(L/K), x ∈ Subgroup.zpowers g) : CategoryTheory.Limits.IsZero (tateCohomology (Rep.ofAlgebraAutOnUnits K L) (-1)) := by have hzero : diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean index 22bddf9656..3d8d5a81a6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -69,11 +69,9 @@ private noncomputable def periodicChainMap comm' := by rintro i j ⟨rfl⟩ by_cases hj : Even (j + 1) - · simp [Rep.FiniteCyclicGroup.moduleCatChainComplex, - HomologicalComplex.alternatingConst, hj] + · simp only [Rep.FiniteCyclicGroup.moduleCatChainComplex, HomologicalComplex.alternatingConst, ComplexShape.down_Rel, dite_eq_ite, Nat.add_left_cancel_iff, ↓reduceIte, hj] exact (subCompNormMap σ f hf).comm₂₃ - · simp [Rep.FiniteCyclicGroup.moduleCatChainComplex, - HomologicalComplex.alternatingConst, hj] + · simp only [Rep.FiniteCyclicGroup.moduleCatChainComplex, HomologicalComplex.alternatingConst, ComplexShape.down_Rel, dite_eq_ite, Nat.add_left_cancel_iff, ↓reduceIte, hj] exact (subCompNormMap σ f hf).comm₁₂ private noncomputable def periodicShortComplex diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index d0ca95fe86..7f8c1c989c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -26,11 +26,11 @@ variable (K L : Type u) [Field K] [Field L] [Algebra 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 + (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 (fun σ : Gal(L/K) => + σ (IsGalois.normalBasis K L (1 : Gal(L/K)))) = Set.range (IsGalois.normalBasis K L) := by ext x constructor @@ -48,16 +48,16 @@ normal-basis orbit. Bounds comparing this lattice with `𝒪_L` are deliberatel 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))))) + (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))))) := + (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`. -/ @@ -68,9 +68,9 @@ theorem normalBasis_mem_integerLattice (σ : Gal(L/K)) : /-- 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)) ∈ + IsGalois.normalBasis K L (1 : Gal(L/K)) ∈ chosenNormalBasisIntegerLattice K L := - normalBasis_mem_integerLattice (K := K) (L := L) (1 : Gal(L / K)) + 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`. -/ @@ -95,7 +95,7 @@ theorem galoisGroup_apply_mem_chosenNormalBasisIntegerLattice · intro x hx rcases hx with ⟨σ, rfl⟩ have hτ : - τ (σ (IsGalois.normalBasis K L (1 : Gal(L / K)))) = + τ (σ (IsGalois.normalBasis K L (1 : Gal(L/K)))) = IsGalois.normalBasis K L (τ * σ) := by rw [IsGalois.normalBasis_apply (K := K) (L := L) (τ * σ)] rfl diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index 1f4a84ea1b..d8ef514371 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -280,7 +280,6 @@ permutation representation. -/ def completePermutationLatticeDistribMulAction (ρ : G →* Equiv.Perm ι) (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] - (hL : ∀ (g : G) (x : ι → ℝ), x ∈ L → permutationRepresentation ρ g x ∈ L) : DistribMulAction G L where diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean index e6fbe83b41..fb8507a3b6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -301,7 +301,7 @@ def galoisGroupIntegerUnitsModPrincipalUnitsMapEquivHomOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - Gal(L / K) →* + Gal(L/K) →* (IntegerUnitsModPrincipalUnitsAtLevel L n ≃* IntegerUnitsModPrincipalUnitsAtLevel L n) where toFun := galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n @@ -350,7 +350,7 @@ def galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosu [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - MulDistribMulAction (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) where + MulDistribMulAction (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) where smul σ x := galoisGroupIntegerUnitsModPrincipalUnitsMapEquivOfIsIntegralClosure K L n σ x one_smul := by intro x @@ -523,7 +523,7 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandH0_finite_of_isNonarchimede [Fintype (Gal(L/K))] (n : Nat) : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := by + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := by let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n @@ -535,10 +535,10 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandHMinusOne_finite_of_isNonar [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)) : + [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 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := by let := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n let : Finite (IntegerUnitsModPrincipalUnitsAtLevel L n) := integerUnitsModPrincipalUnitsAtLevel_finite_of_isNonarchimedeanLocalField L n @@ -552,17 +552,17 @@ theorem integerUnitsModPrincipalUnitsAtLevel_herbrandQuotient_eq_one_of_isNonarc [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 σ) : + (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 + (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 + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ hgen /-- GC Herbrand multiplicativity specialized to the actual finite principal-unit quotient tower @@ -572,76 +572,76 @@ theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_exact_multiplicative_ [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 σ) + [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))) + (Gal(L/K)) (PrincipalUnitsSuccQuot L n))) (hAm : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ)) + (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)))) + (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)) σ)) + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ)) (hC0 : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) (hCm : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ)) : + (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 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ = + (G := Gal(L/K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ = CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := PrincipalUnitsSuccQuot L n) σ * + (G := Gal(L/K)) (A := PrincipalUnitsSuccQuot L n) σ * CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ := by + (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 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm exact CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient_exact_multiplicative - (G := Gal(L / K)) + (G := Gal(L/K)) (A := PrincipalUnitsSuccQuot L n) (B := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) (C := IntegerUnitsModPrincipalUnitsAtLevel L n) @@ -669,76 +669,76 @@ theorem integerUnitsModPrincipalUnitsSucc_herbrandQuotient_eq_one_of_isIntegralC [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 σ) + [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))) + (Gal(L/K)) (PrincipalUnitsSuccQuot L n))) (hAm : letI := galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ)) + (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)))) + (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)) σ)) + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ)) (hC0 : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n))) (hCm : letI := galoisGroupIntegerUnitsModPrincipalUnitsMulDistribMulActionOfIsIntegralClosure K L n Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ)) + (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 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := PrincipalUnitsSuccQuot L n) σ = 1) + (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 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L n) σ = 1) : + (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 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 letI : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm CyclicCohomology.ProfiniteCohomology.Herbrand.herbrandQuotient - (G := Gal(L / K)) (A := IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ = 1 := by + (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 + (Gal(L/K)) (PrincipalUnitsSuccQuot L n)) := hA0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (PrincipalUnitsSuccQuot L n) σ) := hAm + (Gal(L/K)) (PrincipalUnitsSuccQuot L n) σ) := hAm let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1))) := hB0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L (n + 1)) σ) := hBm let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandH0 - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 + (Gal(L/K)) (IntegerUnitsModPrincipalUnitsAtLevel L n)) := hC0 let : Finite (CyclicCohomology.ProfiniteCohomology.Herbrand.HerbrandHMinusOne - (Gal(L / K)) (IntegerUnitsModPrincipalUnitsAtLevel L n) σ) := hCm + (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] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean index c66e7d9219..cb63d1ba7e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean @@ -49,12 +49,13 @@ theorem subgroupQuotientEquivQuotientOfSupEqTop_mk subgroupQuotientEquivQuotientOfSupEqTop S P hSP (QuotientGroup.mk' (P.subgroupOf S) s) = QuotientGroup.mk' P (s : G) := by - simp [subgroupQuotientEquivQuotientOfSupEqTop, + simp only [subgroupQuotientEquivQuotientOfSupEqTop, QuotientGroup.quotientInfEquivProdNormalQuotient, QuotientGroup.quotientInfEquivProdNormalizerQuotient, - QuotientGroup.quotientKerEquivOfSurjective, - QuotientGroup.quotientKerEquivOfRightInverse, - QuotientGroup.kerLift_mk] + 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) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean index 39e3052373..264689782f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean @@ -102,7 +102,6 @@ theorem extensionFixedEndomorphism_fixed_val 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*} diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean index 96508ae155..909e0d9c2b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -223,7 +223,7 @@ theorem extensionSubgroup_closedCyclicFactorSubgroup_eq (closedCyclicFactorSubgroup_le_base K L hLK f) = cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f := by ext x - simp [extensionSubgroup, closedCyclicFactorSubgroup] + simp? [extensionSubgroup, closedCyclicFactorSubgroup] rw [Subgroup.mem_subgroupOf] constructor · rintro ⟨y, hy, hxy⟩ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean index ab2eabf98e..e18b036298 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean @@ -9,6 +9,11 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.Pro # Compiled final swap stage of the profinite-unit decomposition -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivProdComm → + continuousMulEquivProdComm + + open scoped Topology noncomputable section @@ -21,7 +26,7 @@ open ClassFormation noncomputable def freeFiniteSwap : CyclotomicFinitePart × Multiplicative ZHat ≃ₜ* Multiplicative ZHat × CyclotomicFinitePart := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivProdComm + 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 index 99ab73867d..d09e3afb73 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean @@ -9,6 +9,11 @@ import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.Pro # Torsion quotients of a profinite-integer product decomposition -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + continuousMulEquivOfCompactToT2 → + continuousMulEquivOfCompactToT2 + + open scoped Topology noncomputable section @@ -97,7 +102,7 @@ noncomputable def torsionQuotientEquivOfZHatMulDecomposition (QuotientGroup.quotientKerEquivOfSurjective freePart hsurj) exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivOfCompactToT2 + continuousMulEquivOfCompactToT2 e (by rw [← diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean index 6327614166..fd4f3ba829 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean @@ -16,6 +16,11 @@ The statement is independent of the global Kummer construction so it can be reused by local reciprocity arguments. -/ +open _root_.RamificationTheory.DiscreteValuationField.ValuedExtension renaming + isUnramifiedAt_of_aeval_derivative_isUnit → + isUnramifiedAt_of_aeval_derivative_isUnit + + open scoped ValuativeRel open LocalFieldTheory @@ -122,7 +127,7 @@ theorem isUnramifiedValuedExtension_of_unit_kummer_generator have hunramifiedAt : Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := - RamificationTheory.DiscreteValuationField.ValuedExtension.isUnramifiedAt_of_aeval_derivative_isUnit + isUnramifiedAt_of_aeval_derivative_isUnit base target z hzgen P hP hPderiv refine ⟨?_⟩ change target.maximalIdeal.ramificationIdx base.valuationSubring = 1 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean index acfea7ebce..02d4c743f7 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean @@ -189,7 +189,6 @@ theorem kummerRadicalExtension_isGalois `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)) @@ -256,7 +255,6 @@ theorem kummerRadicalExtension_isMulCommutative /-- 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)) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean index af6d82a175..ad9221c11c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean @@ -72,11 +72,11 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub chosenSimpleKummerExtension_finiteDimensional K n hnK b let _ : IsAbelianGalois K E := chosenSimpleKummerExtension_isAbelianGalois K n hnK hmu b - let _ : MulDistribMulAction Gal(E / K) Eˣ := + 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 := + let chi : Gal(E/K) →* mu := chosenSimpleKummerRootCharacter K n hnK hmu b let H : Subgroup mu := chi.range let Q := mu ⧸ H @@ -85,9 +85,9 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub 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 := + let indexEquiv : Q × Gal(E/K) ≃ mu := quotientCharacterProductEquiv chi hchi - have indexEquiv_apply (q : Q) (sigma : Gal(E / K)) : + have indexEquiv_apply (q : Q) (sigma : Gal(E/K)) : indexEquiv (q, sigma) = Quotient.out q * chi sigma := by rfl have factor_ne (q : Q) : @@ -117,7 +117,7 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub 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)) : + 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 = @@ -131,7 +131,7 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub simp only [AlgEquiv.smul_units_def] apply Units.ext rfl - have map_factor (sigma : Gal(E / K)) (q : Q) : + 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 @@ -218,14 +218,14 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub calc algebraMap K E (Algebra.norm K (witness : E)) = Finset.univ.prod - (fun sigma : Gal(E / K) => sigma (witness : E)) := + (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 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 sigma : Gal(E/K) => Finset.univ.prod (fun q : Q => 1 - (((((Quotient.out q : mu) * chi sigma).1 : Eˣ) : E) * (beta : E)))) := by @@ -234,7 +234,7 @@ theorem unit_mem_localNormSubgroup_chosenSimpleKummerExtension_one_sub apply Finset.prod_congr rfl intro q _ exact map_factor sigma q - _ = Finset.univ.prod (fun p : Q × Gal(E / K) => + _ = 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean index d12d7e8543..f64f37bb67 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -17,6 +17,31 @@ continuous homomorphism and extends it to field units with the unique uniformizer value forced by `log p = 0`. -/ +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 @@ -246,7 +271,7 @@ theorem uniformizerValueExponent_residueCharacteristic_ne_zero F.natCast_residueCharacteristic_ne_zero_of_charZero intro hm have hvalue := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F.toCompleteDVF) + (uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F.toCompleteDVF) hπ pUnit rw [hm, zpow_zero] at hvalue have hvalue' := @@ -269,7 +294,7 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing (ψ : Kˣ →* Multiplicative K) (hψprincipal : ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1, - ψ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + ψ (valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u) (hψa : ψ a = 1) : ψ = fieldUnitLogHomWithUniformizerValue F @@ -313,7 +338,7 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing rw [L.map_mul, L.map_mul, L.map_zpow] rw [toAdd_mul, toAdd_mul, toAdd_zpow] have hLprincipal : - L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + L (valuationSubringUnitFieldUnitHom F (z.1.2 : F.valuationSubringˣ)) = φ z.1.2 := by simpa [L, d] using fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal @@ -332,16 +357,16 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing apply Multiplicative.toAdd.injective exact zsmul_right_injective hm hpow apply monoidHom_toMultiplicative_ext_of_agree_principalUnits_and_uniformizer - F ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) + F ((multiplicativeIntegerValuationOfUniformizer F) hπ) · intro y exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq + mem_zeroSubgroup_iff_exists_valuationSubringUnitFieldUnitHom_eq (F := F) - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ) - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + ((multiplicativeIntegerValuationOfUniformizer F) hπ) + ((multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) y · exact - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ · intro u rw [hψprincipal u] simpa [L, d] using @@ -441,7 +466,7 @@ theorem existsUnique_continuous_log ∀ u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1, Multiplicative.toAdd - (L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (L (valuationSubringUnitFieldUnitHom F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = principalUnitLogSeriesOfWithZeroValuation v u hnK := by let F : LocalField.{u, 0} K := LocalField.ofWithZeroValuation v @@ -507,7 +532,7 @@ theorem existsUnique_continuous_log (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF) 1, Multiplicative.toAdd - (L (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (L (valuationSubringUnitFieldUnitHom F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = principalUnitLogSeriesOfWithZeroValuation v u hnK := by intro u @@ -530,7 +555,7 @@ theorem existsUnique_continuous_log apply Multiplicative.toAdd.injective calc Multiplicative.toAdd - (ψ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (ψ (valuationSubringUnitFieldUnitHom F.toCompleteDVF (u : F.toCompleteDVF.valuationSubringˣ))) = principalUnitLogSeriesOfWithZeroValuation v u hnK := hψ.2.2 u _ = Multiplicative.toAdd (φ u) := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean index a542b1f172..0af695a991 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -112,7 +112,6 @@ a.toAdd`. 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 : ℕ) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean index fb4943751a..0812c23ed7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean @@ -73,7 +73,7 @@ theorem eq_zero_of_derivative_mul_one_add_X_eq_self ring rw [hmul, map_add, PowerSeries.coeff_succ_mul_X, PowerSeries.coeff_derivative, PowerSeries.coeff_derivative] at hcoeff - simp [ih] 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean index 268833d234..e05df85af2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -10,6 +10,27 @@ Packages the convergent logarithm and exponential series as additive and multipl homomorphisms on their natural nonarchimedean domains. -/ +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 @@ -879,7 +900,7 @@ noncomputable def fieldUnitDecompositionLogHomOfPrincipalUnitHom {A : Type*} [AddCommGroup A] (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F →* + fieldUnitDecompositionFactors F →* Multiplicative A where toFun z := φ z.1.2 map_one' := by @@ -896,7 +917,7 @@ The defining evaluation formula for `fieldUnitDecompositionLogHomOfPrincipalUnit {A : Type*} [AddCommGroup A] (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) : + (z : fieldUnitDecompositionFactors F) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ z = φ z.1.2 := rfl @@ -909,7 +930,7 @@ theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_root {A : Type*} [AddCommGroup A] (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + (ζ : residueRootsOfUnityGroup F) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ ((ζ, 1), (1 : Multiplicative ℤ)) = 1 := by simp @@ -927,7 +948,7 @@ u`. (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = φ u := by simp @@ -944,7 +965,7 @@ theorem fieldUnitDecompositionLogHomOfPrincipalUnitHom_uniformizer (m : ℤ) : fieldUnitDecompositionLogHomOfPrincipalUnitHom (F := F) φ (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + residueRootsOfUnityGroup F), (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = 1 := by @@ -956,7 +977,7 @@ three-factor decomposition and a principal-unit logarithm homomorphism. -/ noncomputable def fieldUnitLogHomOfPrincipalUnitHom (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) : Kˣ →* Multiplicative A := @@ -970,7 +991,7 @@ The defining evaluation formula for `fieldUnitLogHomOfPrincipalUnitHom` is @[simp] theorem fieldUnitLogHomOfPrincipalUnitHom_apply (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (x : Kˣ) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = @@ -981,10 +1002,10 @@ The defining evaluation formula for `fieldUnitLogHomOfPrincipalUnitHom` is theorem fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (z : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) + (z : fieldUnitDecompositionFactors F) {x : Kˣ} (hx : e z = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ z.1.2 := by subst x @@ -994,10 +1015,10 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) + (ζ : residueRootsOfUnityGroup F) {x : Kˣ} (hx : e ((ζ, 1), (1 : Multiplicative ℤ)) = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1 := by @@ -1009,34 +1030,34 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition theorem fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition (F : CompleteDVF K) [Finite F.residueField] {A : Type*} [AddCommGroup A] - (e : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) {x : Kˣ} (hx : e (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = φ u := by simpa using fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq (F := F) e φ (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), + 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 : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* Kˣ) + (e : fieldUnitDecompositionFactors F ≃* Kˣ) (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) (m : ℤ) {x : Kˣ} (hx : e (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + residueRootsOfUnityGroup F), (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) = x) : fieldUnitLogHomOfPrincipalUnitHom (F := F) e φ x = 1 := by @@ -1044,7 +1065,7 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition fieldUnitLogHomOfPrincipalUnitHom_apply_of_decomposition_eq (F := F) e φ (((1 : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), + residueRootsOfUnityGroup F), (1 : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)), Multiplicative.ofAdd m) hx @@ -1056,20 +1077,20 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_root {A : Type*} [AddCommGroup A] (φ : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 →* Multiplicative A) - (ζ : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) : + (ζ : residueRootsOfUnityGroup F) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (valuationSubringUnitFieldUnitHom F (ζ : F.valuationSubringˣ)) = 1 := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_root_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (ζ := ζ) - simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + simp [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] /-- public principal-unit value of the field-unit logarithm constructed from the complete-DVF uniformizer decomposition. -/ @@ -1082,17 +1103,17 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_of_completeDVF_principal (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F + (valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_of_principal_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (u := u) - simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + 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 @@ -1105,16 +1126,16 @@ theorem fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_completeDVF_uniformizer Multiplicative A) : fieldUnitLogHomOfPrincipalUnitHom (F := F) - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (Units.mk0 (π : K) hπ.ne_zero) = 1 := by apply fieldUnitLogHomOfPrincipalUnitHom_eq_one_of_uniformizer_decomposition (F := F) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (m := 1) - simp [_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + 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 @@ -1126,7 +1147,7 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation {p : ℕ} [Fact p.Prime] [Finite (completeDVFOfWithZeroValuation v).residueField] (e : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + fieldUnitDecompositionFactors (completeDVFOfWithZeroValuation v) ≃* Kˣ) (hnK : ∀ n : ℕ, (((n + 1 : ℕ) : K) ≠ 0)) (hnval : ∀ n : ℕ, @@ -1196,7 +1217,7 @@ noncomputable def fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUn fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) (e := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF (completeDVFOfWithZeroValuation v) hπ) hnK hnval hcomplete hdefect @@ -1236,7 +1257,7 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer (completeDVFOfWithZeroValuation v)) 1) : fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (u : _)) = principalUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation (v := v) (p := p) hnK hnval hcomplete hdefect u := by @@ -1284,7 +1305,7 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer Multiplicative.toAdd (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (u : _))) = principalUnitLogSeriesOfWithZeroValuation v u hnK := by rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_principal @@ -1324,11 +1345,11 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) (ζ : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup + residueRootsOfUnityGroup (completeDVFOfWithZeroValuation v)) : fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (ζ : _)) = 1 := by simpa [fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer, fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuation] using @@ -1370,12 +1391,12 @@ theorem fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer (principalUnitSubOneOfWithZeroValuation v w) hnK N)) atTop (𝓝 (0 : K))) (ζ : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup + residueRootsOfUnityGroup (completeDVFOfWithZeroValuation v)) : Multiplicative.toAdd (fieldUnitLogSeriesHomOfTendstoFieldDefectOfWithZeroValuationUniformizer (v := v) (p := p) hπ hnK hnval hcomplete hdefect - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom + (valuationSubringUnitFieldUnitHom (completeDVFOfWithZeroValuation v) (ζ : _))) = 0 := by rw [fieldUnitLogSeriesHomOfTendstoFieldDefect_ofWithZeroValuationUniformizer_root (v := v) (p := p) hπ hnK hnval hcomplete hdefect ζ] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean index 6874d5d5ed..4e6dd9c81d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -10,6 +10,11 @@ Develops the valuation estimates showing that logarithm and exponential series a their common principal-unit domain. -/ +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 @@ -998,7 +1003,7 @@ theorem mem_maximalIdeal_pow_ofWithZeroValuation_val_ge v (a : K) ≤ WithZero.exp (-(n : ℤ)) := WithZero.le_exp_of_log_le hlog exact - (ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (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] @@ -1045,7 +1050,7 @@ theorem ofWithZeroValuation_val_ge_of_mem_maximalIdeal_pow have hva : v (a : K) ≤ WithZero.exp (-(n : ℤ)) := by have h := - (ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean index 57957420b0..a7fd57571b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean @@ -10,6 +10,11 @@ Restricts the exponential series to deep additive ideals and shows that its valu corresponding principal-unit subgroups. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + principalUnitOneAddOfMemPowSubgroup → + principalUnitOneAddOfMemPowSubgroup + + open Filter open Polynomial open scoped Topology @@ -63,7 +68,7 @@ noncomputable def principalUnitExpSeriesOfWithZeroValuation exact hlt simpa [pow_one] using ha0 exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup + principalUnitOneAddOfMemPowSubgroup F (n := 1) le_rfl a ha /-- Sharp ramified endpoint form of the exponential: if `a ∈ m^n` and @@ -158,7 +163,7 @@ noncomputable def principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScal rw [hvaleq] exact hge exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup + principalUnitOneAddOfMemPowSubgroup F hn b hbmem /-- diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean index 8ef0806e09..366353afa1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -10,6 +10,31 @@ Restricts the logarithm series to principal units and places its values in the c additive ideal. -/ +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 @@ -217,7 +242,7 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer CompleteSpace K) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup (completeDVFOfWithZeroValuation v)) n) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk + principalUnitSuccQuotMk (completeDVFOfWithZeroValuation v) n (principalUnitExpSeriesOfMaximalIdealPowOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel @@ -225,7 +250,7 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer (principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled (v := v) (p := p) e n (π := π) hπ hπval hn hlevel hnKlog hnvalLog hcomplete u)) = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk + principalUnitSuccQuotMk (completeDVFOfWithZeroValuation v) n u := by let F : CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v let loga : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := @@ -242,18 +267,18 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer (w0 : F.valuationSubring), w0 = ((w : F.valuationSubringˣ) : F.valuationSubring) - 1 → ∀ hw0 : w0 ∈ F.maximalIdeal ^ n, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F n w = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow + principalUnitSuccQuotMk F n w = + principalUnitSuccQuotOfIdealPow F n hn ⟨w0, hw0⟩ := by intro w w0 hw0eq hw0 subst w0 - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply] + rw [principalUnitSuccQuotOfIdealPow_apply] congr 1 dsimp apply Subtype.ext - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val] + rw [principalUnitOneAddOfMemPowSubgroup_val] apply Units.ext - rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val] + rw [principalUnitOneAddOfMemPow_val] ring let a0 : F.valuationSubring := ((u : F.valuationSubringˣ) : F.valuationSubring) - 1 @@ -284,7 +309,7 @@ theorem principalUnitExpSeries_logSeries_principalUnitSuccQuot_eq_self_ofWithZer principalUnitLogSeriesOfHigherPrincipalUnitGroupOfWithZeroValuationScaled, F] rw [class_eq_subOne expLogu b0 rfl hb0, class_eq_subOne u a0 rfl ha0] exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ + principalUnitSuccQuotOfIdealPow_eq_of_sub_mem_succ F n hn b a hdiff /-- The deep exponential–logarithm equivalence, additive finite-level defect: the evaluated diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean index e61e7b1270..7f3617ee9e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -396,7 +396,7 @@ theorem logOnePlusSeriesField_eq_logOnePlusSeries_mk0 logOnePlusSeriesFieldOfWithZeroValuation v x hnK = logOnePlusSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - simp [logOnePlusSeriesFieldOfWithZeroValuation, + simp? [logOnePlusSeriesFieldOfWithZeroValuation, logOnePlusSeriesOfWithZeroValuation] apply tsum_congr intro n @@ -421,7 +421,7 @@ theorem expSeriesField_eq_expSeries_mk0 expSeriesFieldOfWithZeroValuation v x hnK = expSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - simp [expSeriesFieldOfWithZeroValuation, expSeriesOfWithZeroValuation] + simp? [expSeriesFieldOfWithZeroValuation, expSeriesOfWithZeroValuation] apply tsum_congr intro n exact expSeriesTermField_eq_expSeriesTerm_mk0 hx hnK n diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 7a640c6681..41c83b35d6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -35,6 +35,23 @@ map `κ((X)) -> K` by first evaluating `κ⟦X⟧` at `X = π`, then using the localization description `κ((X)) = κ⟦X⟧[X⁻¹]`. -/ +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 @@ -58,7 +75,7 @@ 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 := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerRingHomOfCharP + residueTeichmullerRingHomOfCharP (F := F) p hcard /-- The Teichmuller coefficient-field embedding `κ -> K` used in the @@ -67,7 +84,7 @@ abbrev coeffHom [Finite F.residueField] (p : ℕ) [Fact p.Prime] [CharP F.valuationSubring p] {n : ℕ+} (hcard : Nat.card F.residueField = p ^ (n : ℕ)) : F.residueField →+* K := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerFieldHomOfCharP + residueTeichmullerFieldHomOfCharP (F := F) p hcard /-- The Teichmuller section is a representative system for the residue field. -/ @@ -79,7 +96,7 @@ noncomputable def teichmullerRepresentativeSystem [Finite F.residueField] residue_repr := by intro a have hcomp := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueMap_comp_residueTeichmullerRingHomOfCharP + residueMap_comp_residueTeichmullerRingHomOfCharP (F := F) p hcard simpa [coeffSubringHom, RingHom.comp_apply] using congrFun (congrArg DFunLike.coe hcomp) a @@ -943,7 +960,7 @@ noncomputable def laurentImageSubfieldNontriviallyNormedField ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := by let Γ : Type v := @@ -959,7 +976,7 @@ noncomputable def laurentImageSubfieldNontriviallyNormedField _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let piSub : F.laurentImageSubfield p hcard π hπ := F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ (algebraMap F.residueField⟦X⟧ F.residueField⸨X⸩ @@ -1002,7 +1019,7 @@ noncomputable def laurentImageSubfieldNormedAlgebra ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ @@ -1013,7 +1030,7 @@ noncomputable def laurentImageSubfieldNormedAlgebra ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ @@ -1036,7 +1053,7 @@ theorem finiteDimensional_over_laurentImageSubfield ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ @@ -1050,7 +1067,7 @@ theorem finiteDimensional_over_laurentImageSubfield ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ @@ -1120,7 +1137,7 @@ theorem finiteDimensional_over_laurentSeries ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF)) let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField (F.laurentImageSubfield p hcard π hπ) := F.laurentImageSubfieldNontriviallyNormedField p hcard π hπ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean index 2f38d8c697..87e163d6fe 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -25,6 +25,31 @@ This file connects the principal-unit decomposition proved in to a `ℤᵐ⁰`-valued complete discrete valuation. -/ +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 @@ -58,15 +83,15 @@ theorem exists_roots_principalUnit_uniformizer_zpow_of_completeDVF (p : F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) ^ n := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ simpa [V] using exists_roots_principalUnit_uniformizer_zpow_of_zeroSubgroup_eq_unitGroup (F := F) V hzero hπV x @@ -91,15 +116,15 @@ theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_completeDVF (Units.mk0 (π : K) hπ.ne_zero) ^ n ↔ ζ = η ∧ p = q ∧ m = n := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (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 @@ -112,15 +137,15 @@ noncomputable def fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : fieldUnitDecompositionFactors F ≃* Kˣ := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ exact fieldUnitsEquivRootsPrincipalUnitsUniformizerOfZeroSubgroupEqUnitGroup (F := F) V hzero hπV @@ -145,15 +170,15 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply (z.1.2 : F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) ^ Multiplicative.toAdd z.2 := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ have happ := fieldUnitsEquivRootsPrincipalUnitsUniformizer_apply F V @@ -172,12 +197,12 @@ theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipa (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (z : fieldUnitDecompositionFactors F) : - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val + ((multiplicativeIntegerValuationOfUniformizer F) hπ).val (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2 := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : ∀ y : Kˣ, y ∈ V.zeroSubgroup ↔ ∃ u : F.valuationSubringˣ, @@ -188,12 +213,12 @@ theorem multiplicativeIntegerValuationOfUniformizer_fieldUnitsEquivRootsPrincipa (F := F) V (by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ) y have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ have hunit : valuationSubringUnitFieldUnitHom F (z.1.1 : F.valuationSubringˣ) * @@ -214,7 +239,7 @@ theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer (F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, v} K) [Finite F.residueField] {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (z : fieldUnitDecompositionFactors F) : - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (uniformizerValueExponent F) hπ (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ z) = Multiplicative.toAdd z.2 := @@ -233,7 +258,7 @@ theorem uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer_s Multiplicative.toAdd ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (uniformizerValueExponent F) hπ x := by have h := uniformizerValueExponent_fieldUnitsEquivRootsPrincipalUnitsUniformizer @@ -254,21 +279,21 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd ((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).2 = Multiplicative.ofAdd - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + ((uniformizerValueExponent F) hπ x) := by let E := fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ have h : Multiplicative.toAdd ((E.symm x).2) = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (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 - ((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + ((uniformizerValueExponent F) hπ x) := by rw [h] @@ -292,7 +317,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformiz (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) * (Units.mk0 (π : K) hπ.ne_zero) ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (uniformizerValueExponent F) hπ x = x := by let E := @@ -300,7 +325,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformiz F hπ have hexp : Multiplicative.toAdd ((E.symm x).2) = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (uniformizerValueExponent F) hπ x := by simp [E] calc @@ -309,7 +334,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformiz valuationSubringUnitFieldUnitHom F (((E.symm x).1.2 : F.valuationSubringˣ)) * (Units.mk0 (π : K) hπ.ne_zero) ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (uniformizerValueExponent F) hπ x = valuationSubringUnitFieldUnitHom F (((E.symm x).1.1 : F.valuationSubringˣ)) * @@ -341,7 +366,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_unifo (((fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm x).1.2 : F.valuationSubringˣ) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (-((uniformizerValueExponent F) hπ x)) := by let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero let u : Kˣ := @@ -353,7 +378,7 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_unifo F hπ).symm x).1.2 : F.valuationSubringˣ) have hux : u * ϖ ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (uniformizerValueExponent F) hπ x = x := by simpa [u, ϖ] using fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_factors_mul_uniformizer_zpow @@ -361,11 +386,11 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_unitPart_eq_mul_unifo calc u = u * 1 := by simp _ = u * (ϖ ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x * - ϖ ^ (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := by + (uniformizerValueExponent F) hπ x * + ϖ ^ (-((uniformizerValueExponent F) hπ x))) := by rw [← zpow_add, add_neg_cancel, zpow_zero] _ = x * ϖ ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (-((uniformizerValueExponent F) hπ x)) := by rw [← mul_assoc, hux] @@ -378,22 +403,22 @@ theorem fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (-((uniformizerValueExponent F) hπ x)) ∈ F.valuation.valuationSubring.unitGroup := by let V : MultiplicativeIntegerValuation Kˣ := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer F) hπ have hzero : V.zeroSubgroup = F.valuation.valuationSubring.unitGroup := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ + (multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup F) hπ have hπV : V.IsUniformizer (Units.mk0 (π : K) hπ.ne_zero) := by simpa [V] using - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ + (multiplicativeIntegerValuationOfUniformizer_isUniformizer F) hπ have hmem : x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) ∈ + (-((uniformizerValueExponent F) hπ x)) ∈ V.zeroSubgroup := by rw [V.mem_zeroSubgroup_iff, V.val_mul, V.val_uniformizer_zpow hπV] simp [V] @@ -407,7 +432,7 @@ noncomputable def fieldUnitUniformizerUnitPart (x : Kˣ) : F.valuationSubringˣ := F.valuation.valuationSubring.unitGroupMulEquiv ⟨x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (-((uniformizerValueExponent F) hπ x)), fieldUnitsEquivRootsPrincipalUnitsUniformizer_unitPart_mem_unitGroup F hπ x⟩ @@ -424,7 +449,7 @@ theorem valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart valuationSubringUnitFieldUnitHom F (fieldUnitUniformizerUnitPart F hπ x) = x * (Units.mk0 (π : K) hπ.ne_zero) ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (-((uniformizerValueExponent F) hπ x)) := by apply Units.ext simp [valuationSubringUnitFieldUnitHom, fieldUnitUniformizerUnitPart] @@ -479,8 +504,8 @@ theorem uniformizerValueExponent_eq_of_mrangeRestrict_eq (hxy : (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (y : K) = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict F) (x : K)) : - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (uniformizerValueExponent F) hπ y = + (uniformizerValueExponent F) hπ x := by have hval : F.valuation (y : K) = F.valuation (x : K) := congrArg Subtype.val hxy @@ -489,16 +514,16 @@ theorem uniformizerValueExponent_eq_of_mrangeRestrict_eq F) hπ).1 calc (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = + (uniformizerValueExponent F) hπ y = (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) y := by - rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + 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π ^ - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (uniformizerValueExponent F) hπ x := by - rw [(_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] /-- The uniformizer exponent is locally constant for the range-restricted valuation topology. -/ @@ -510,8 +535,8 @@ theorem eventually_uniformizerValueExponent_eq_mrangeRestrict (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) ∀ᶠ y : Kˣ in 𝓝 x, - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (uniformizerValueExponent F) hπ y = + (uniformizerValueExponent F) hπ x := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom @@ -556,7 +581,7 @@ theorem continuous_uniformizerValueExponent_mrangeRestrict (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) := (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) Continuous (fun x : Kˣ => - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ + (uniformizerValueExponent F) hπ x) := by let Γ : Type v := MonoidHom.mrange F.valuation.toMonoidWithZeroHom @@ -567,7 +592,7 @@ theorem continuous_uniformizerValueExponent_mrangeRestrict rw [continuousAt_def] intro s hs have hxmem : - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x + (uniformizerValueExponent F) hπ x ∈ s := mem_of_mem_nhds hs exact @@ -576,7 +601,7 @@ theorem continuous_uniformizerValueExponent_mrangeRestrict F hπ x) (fun y hy => by change - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent + (uniformizerValueExponent F) hπ y ∈ s rw [hy] exact hxmem) @@ -596,7 +621,7 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_snd_mrange (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) have hval : Continuous (fun x : Kˣ => - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (uniformizerValueExponent F) hπ x) := continuous_uniformizerValueExponent_mrangeRestrict F hπ @@ -623,7 +648,7 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict let ϖ : Kˣ := Units.mk0 (π : K) hπ.ne_zero have hval : Continuous (fun x : Kˣ => - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) + (uniformizerValueExponent F) hπ x) := continuous_uniformizerValueExponent_mrangeRestrict F hπ @@ -633,14 +658,14 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict have hfield : Continuous (fun x : Kˣ => x * ϖ ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x))) := + (-((uniformizerValueExponent F) hπ x))) := continuous_id.mul (hpow.comp hval) rw [Units.continuous_iff] constructor · have hfieldK : Continuous (fun x : Kˣ => ((x * ϖ ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ) : K)) := + (-((uniformizerValueExponent F) hπ x)) : Kˣ) : K)) := Units.continuous_val.comp hfield have hcoerced : Continuous (fun x : Kˣ => @@ -663,7 +688,7 @@ theorem continuous_fieldUnitUniformizerUnitPart_mrangeRestrict · have hfieldInvK : Continuous (fun x : Kˣ => (((x * ϖ ^ - (-((_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x)) : Kˣ)⁻¹ : + (-((uniformizerValueExponent F) hπ x)) : Kˣ)⁻¹ : Kˣ) : K)) := Units.continuous_val.comp hfield.inv have hcoercedInv : @@ -1372,7 +1397,7 @@ theorem roots_principalUnit_uniformizer_zpow_eq_iff_of_withZeroValuation dsimp intro ζ η p q m n simpa [F, V] using - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.roots_principalUnit_uniformizer_zpow_eq_iff + roots_principalUnit_uniformizer_zpow_eq_iff F V hzero hϖV ζ η p q m n end higherPrincipalUnitGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean index 4584d82a81..d713ad9c1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean @@ -16,6 +16,19 @@ the structure theorem for first principal units. The Teichmuller factor is the cyclic group of order `q - 1`, with its (necessarily discrete) topology. -/ +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 @@ -77,19 +90,19 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZMod 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.residueRootsOfUnityGroup F := by + 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ˣ)) ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F := + residueRootsOfUnityGroup F := (zmodCyclicMulEquiv (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + (residueRootsOfUnityEquivResidueFieldUnits F).symm haveI : Finite - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + (residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv + (residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv exact { e with continuous_toFun := continuous_of_discreteTopology @@ -134,7 +147,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi change Finite (IsLocalRing.ResidueField v.valuationSubring) infer_instance letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃ₜ* Kˣ := by + fieldUnitDecompositionFactors F ≃ₜ* Kˣ := by let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v @@ -164,7 +177,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi inferInstance let factorsTopology (t : TopologicalSpace K) : TopologicalSpace - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + (fieldUnitDecompositionFactors F) := letI : TopologicalSpace K := t inferInstance @@ -179,7 +192,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi let e := E.toMulEquiv have heContinuous : @Continuous - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + (fieldUnitDecompositionFactors F) Kˣ (factorsTopology restricted.toTopologicalSpace) @@ -188,7 +201,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi have heSymmContinuous : @Continuous Kˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + (fieldUnitDecompositionFactors F) (unitsTopology restricted.toTopologicalSpace) (factorsTopology restricted.toTopologicalSpace) e.symm := by @@ -198,7 +211,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi { e with continuous_toFun := by change @Continuous - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + (fieldUnitDecompositionFactors F) Kˣ (factorsTopology direct.toTopologicalSpace) @@ -208,7 +221,7 @@ noncomputable def fieldUnitsContinuousMulEquivRootsPrincipalUnitsUniformizerOfWi continuous_invFun := by change @Continuous Kˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors + (fieldUnitDecompositionFactors F) (unitsTopology direct.toTopologicalSpace) (factorsTopology direct.toTopologicalSpace) e.symm @@ -228,7 +241,7 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation infer_instance letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Multiplicative (ZMod (Nat.card F.residueField - 1)) ≃ₜ* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F := by + residueRootsOfUnityGroup F := by let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v haveI : Finite F.residueField := by @@ -236,17 +249,17 @@ noncomputable def residueRootsOfUnityContinuousMulEquivZModOfWithZeroValuation infer_instance letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v change Multiplicative (ZMod (Nat.card F.residueField - 1)) ≃ₜ* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F + residueRootsOfUnityGroup F rw [← Nat.card_units F.residueField] let e : Multiplicative (ZMod (Nat.card F.residueFieldˣ)) ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F := + residueRootsOfUnityGroup F := (zmodCyclicMulEquiv (G := F.residueFieldˣ) (inferInstance : IsCyclic F.residueFieldˣ)).trans - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm + (residueRootsOfUnityEquivResidueFieldUnits F).symm haveI : Finite - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + (residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv + (residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv exact { e with continuous_toFun := continuous_of_discreteTopology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean index 321012037d..d3a934068b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -19,6 +19,59 @@ family in the principal-unit inverse limit, proves continuity and bijectivity, and packages the resulting topological additive equivalence. -/ +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 @@ -49,7 +102,7 @@ namespace LocalFieldTheory.DiscreteValuationField namespace CompleteDVF namespace higherPrincipalUnitGroup -open LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup open Internal variable {K : Type u} [Field K] @@ -89,7 +142,7 @@ noncomputable def iwasawaSeedIdeal (n : ℕ) (i : Fin (iwasawaResidueRank F)) : ((F.maximalIdeal ^ n : Ideal F.valuationSubring) : Type u) := DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + (classFieldResidueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i)) /-- @@ -103,7 +156,7 @@ i) * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (i : Fin (iwasawaResidueRank F)) : (iwasawaSeedIdeal F hpi n i : F.valuationSubring) = - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + classFieldResidueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n := rfl @@ -113,9 +166,9 @@ noncomputable def iwasawaSeedAtLevel {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup + classFieldPrincipalUnitOneAddOfMemPowSubgroup F.toCompleteDVF hn (iwasawaSeedIdeal F hpi n i) (iwasawaSeedIdeal F hpi n i).property @@ -131,14 +184,14 @@ F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : (((iwasawaSeedAtLevel F hpi n hn i : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubring) = - 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + 1 + classFieldResidueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n := by rw [iwasawaSeedAtLevel, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPowSubgroup_val, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitOneAddOfMemPow_val] + classFieldPrincipalUnitOneAddOfMemPowSubgroup_val, + classFieldPrincipalUnitOneAddOfMemPow_val] rfl /-- The same generator regarded as a first principal unit, so that the @@ -148,7 +201,7 @@ noncomputable def iwasawaSeed {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 := ⟨(iwasawaSeedAtLevel F hpi n hn i : F.valuationSubringˣ), LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone @@ -167,10 +220,10 @@ i) * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : (((iwasawaSeed F hpi n hn i : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubring) = - 1 + LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + 1 + classFieldResidueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) * pi ^ n := by exact iwasawaSeedAtLevel_val F hpi n hn i @@ -181,25 +234,25 @@ i) * pi ^ n`. {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn (Additive.ofMul - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n (iwasawaSeedAtLevel F hpi n hn i))) = iwasawaResidueBasis F i := by let r : F.valuationSubring := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueTeichmullerLift F.toCompleteDVF + classFieldResidueTeichmullerLift F.toCompleteDVF (iwasawaResidueBasis F i) let e := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn have hs := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer_symm_residue F.toCompleteDVF hpi n hn r have he := congrArg e hs simpa [e, r, iwasawaSeedAtLevel, iwasawaSeedIdeal, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotOfIdealPow_apply, - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueMap_residueTeichmullerLift] using he.symm + 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 @@ -211,10 +264,10 @@ noncomputable def iwasawaLeadingLayerAddEquiv (n : ℕ) (hn : 1 ≤ n) : (Fin (iwasawaResidueRank F) → ZMod F.residueCharacteristic) ≃+ Additive - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuot + (classFieldPrincipalUnitSuccQuot F.toCompleteDVF n) := (iwasawaResidueBasis F).equivFun.symm.toAddEquiv.trans - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + (classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn).symm /-- @@ -229,13 +282,13 @@ Establishes the identity `iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) (n : ℕ) (hn : 1 ≤ n) (i : Fin (iwasawaResidueRank F)) : iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) = Additive.ofMul - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n (iwasawaSeedAtLevel F hpi n hn i)) := by let e := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotAddEquivResidueOfUniformizer + classFieldPrincipalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn let z := Additive.ofMul - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitSuccQuotMk F.toCompleteDVF n + (classFieldPrincipalUnitSuccQuotMk F.toCompleteDVF n (iwasawaSeedAtLevel F hpi n hn i)) calc iwasawaLeadingLayerAddEquiv F hpi n hn (Pi.single i 1) = @@ -288,15 +341,15 @@ higher-unit level. -/ noncomputable def principalUnitPadicSmulAtLevel (F : LocalField.{u, v} K) (r : ℕ) (hr : 1 ≤ r) (a : ℤ_[F.residueCharacteristic]) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) (hx : (x : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) r) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) r := ⟨(Additive.toMul (a • Additive.ofMul x) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1), principalUnitPadic_smul_mem_higher F hr a x hx⟩ @@ -306,10 +359,10 @@ 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 : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) (hx : (x : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) r) : principalUnitSuccQuotMk F.toCompleteDVF r (principalUnitPadicSmulAtLevel F r hr a x hx) = @@ -321,9 +374,9 @@ theorem principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val ((principalUnitPadicSmulAtLevel F r hr a x hx / principalUnitPadicSmulAtLevel F r hr ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) x hx : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) r) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) obtain ⟨b, hb⟩ := exists_padicInt_sub_toZMod_val_eq_residueCharacteristic_mul F a @@ -333,16 +386,16 @@ theorem principalUnitSuccQuotMk_padicSmulAtLevel_eq_toZMod_val rw [← hb] at hdeep change (((Additive.toMul (a • Additive.ofMul x) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) / (Additive.toMul (((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) • Additive.ofMul x) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) have hsub := sub_smul a ((PadicInt.toZMod a).val : ℤ_[F.residueCharacteristic]) @@ -356,7 +409,7 @@ noncomputable def principalUnitLeadingCoefficientAddHom {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (r : ℕ) (hr : 1 ≤ r) : - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + Additive (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) r) →+ F.residueField := (principalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi r hr).toAddMonoidHom.comp @@ -388,11 +441,11 @@ theorem principalUnitLeadingCoefficientAddHom_eq_zero_iff_mem_succ {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (x : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) = 0 ↔ ((x : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := by let e := principalUnitSuccQuotAddEquivResidueOfUniformizer F.toCompleteDVF hpi n hn @@ -475,7 +528,7 @@ noncomputable def principalUnitOneAddUniformizerPowAtLevel {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n := principalUnitOneAddOfMemPowSubgroup F.toCompleteDVF hn (DVF.maximalIdealPowMulUniformizerPowMap F.toDVF hpi n r) @@ -492,7 +545,7 @@ F.valuationSubring) = 1 + r * pi ^ n`. (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (r : F.valuationSubring) : (((principalUnitOneAddUniformizerPowAtLevel F hpi n hn r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubring) = 1 + r * pi ^ n := by rw [principalUnitOneAddUniformizerPowAtLevel, @@ -528,16 +581,16 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] {n : ℕ} (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) (hx : (x : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : (((x ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := by rw [LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.mem_iff] @@ -555,7 +608,7 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul simpa [pow_mul] using h have heq : ((((x ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubring) - 1) = (((x : F.valuationSubringˣ) : F.valuationSubring) - 1) ^ @@ -577,9 +630,9 @@ theorem pow_residueCharacteristic_pow_mem_higher_mul /-- Inclusion `U^n -> U^1`. -/ def higherUnitToFirst (F : LocalField.{u, v} K) (n : ℕ) (hn : 1 ≤ n) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 := ⟨(x : F.valuationSubringˣ), LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone @@ -599,12 +652,12 @@ noncomputable def principalUnitFrobeniusAtLevel (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := ⟨((higherUnitToFirst F n hn x) ^ (F.residueCharacteristic ^ s) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1), pow_residueCharacteristic_pow_mem_higher_mul F s (higherUnitToFirst F n hn x) x.property⟩ @@ -641,7 +694,7 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : let m := n * F.residueCharacteristic ^ s let hm : 1 ≤ m := one_le_mul_residueCharacteristic_pow F hn s @@ -660,7 +713,7 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) let r : F.valuationSubring := residueTeichmullerLift F.toCompleteDVF lead - let y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + let y : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n := principalUnitOneAddUniformizerPowAtLevel F hpi n hn r have hyLead : @@ -678,15 +731,15 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul y) exact hyLead.symm have hxyDeep : - (((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((x / y : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := (principalUnitSuccQuotMk_eq_iff_div_mem F.toCompleteDVF n x y).1 hxyQuot - let d : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + let d : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := - ⟨((x / y : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ⟨((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) @@ -698,10 +751,10 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius have hdPow' : ((((higherUnitToFirst F (n + 1) (Nat.succ_le_succ (Nat.zero_le n)) d) ^ q : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hlevel (by @@ -715,10 +768,10 @@ theorem principalUnitLeadingCoefficientAddHom_frobenius change (((principalUnitFrobeniusAtLevel F n hn s x / principalUnitFrobeniusAtLevel F n hn s y : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) m) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) simpa [principalUnitFrobeniusAtLevel, higherUnitToFirst, d, q, m, div_pow] using hdPow' @@ -785,7 +838,7 @@ theorem principalUnitLeadingCoefficientAddHom_padicSmul_iwasawaSeed have hxk : xk = (iwasawaSeedAtLevel F hpi r hr i) ^ k := by apply Subtype.ext exact congrArg - (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (fun z : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) (principalUnitPadic_nsmul_eq_pow F k (iwasawaSeed F hpi r hr i)) @@ -821,7 +874,7 @@ noncomputable def iwasawaGn (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) : (Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) →ₗ[ℤ_[F.residueCharacteristic]] - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + Additive (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) := Fintype.linearCombination ℤ_[F.residueCharacteristic] (fun i => Additive.ofMul (iwasawaSeed F hpi n hn i)) @@ -851,9 +904,9 @@ theorem iwasawaGn_mem_higher (n : ℕ) (hn : 1 ≤ n) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : ((Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n := by classical rw [iwasawaGn_apply] @@ -865,18 +918,18 @@ theorem iwasawaGn_mem_higher change ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) * ((Additive.toMul (∑ j ∈ s, a j • Additive.ofMul (iwasawaSeed F hpi n hn j)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n - apply (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + apply (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n).mul_mem · exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.principalUnitPadic_smul_mem_higher + classFieldPrincipalUnitPadic_smul_mem_higher F hn (a i) (iwasawaSeed F hpi n hn i) (iwasawaSeedAtLevel F hpi n hn i).property · exact ih @@ -888,10 +941,10 @@ noncomputable def iwasawaGnAtLevel (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n := ⟨(Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1), iwasawaGn_mem_higher F hpi n hn a⟩ @@ -915,27 +968,27 @@ theorem additive_iwasawaGnAtLevel_eq_sum apply Subtype.ext change ((Additive.toMul (iwasawaGn F hpi n hn a) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) := by intro s induction s using Finset.induction_on with @@ -945,22 +998,22 @@ theorem additive_iwasawaGnAtLevel_eq_sum change ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) * _ have hfirst : ((Additive.toMul (a i • Additive.ofMul (iwasawaSeed F hpi n hn i)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) := rfl rw [hfirst, ih] simpa only [Finset.sum_filter, Finset.mem_univ, ↓reduceIte] using @@ -1022,13 +1075,13 @@ noncomputable def iwasawaGnScaledAtLevel (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (s : ℕ) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := ⟨(Additive.toMul (iwasawaGn F hpi n hn ((F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • a)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1), by rw [iwasawaGn_residueCharacteristic_pow_smul_eq_pow] exact pow_residueCharacteristic_pow_mem_higher_mul F s @@ -1051,7 +1104,7 @@ theorem iwasawaGnScaledAtLevel_eq_frobenius (iwasawaGnAtLevel F hpi n hn a) := by apply Subtype.ext exact congrArg - (fun z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (fun z : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => (z : F.valuationSubringˣ)) (iwasawaGn_residueCharacteristic_pow_smul_eq_pow F hpi n hn s a) @@ -1084,17 +1137,17 @@ theorem exists_iwasawaGnScaled_mul_mem_succ {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) (s : ℕ) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : ∃ a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic], (((x / iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s + 1) := by let m : ℕ := n * F.residueCharacteristic ^ s @@ -1129,9 +1182,9 @@ theorem exists_iwasawaGnScaled_mul_mem_succ rw [principalUnitLeadingCoefficientAddHom_iwasawaGnScaledAtLevel, hcoord, hbeta] change (x / iwasawaGnScaledAtLevel F hpi n hn s a) ∈ - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) m) apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF m _).1 rw [map_div] @@ -1161,11 +1214,11 @@ theorem iwasawaGnScaled_mem_succ_iff_exists_residueCharacteristic_smul (n : ℕ) (hn : 1 ≤ n) (s : ℕ) (a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic]) : (((iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s + 1) ↔ ∃ b : Fin (iwasawaResidueRank F) → @@ -1223,11 +1276,11 @@ theorem iwasawa_formula_two ℤ_[F.residueCharacteristic], a = (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • b) ↔ ¬ (((iwasawaGnScaledAtLevel F hpi n hn s a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s + 1) := by exact (not_congr @@ -1266,12 +1319,12 @@ theorem principalUnit_residueCharacteristic_smul_eq_zero (F : LocalField.{u, v} K) [CharP K F.residueCharacteristic] (x : Additive - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1)) (hx : (F.residueCharacteristic : ℤ_[F.residueCharacteristic]) • x = 0) : x = 0 := by - let u : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + let u : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 := Additive.toMul x have hpowAdd : Additive.ofMul (u ^ F.residueCharacteristic) = 0 := by change (F.residueCharacteristic : @@ -1283,7 +1336,7 @@ theorem principalUnit_residueCharacteristic_smul_eq_zero let z : K := (((u : F.valuationSubringˣ) : F.valuationSubring) : K) have hpowK : z ^ F.residueCharacteristic = 1 := by simpa [z] using congrArg - (fun w : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (fun w : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => ((((w : F.valuationSubringˣ) : F.valuationSubring) : K))) hpow have hdiffpow : (z - 1) ^ F.residueCharacteristic = 0 := by @@ -1325,11 +1378,11 @@ theorem forall_exists_iwasawaGn_eq_pow_smul_of_eq_zero obtain ⟨b, hab, hb⟩ := ih have hscaledMem : (((iwasawaGnScaledAtLevel F hpi n hn 0 b : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ 0)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ 0 + 1) := by simp [iwasawaGnScaledAtLevel, hb] @@ -1467,15 +1520,15 @@ theorem exists_iwasawaGn_mul_mem_succ {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (n : ℕ) (hn : 1 ≤ n) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : ∃ a : Fin (iwasawaResidueRank F) → ℤ_[F.residueCharacteristic], (((x / iwasawaGnAtLevel F hpi n hn a : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n + 1) := by let lead : F.residueField := principalUnitLeadingCoefficientAddHom F hpi n hn (Additive.ofMul x) @@ -1500,9 +1553,9 @@ theorem exists_iwasawaGn_mul_mem_succ simp_rw [hcmod] simp [c, lead] change (x / iwasawaGnAtLevel F hpi n hn a) ∈ - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n) apply (principalUnitSuccQuotMk_eq_one_iff F.toCompleteDVF n _).1 rw [map_div] @@ -1539,7 +1592,7 @@ namespace LocalFieldTheory.DiscreteValuationField namespace CompleteDVF namespace higherPrincipalUnitGroup -open LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup open Internal variable {K : Type u} [Field K] @@ -1723,7 +1776,7 @@ noncomputable def iwasawaDegreeTerm {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (n : ℕ) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 := if hn : 1 ≤ n ∧ Nat.Coprime n F.residueCharacteristic then Additive.toMul @@ -1745,10 +1798,10 @@ theorem iwasawaDegreeTerm_eq_iwasawaGnScaled (F.residueCharacteristic ^ s : ℤ_[F.residueCharacteristic]) • b) : ((iwasawaDegreeTerm F hpi a d.1 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) = ((iwasawaGnScaledAtLevel F hpi d.1 d.property.1 s b : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (d.1 * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) := by classical @@ -1778,17 +1831,17 @@ theorem iwasawaDegreeTerm_mem_higher (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (n : ℕ) : ((iwasawaDegreeTerm F hpi a n : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((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 (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + · exact (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) n).one_mem /-- Establishes the identity `iwasawaDegreeTerm F hpi (0 : iwasawaDomain F) n = 1`. -/ @@ -1837,7 +1890,7 @@ noncomputable def iwasawaPartialProduct {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) (a : iwasawaDomain F) (r : ℕ) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 := ∏ n ∈ Finset.range (r + 1), iwasawaDegreeTerm F hpi a n @@ -1964,15 +2017,15 @@ theorem exists_iwasawaPartialProduct_div_mem_higher [CharP K F.residueCharacteristic] {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) - (x : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (x : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) (r : ℕ) : ∃ a : iwasawaDomain F, (∀ j, r < j.1.1 → a j = 0) ∧ (((x / iwasawaPartialProduct F hpi a r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1) := by classical induction r with @@ -1997,11 +2050,11 @@ theorem exists_iwasawaPartialProduct_div_mem_higher rw [← hdepth] exact Nat.le_mul_of_pos_right n (pow_pos F.residueCharacteristic_prime.pos s) - let z : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + let z : ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s) := ⟨((x / iwasawaPartialProduct F hpi a r : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ), by simpa [hdepth] using haDeep⟩ obtain ⟨beta, hbeta⟩ := @@ -2040,11 +2093,11 @@ theorem exists_iwasawaPartialProduct_div_mem_higher rw [hpartial] have hbeta' : (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1 + 1) := by rw [← hdepth] exact hbeta @@ -2052,11 +2105,11 @@ theorem exists_iwasawaPartialProduct_div_mem_higher (((x / (iwasawaPartialProduct F hpi a r * Additive.toMul (iwasawaGn F hpi n hn b)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) : F.valuationSubringˣ) = (((z / iwasawaGnScaledAtLevel F hpi n hn s beta : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (n * F.residueCharacteristic ^ s)) : F.valuationSubringˣ) : F.valuationSubringˣ) := by @@ -2065,12 +2118,13 @@ theorem exists_iwasawaPartialProduct_div_mem_higher ((iwasawaPartialProduct F hpi a r : F.valuationSubringˣ) * ((Additive.toMul (iwasawaGn F hpi n hn b) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ)) = + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : + F.valuationSubringˣ)) = (x : F.valuationSubringˣ) / (iwasawaPartialProduct F hpi a r : F.valuationSubringˣ) / ((Additive.toMul (iwasawaGn F hpi n hn b) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) exact div_mul_eq_div_div _ _ _ rw [hunitEq] @@ -2096,9 +2150,9 @@ theorem Internal.principalUnitQuotientCarrier_mk_iwasawaPartialProduct_eq_of_le | @succ r hmr ihr => rw [iwasawaPartialProduct, Finset.prod_range_succ] let N := - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) change QuotientGroup.mk' N @@ -2115,9 +2169,9 @@ theorem Internal.principalUnitQuotientCarrier_mk_iwasawaPartialProduct_eq_of_le (N := N) (iwasawaDegreeTerm F hpi a (r + 1))).2 change ((iwasawaDegreeTerm F hpi a (r + 1) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) exact LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone @@ -2174,9 +2228,9 @@ theorem Internal.surjective_iwasawaGlobalInverseLimitCarrier_coordinate (iwasawaGlobalInverseLimitCarrier F hpi a).1 r) := by intro q obtain ⟨x, rfl⟩ := QuotientGroup.mk'_surjective - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1)) q obtain ⟨a, _haSupport, ha⟩ := exists_iwasawaPartialProduct_div_mem_higher F hpi x r @@ -2187,7 +2241,7 @@ theorem Internal.surjective_iwasawaGlobalInverseLimitCarrier_coordinate QuotientGroup.mk x symm let U := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF + toPrincipalUnitFiltration F.toCompleteDVF exact (U.principalUnitSubquotient_mk_eq_iff_div_mem x (iwasawaPartialProduct F hpi a r)).2 ha @@ -2236,7 +2290,7 @@ theorem continuous_adicIwasawaGn (Additive.ofMul (iwasawaSeed F hpi n hn i)) := by fun_prop have hof (x : Additive - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF) 1)) : AdicPrincipalUnits.linearEquivUnderlying F (AdicPrincipalUnits.of F.toCompleteDVF x) = x := rfl @@ -2348,18 +2402,18 @@ theorem Internal.continuous_iwasawaGlobalInverseLimitCarrier exact Continuous.subtype_mk (continuous_pi fun r => by have hcoord : Continuous fun x : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => (E x).1 r := ((continuous_apply r).comp continuous_subtype_val).comp E.continuous change Continuous fun x : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => Internal.principalUnitInverseLimitCarrierEval F.toCompleteDVF r (Internal.principalUnitMulEquivInverseLimitCarrier F.toCompleteDVF x) at hcoord have hquot : Continuous fun x : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1 => (higherPrincipalUnitGroup.toPrincipalUnitFiltration F.toCompleteDVF).principalUnitSubquotientMk 1 (r + 1) x := by @@ -2403,9 +2457,9 @@ noncomputable def Internal.iwasawaGlobalInverseLimitCarrierAddHom rw [iwasawaPartialProduct_add] exact map_mul (QuotientGroup.mk' - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (r + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1))) _ _ /-- The Iwasawa compatible family valued in its type-level prodiscrete model. @@ -2482,7 +2536,7 @@ noncomputable def Internal.iwasawaGlobalAddHom {pi : F.valuationSubring} (hpi : F.valuation.IsUniformizer (pi : K)) : iwasawaDomain F →+ - Additive (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + Additive (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) := (principalUnitAddEquivInverseLimitCarrier F.toCompleteDVF).symm.toAddMonoidHom.comp (iwasawaGlobalInverseLimitCarrierAddHom F hpi) @@ -2536,9 +2590,9 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal (hk : 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic) (hkd : k ≠ d.1) : ((iwasawaDegreeTerm F hpi a k : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := by classical let e : IwasawaDegree F.residueCharacteristic := ⟨k, hk⟩ @@ -2554,7 +2608,7 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal rw [heq, he0] rfl rw [hterm] - exact (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + exact (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).one_mem · obtain ⟨t, c, hec, hc⟩ := exists_pow_smul_iwasawaPrimitive_of_ne_zero F @@ -2574,11 +2628,11 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal Nat.succ_le_of_lt (lt_of_le_of_ne hle hne) have hscaled : (((iwasawaGnScaledAtLevel F hpi e.1 e.property.1 t c : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (e.1 * F.residueCharacteristic ^ t)) : F.valuationSubringˣ) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.antitone F.toCompleteDVF hlevel @@ -2587,9 +2641,9 @@ theorem iwasawaDegreeTerm_mem_succ_of_ne_minimal iwasawaDegreeTerm_eq_iwasawaGnScaled F hpi a e t c hec change ((iwasawaDegreeTerm F hpi a e.1 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) rw [hterm] exact hscaled @@ -2610,9 +2664,9 @@ theorem iwasawaDegreeTerm_not_mem_succ_of_primitive (hb : IwasawaPrimitive F b) (hm : m = d.1 * F.residueCharacteristic ^ s) : ¬ (((iwasawaDegreeTerm F hpi a d.1 : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)) := by have hnotScaled := (iwasawa_formula_two F hpi d.1 d.property.1 s b).1 hb @@ -2650,9 +2704,9 @@ theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero QuotientGroup.mk (iwasawaDegreeTerm F hpi a d.1) := by change (QuotientGroup.mk' - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1))) (∏ k ∈ Finset.range (m + 1), iwasawaDegreeTerm F hpi a k) = @@ -2663,16 +2717,16 @@ theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero by_cases hvalid : 1 ≤ k ∧ Nat.Coprime k F.residueCharacteristic · apply (QuotientGroup.eq_one_iff - (N := (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (N := (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1)) (iwasawaDegreeTerm F hpi a k)).2 change ((iwasawaDegreeTerm F hpi a k : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1) : F.valuationSubringˣ) ∈ - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1) exact iwasawaDegreeTerm_mem_succ_of_ne_minimal F hpi a m d s hm hmin k hvalid hkd @@ -2695,9 +2749,9 @@ theorem Internal.iwasawaGlobalInverseLimitCarrierAddHom_ne_zero_of_ne_zero apply hchosenNot exact (QuotientGroup.eq_one_iff (N := - ((((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + ((((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) (m + 1)).subgroupOf - (((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup + (((classFieldHigherPrincipalUnitGroup F.toCompleteDVF)) 1))) (iwasawaDegreeTerm F hpi a d.1)).1 hpartialOne diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean index db1910397b..cb626c9524 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -31,6 +31,11 @@ that the actual range-restricted local-field valuation still restricts on `ℚ` to the usual `p`-adic valuation, where `p` is the residue characteristic. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + + noncomputable section universe u v @@ -158,12 +163,12 @@ theorem qpadicClosureSubfield_completeSpace _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF CompleteSpace F.qpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace K := F.mrangeRestrict_completeSpace exact @@ -595,7 +600,7 @@ noncomputable def qpadicCompletionToQpadicClosureSubfield letI : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF haveI : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace exact @@ -615,7 +620,7 @@ theorem qpadicCompletionToQpadicClosureSubfield_coe let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace exact @@ -631,12 +636,12 @@ theorem qpadicCompletionToQpadicClosureSubfield_isUniformInducing _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsUniformInducing F.qpadicCompletionToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have : CompleteSpace F.qpadicClosureSubfield := F.qpadicClosureSubfield_completeSpace simpa [qpadicCompletionToQpadicClosureSubfield, @@ -653,12 +658,12 @@ theorem qpadicCompletionToQpadicClosureSubfield_denseRange _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF DenseRange F.qpadicCompletionToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF apply DenseRange.of_comp (g := fun q : WithVal (Rat.padicValuation F.residueCharacteristic) => (q : (Rat.padicValuation F.residueCharacteristic).Completion)) @@ -733,12 +738,12 @@ theorem qpadicNumbersToQpadicClosureSubfield_isUniformInducing _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsUniformInducing F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hcomp : IsUniformInducing (F.qpadicCompletionToQpadicClosureSubfield ∘ @@ -773,12 +778,12 @@ theorem qpadicNumbersToQpadicClosureSubfield_isClosed_range _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF IsClosed (Set.range F.qpadicNumbersToQpadicClosureSubfield) := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hEmbedding : IsUniformEmbedding F.qpadicNumbersToQpadicClosureSubfield := ⟨F.qpadicNumbersToQpadicClosureSubfield_isUniformInducing, @@ -792,12 +797,12 @@ theorem qpadicNumbersToQpadicClosureSubfield_denseRange _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF DenseRange F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF apply DenseRange.of_comp (g := ((↑) : ℚ → ℚ_[F.residueCharacteristic])) have hfun : @@ -817,12 +822,12 @@ theorem qpadicNumbersToQpadicClosureSubfield_surjective _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF Function.Surjective F.qpadicNumbersToQpadicClosureSubfield := by let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF rw [← Set.range_eq_univ] have hdense := F.qpadicNumbersToQpadicClosureSubfield_denseRange have hclosed := F.qpadicNumbersToQpadicClosureSubfield_isClosed_range @@ -868,7 +873,7 @@ noncomputable def qpadicClosureSubfieldNontriviallyNormedField _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF NontriviallyNormedField F.qpadicClosureSubfield := by letI : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF @@ -881,7 +886,7 @@ noncomputable def qpadicClosureSubfieldNontriviallyNormedField _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictRankOne F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let pSub : F.qpadicClosureSubfield := F.ratCastToQpadicClosureSubfield (F.residueCharacteristic : ℚ) have hpSub_coe : @@ -919,14 +924,14 @@ noncomputable def qpadicClosureSubfieldNormedAlgebra _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + 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 := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField F.qpadicClosureSubfield := F.qpadicClosureSubfieldNontriviallyNormedField exact @@ -943,7 +948,7 @@ theorem finiteDimensional_over_qpadicClosureSubfield _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF letI : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF letI : NontriviallyNormedField F.qpadicClosureSubfield := F.qpadicClosureSubfieldNontriviallyNormedField letI : NormedAlgebra F.qpadicClosureSubfield K := @@ -952,7 +957,7 @@ theorem finiteDimensional_over_qpadicClosureSubfield let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField F.qpadicClosureSubfield := F.qpadicClosureSubfieldNontriviallyNormedField let : NormedAlgebra F.qpadicClosureSubfield K := @@ -1016,7 +1021,7 @@ theorem finiteDimensional_over_qpadicNumbers let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF let : NontriviallyNormedField F.qpadicClosureSubfield := F.qpadicClosureSubfieldNontriviallyNormedField let : NormedAlgebra F.qpadicClosureSubfield K := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index d0ab5c785e..ad665f22ab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -14,6 +14,11 @@ exact sequence and packages the algebraic and topological structure of the first principal-unit group. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming + toPrincipalUnitFiltration → + toPrincipalUnitFiltration + + noncomputable section universe u v @@ -376,7 +381,7 @@ noncomputable def mixedFirstPrincipalUnitFiniteQuotientSetup letI : Module.Finite R q := Module.Finite.of_finite let projection : M →ₗ[R] q := F.principalUnitQuotientProjectionLinear n let U := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration + toPrincipalUnitFiltration F.toCompleteDVF let quotientKernel := (U.principalUnitSubgroup (n + 1)).subgroupOf (U.principalUnitSubgroup 1) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean index dac41d545e..b8e1dad393 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -13,6 +13,11 @@ topology and transports integral-basis coordinates through the deep exponential--logarithm equivalence. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming + mrangeRestrictNontriviallyNormedField → + mrangeRestrictNontriviallyNormedField + + noncomputable section universe u v @@ -93,7 +98,7 @@ theorem continuous_qpadicNumbersAlgebra_ofWithZeroValuation (algebraMap ℚ_[p] K) := by let : Valued K F.mrangeValueGroup := restricted let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF change Continuous (fun x : ℚ_[p] => ((F.qpadicNumbersEquivQpadicClosureSubfield x : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean index 73be4f370a..7cadc295c2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -25,6 +25,19 @@ the mixed-characteristic field-unit structure theorem. The comparison is made f constructed in the local-field structure classification, not for a separately assumed scalar action. -/ +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 @@ -111,7 +124,7 @@ theorem qpadicInt_algebraMap_mem_valuationSubring let : Valued K F.mrangeValueGroup := _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF let : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F.toCompleteDVF + mrangeRestrictNontriviallyNormedField F.toCompleteDVF have hcontinuous : Continuous (algebraMap ℚ_[p] K) := by change Continuous (fun x : ℚ_[p] => @@ -284,7 +297,7 @@ theorem valuationSubring_isIntegralClosure_over_qpadicIntegers let : MixedQPadicContext F := mixedQPadicContext F let : Algebra.IsSeparable ℚ_[p] K := by infer_instance exact - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_isIntegralClosure_of_finite_separable + 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 @@ -299,7 +312,7 @@ theorem valuationSubring_moduleFinite_over_qpadicIntegers let : MixedQPadicContext F := mixedQPadicContext F let : Algebra.IsSeparable ℚ_[p] K := by infer_instance exact - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + 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. -/ @@ -315,11 +328,11 @@ theorem valuationSubring_moduleFree_over_qpadicIntegers let : Module.Finite (Examples.Qp.padicCompleteDVF p).valuationSubring F.toCompleteDVF.valuationSubring := - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF let : IsIntegralClosure F.toCompleteDVF.valuationSubring (Examples.Qp.padicCompleteDVF p).valuationSubring K := - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_isIntegralClosure_of_finite_separable + target_valuationSubring_isIntegralClosure_of_finite_separable (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF let : IsFractionRing (Examples.Qp.padicCompleteDVF p).valuationSubring ℚ_[p] := @@ -351,7 +364,7 @@ theorem valuationSubring_finrank_over_qpadicIntegers let : Algebra.IsSeparable ℚ_[p] K := by infer_instance let : IsIntegralClosure F.toCompleteDVF.valuationSubring (Examples.Qp.padicCompleteDVF p).valuationSubring K := - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_isIntegralClosure_of_finite_separable + target_valuationSubring_isIntegralClosure_of_finite_separable (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF let : IsFractionRing (Examples.Qp.padicCompleteDVF p).valuationSubring ℚ_[p] := @@ -511,7 +524,7 @@ theorem valuationSubring_isIntegralClosure_over_padicInt let : Algebra.IsSeparable ℚ_[p] K := by infer_instance let hclosure : IsIntegralClosure F.toCompleteDVF.valuationSubring (Examples.Qp.padicCompleteDVF p).valuationSubring K := - _root_.ValuationTheory.DiscreteValuationField.ValuedExtension.target_valuationSubring_isIntegralClosure_of_finite_separable + target_valuationSubring_isIntegralClosure_of_finite_separable (Examples.Qp.padicCompleteDVF p) F.toCompleteDVF let e : ℤ_[p] ≃+* (Examples.Qp.padicCompleteDVF p).valuationSubring := Examples.Qp.padicIntEquivValuationSubring p diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean index 2a8b3267b9..9a543b58bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -2381,7 +2381,6 @@ theorem card_normQuotient_eq_residueDegree {ϖ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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean index 4366f72001..e69a489dd4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -15,6 +15,39 @@ API to the unit and principal-unit decompositions of a complete discrete valuation field. -/ +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 @@ -34,9 +67,9 @@ unit group of the finite residue field. -/ noncomputable instance finite_residueRootsOfUnityGroup (F : CompleteDVF.{u, v} K) [Finite F.residueField] : Finite - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + (residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits + (residueRootsOfUnityEquivResidueFieldUnits F).symm.toEquiv /-- A nonzero power has only finitely many roots in the valuation-ring unit @@ -81,13 +114,13 @@ noncomputable instance finite_valuationSubringUnits_nthPowerQuotient F.valuationSubringˣ).range) := by let e : F.valuationSubringˣ ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm exact LocalFieldTheory.finite_nthPowerQuotient_of_mulEquiv F.valuationSubringˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + (residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) n e @@ -107,15 +140,15 @@ theorem finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits 1)).range)] : Finite (Kˣ ⧸ (powMonoidHom n : Kˣ →* Kˣ).range) := by let eField : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* F.valuationSubringˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + valuationSubringUnitsEquivRootsTimesPrincipalUnits F let e : Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := @@ -138,15 +171,15 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_unit_nthPowerQuotient n * Nat.card (F.valuationSubringˣ ⧸ (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) := by let eField : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* F.valuationSubringˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + valuationSubringUnitsEquivRootsTimesPrincipalUnits F let e : Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := @@ -170,9 +203,9 @@ theorem card_unit_nthPowerQuotient_eq_mul_roots_principalUnit_nthPowerQuotient Nat.card (F.valuationSubringˣ ⧸ (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = Nat.card - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ + (residueRootsOfUnityGroup F ⧸ (powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) * + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).range) * Nat.card ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ (powMonoidHom n : @@ -182,14 +215,14 @@ theorem card_unit_nthPowerQuotient_eq_mul_roots_principalUnit_nthPowerQuotient 1)).range) := by let e : F.valuationSubringˣ ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm exact LocalFieldTheory.card_nthPowerQuotient_eq_mul_of_mulEquiv_prod F.valuationSubringˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) + (residueRootsOfUnityGroup F) ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) n e /-- On the finite Teichmuller root factor, the `n`-th-power quotient has the @@ -197,25 +230,25 @@ 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 - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ⧸ + (residueRootsOfUnityGroup F ⧸ (powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).range) = + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).range) = Nat.card ((powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) := by + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) := by classical let e : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F ≃* + residueRootsOfUnityGroup F ≃* F.residueFieldˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits + residueRootsOfUnityEquivResidueFieldUnits F have : Finite - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) := + (residueRootsOfUnityGroup F) := Finite.of_equiv F.residueFieldˣ e.symm.toEquiv exact LocalFieldTheory.card_nthPowerQuotient_eq_nthPowerKernel - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) n + (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. -/ @@ -225,7 +258,7 @@ theorem card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) = Nat.card ((powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * Nat.card ((powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) @@ -233,14 +266,14 @@ theorem card_unit_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel 1)).ker) := by let e : F.valuationSubringˣ ≃* - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + (valuationSubringUnitsEquivRootsTimesPrincipalUnits F).symm exact LocalFieldTheory.card_nthPowerKernel_eq_mul_of_mulEquiv_prod F.valuationSubringˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) + (residueRootsOfUnityGroup F) ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) n e /-- For nonzero `n`, the field-unit `n`-torsion kernel is the unit @@ -253,15 +286,15 @@ theorem card_fieldUnits_nthPowerKernel_eq_unit_nthPowerKernel Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) = Nat.card ((powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).ker) := by let eField : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F ≃* + fieldUnitDecompositionFactors F ≃* Kˣ := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let eUnits : - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F × + residueRootsOfUnityGroup F × (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ≃* F.valuationSubringˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + valuationSubringUnitsEquivRootsTimesPrincipalUnits F let e : Kˣ ≃* F.valuationSubringˣ × Multiplicative ℤ := @@ -282,7 +315,7 @@ theorem card_fieldUnits_nthPowerKernel_eq_mul_roots_principalUnit_nthPowerKernel Nat.card ((powMonoidHom n : Kˣ →* Kˣ).ker) = Nat.card ((powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * Nat.card ((powMonoidHom n : ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) @@ -308,7 +341,7 @@ theorem card_unit_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPowerQuot (powMonoidHom n : F.valuationSubringˣ →* F.valuationSubringˣ).range) = Nat.card ((powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * Nat.card ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ (powMonoidHom n : @@ -471,7 +504,7 @@ theorem card_fieldUnits_nthPowerQuotient_eq_mul_rootsKernel_principalUnit_nthPow n * (Nat.card ((powMonoidHom n : - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F) →* (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F)).ker) * + (residueRootsOfUnityGroup F) →* (residueRootsOfUnityGroup F)).ker) * Nat.card ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1 ⧸ (powMonoidHom n : @@ -490,7 +523,7 @@ if the `n`-th powers in `U^1` are exactly `U^m`, then the principal-unit theorem card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq (F : CompleteDVF.{u, v} K) (n m : ℕ) [Finite - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + ((toPrincipalUnitFiltration F).principalUnitSubquotient 1 m)] (hpow : (powMonoidHom n : @@ -507,10 +540,10 @@ theorem card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq →* ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1)).range) = Nat.card - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + ((toPrincipalUnitFiltration F).principalUnitSubquotient 1 m) := by let U := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration + toPrincipalUnitFiltration F let : Finite (U.principalUnitSubgroup 1 ⧸ @@ -564,14 +597,14 @@ theorem card_principalUnit_nthPowerQuotient_eq_residue_pow_of_image_eq 1)).range) = Nat.card F.residueField ^ (m - 1) := by let : Finite - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.toPrincipalUnitFiltration F).principalUnitSubquotient + ((toPrincipalUnitFiltration F).principalUnitSubquotient 1 m) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.finite_principalUnitSubquotient_of_finite_residue + finite_principalUnitSubquotient_of_finite_residue F 1 m rw [card_principalUnit_nthPowerQuotient_eq_subquotient_of_image_eq (F := F) n m hpow] exact - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer + card_principalUnitSubquotient_one_eq_residue_pow_of_uniformizer F hπ hm /-- The field-unit structure theorem logarithmic transport, principal-unit form: any @@ -637,7 +670,6 @@ theorem card_principalUnit_nthPowerQuotient_eq_additive_quotient_of_logEquiv_nsm (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 ⧸ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean index e29eb42a93..8eee01fac8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -1137,7 +1137,6 @@ noncomputable def principalUnitSuccQuotAddEquivResidueOfUniformizer /-- 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) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean index 7579c3f6ef..3f123fef10 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean @@ -14,6 +14,23 @@ ambient valued-extension context; there are no compatibility aliases or extension-marker arguments. -/ +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 @@ -39,7 +56,7 @@ theorem degree_eq_ramificationIndex_mul_residueDegree base.toDVF target.toDVF * ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF := - (ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_mul_residueDegree_eq_degree + (ramificationIndex_mul_residueDegree_eq_degree base target).symm /-- @@ -240,7 +257,7 @@ theorem degree_eq_ramificationIndex_mul_residueDegree_of_finite_separable base.toDVF target.toDVF * ValuationTheory.DiscreteValuationField.ValuedExtension.residueDegree base.toDVF target.toDVF := - (ValuationTheory.DiscreteValuationField.ValuedExtension.ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable + (ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable base target).symm /-- A finite separable extension of the discrete valued fields is defectless. -/ @@ -264,7 +281,7 @@ theorem ramificationIndex_le_degree_of_finite_separable ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF := by let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target exact ramificationIndex_le_degree base target @@ -281,10 +298,10 @@ theorem residueDegree_le_degree_of_finite_separable ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF := by let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleIsTorsionFree_target_valuationSubring_of_finite_separable + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target exact residueDegree_le_degree base target @@ -304,7 +321,7 @@ theorem ramificationIndex_eq_one_iff_residueDegree_eq_degree_of_finite_separable ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF := by let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target constructor · exact residueDegree_eq_degree_of_ramificationIndex_eq_one base target @@ -332,10 +349,10 @@ theorem residueDegree_eq_one_iff_ramificationIndex_eq_degree_of_finite_separable ValuationTheory.DiscreteValuationField.ValuedExtension.degree base.toDVF target.toDVF := by let : Module.Finite base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable base target let : Module.IsTorsionFree base.valuationSubring target.valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleIsTorsionFree_target_valuationSubring_of_finite_separable + moduleIsTorsionFree_target_valuationSubring_of_finite_separable base target constructor · exact ramificationIndex_eq_degree_of_residueDegree_eq_one base target diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean index e0204242f0..82b8b580c2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -858,7 +858,6 @@ theorem card_principalUnitClassInQuotient_eq_mul_of_le {l m n : ℕ} /-- Cardinality form of the class/subquotient identification. -/ theorem card_principalUnitSubquotient_eq_classInQuotient_of_le {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] - [Finite (U.principalUnitSubgroupClassInQuotient m n)] : Nat.card (U.principalUnitSubquotient m n) = Nat.card (U.principalUnitSubgroupClassInQuotient m n) := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean index 777b070265..78b6b82985 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean @@ -14,6 +14,11 @@ This file relates the induced integer valuation to normalized uniformizers, valuation-ring units, and scalar extension of field units. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming + mem_zeroSubgroup_iff → + mem_zeroSubgroup_iff + + noncomputable section universe u @@ -91,7 +96,7 @@ theorem ofWithZeroValuation_zeroSubgroup_eq_unitGroup (ofWithZeroValuation v).zeroSubgroup = v.valuationSubring.unitGroup := by ext x - rw [LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.mem_zeroSubgroup_iff, _root_.Valuation.mem_unitGroup_iff] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean index 00708be2e3..88513d7261 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean @@ -12,6 +12,15 @@ This file packages range restriction as a `LocalField` and exposes the properness and completeness of the resulting topology. -/ +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 @@ -51,7 +60,7 @@ theorem mrangeRestrict_properSpace F.toCompleteDVF) ProperSpace K := by exact - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_properSpace_of_residueField_finite F.toCompleteDVF) + (mrangeRestrict_properSpace_of_residueField_finite F.toCompleteDVF) /-- The range-restricted topology attached to a local-field package is complete. -/ theorem mrangeRestrict_completeSpace @@ -65,7 +74,7 @@ theorem mrangeRestrict_completeSpace F.toCompleteDVF) CompleteSpace K := by exact - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F.toCompleteDVF) + (mrangeRestrict_completeSpace_of_residueField_finite F.toCompleteDVF) end LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index b7d960e388..86572b37eb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -17,6 +17,11 @@ field structures and transports adic completeness, compactness, properness, and completeness. -/ +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 @@ -151,7 +156,7 @@ theorem mem_subfield_of_mrangeRestrict_isClosed_of_forall_valuationSubring_smodE F.valuation ((zInt - b : F.valuationSubring) : K) ≤ F.valuation (((π ^ N : F.valuationSubring) : K)) := by exact - (ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean index c3bd04c253..09254724dc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean @@ -23,6 +23,15 @@ complete discrete valuation back to the topology obtained directly from `Valued.mk' v`. -/ +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 @@ -79,17 +88,17 @@ theorem completeSpace_ofWithZeroValuation let F : CompleteDVF.{u, 0} K := completeDVF v let direct : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let restrictedNormed : NontriviallyNormedField K := - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F + mrangeRestrictNontriviallyNormedField F have : Finite F.residueField := by change Finite (IsLocalRing.ResidueField v.valuationSubring) infer_instance have hcomplete : @CompleteSpace K restrictedNormed.toUniformSpace := by exact - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_completeSpace_of_residueField_finite F + mrangeRestrict_completeSpace_of_residueField_finite F have huniform : direct.toUniformSpace = restrictedNormed.toUniformSpace := by change (Valued.mk' v).toUniformSpace = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + (mrangeRestrictNontriviallyNormedField (completeDVF v)).toUniformSpace calc (Valued.mk' v).toUniformSpace = @@ -97,7 +106,7 @@ theorem completeSpace_ofWithZeroValuation (completeDVF v)).toUniformSpace := valuedMk_uniformSpace_eq_mrangeRestrict v _ = - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField + (mrangeRestrictNontriviallyNormedField (completeDVF v)).toUniformSpace := by rfl let : Valued K (WithZero (Multiplicative ℤ)) := direct diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean index 7ab6d81e2c..78eea4a7fb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean @@ -687,7 +687,7 @@ theorem principalUnits_of_integerUnitsMap_mem_principalUnits_of_unramifiedValuat 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 := + 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 @@ -713,7 +713,7 @@ theorem residueAlgEquiv_card_eq_galoisGroup_card_of_unramifiedValuation [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 + 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] @@ -802,7 +802,7 @@ noncomputable def galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegr [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]) := + Gal(L/K) ≃* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := MulEquiv.ofBijective (galoisGroupResidueAlgEquivHomOfIsIntegralClosure K L) (galoisGroupResidueAlgEquivHomOfIsIntegralClosure_bijective_of_unramifiedValuation K L) @@ -834,14 +834,14 @@ theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_prod_eq_prod_algEquiv_of_u [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (u : 𝓀[L]ˣ) : - Finset.univ.prod (fun σ : Gal(L / K) => + 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) => + (fun σ : Gal(L/K) => Units.mapEquiv (galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ).toMulEquiv u) (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => Units.mapEquiv τ.toMulEquiv u) @@ -859,12 +859,12 @@ theorem galoisGroupResidueAlgEquivOfIsIntegralClosure_sum_eq_sum_algEquiv_of_unr [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (x : 𝓀[L]) : - Finset.univ.sum (fun σ : Gal(L / K) => + 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 σ : Gal(L/K) => galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ x) (fun τ : 𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L] => τ x) (by intro σ; rfl) @@ -880,7 +880,7 @@ theorem galoisGroup_sum_residue_eq_algebraMap_trace_of_unramifiedValuation_of_is [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] (a : 𝒪[L]) : IsLocalRing.residue 𝒪[L] - (Finset.univ.sum fun σ : Gal(L / K) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ a) = algebraMap 𝓀[K] 𝓀[L] (Algebra.trace 𝓀[K] 𝓀[L] (IsLocalRing.residue 𝒪[L] a)) := by @@ -900,9 +900,9 @@ theorem galoisGroup_sum_mul_base_uniformizer_pow_eq_coeff_sum_of_isIntegralClosu [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) (r : 𝒪[L]) : let πL := integerRingMapOfValuationExtension K L (chosenIntegerRingUniformizer K) - Finset.univ.sum (fun σ : Gal(L / K) => + Finset.univ.sum (fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (r * πL ^ n)) = - (Finset.univ.sum fun σ : Gal(L / K) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ r) * πL ^ n := by intro πL rw [Finset.sum_mul] @@ -929,14 +929,14 @@ theorem galoisSum_uniformizerGraded_eq_residueTrace 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) => + (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) => + (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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index 65ddc3de7c..b7d58f62af 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -108,7 +108,7 @@ def galoisGroupIntegerRingEquivHomOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : - Gal(L / K) →* (𝒪[L] ≃+* 𝒪[L]) where + Gal(L/K) →* (𝒪[L] ≃+* 𝒪[L]) where toFun := galoisGroupIntegerRingEquivOfIsIntegralClosure K L map_one' := by ext x @@ -126,7 +126,7 @@ def galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : - MulSemiringAction (Gal(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 @@ -167,7 +167,7 @@ theorem galoisGroupIntegerRingSMulCommClassOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L - SMulCommClass (Gal(L / K)) 𝒪[K] 𝒪[L] := by + SMulCommClass (Gal(L/K)) 𝒪[K] 𝒪[L] := by let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L refine ⟨?_⟩ intro σ x y @@ -191,7 +191,7 @@ theorem galoisGroupIntegerRingFieldSMulDistribClassOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L - SMulDistribClass (Gal(L / K)) 𝒪[L] L := by + SMulDistribClass (Gal(L/K)) 𝒪[L] L := by let := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L refine ⟨?_⟩ intro σ r s @@ -209,12 +209,12 @@ theorem galoisGroupIntegerRing_isGaloisGroup_of_isIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L - IsGaloisGroup (Gal(L / K)) 𝒪[K] 𝒪[L] := by + 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 + exact IsGaloisGroup.of_isFractionRing (Gal(L/K)) 𝒪[K] 𝒪[L] K L /-- The ideal action induced by the actual integral-closure restriction. -/ @[reducible] @@ -223,7 +223,7 @@ def galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : - DistribMulAction (Gal(L / K)) (Ideal 𝒪[L]) := by + DistribMulAction (Gal(L/K)) (Ideal 𝒪[L]) := by letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L exact Ideal.pointwiseDistribMulAction @@ -235,7 +235,7 @@ def galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure [Algebra K L] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] : - MulAction (Gal(L / K)) (Ideal 𝒪[L]) := by + 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. -/ @@ -244,8 +244,8 @@ theorem galoisGroupIntegerRingAction_map_maximalIdeal_of_isIntegralClosure [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] _ + (σ : Gal(L/K)) : + Ideal.map (@MulSemiringAction.toRingHom (Gal(L/K)) _ 𝒪[L] _ (galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L) σ) (𝓂[L] : Ideal 𝒪[L]) = (𝓂[L] : Ideal 𝒪[L]) := by @@ -263,13 +263,13 @@ theorem galoisGroupIntegerRingAction_mem_maximalIdeal_stabilizer_of_isIntegralCl [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]) _ + (σ : 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]) _ + rw [@MulAction.mem_stabilizer_iff (Gal(L/K)) (Ideal 𝒪[L]) _ (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L)] - change Ideal.map (@MulSemiringAction.toRingHom (Gal(L / K)) _ 𝒪[L] _ + change Ideal.map (@MulSemiringAction.toRingHom (Gal(L/K)) _ 𝒪[L] _ (galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L) σ) (𝓂[L] : Ideal 𝒪[L]) = (𝓂[L] : Ideal 𝒪[L]) @@ -282,7 +282,7 @@ def galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure [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]) _ + Gal(L/K) →* @MulAction.stabilizer (Gal(L/K)) (Ideal 𝒪[L]) _ (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) (𝓂[L] : Ideal 𝒪[L]) where toFun σ := @@ -328,7 +328,7 @@ def galoisGroupPrincipalUnitsMapEquivHomOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - Gal(L / K) →* (principalUnits L n ≃* principalUnits L n) where + Gal(L/K) →* (principalUnits L n ≃* principalUnits L n) where toFun := galoisGroupPrincipalUnitsMapEquivOfIsIntegralClosure K L n map_one' := by ext u @@ -373,7 +373,7 @@ def galoisGroupMaximalIdealPowSuccQuotMapEquivHomOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - Gal(L / K) →* + Gal(L/K) →* Multiplicative (AddAut (MaximalIdealPowSuccQuot L n)) where toFun σ := Multiplicative.ofAdd @@ -415,7 +415,7 @@ def galoisGroupMaximalIdealPowSuccQuotDistribMulActionOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - DistribMulAction (Gal(L / K)) (MaximalIdealPowSuccQuot L n) where + DistribMulAction (Gal(L/K)) (MaximalIdealPowSuccQuot L n) where smul σ x := galoisGroupMaximalIdealPowSuccQuotMapEquivOfIsIntegralClosure K L n σ x one_smul := by intro x @@ -463,7 +463,7 @@ def galoisGroupMaximalIdealPowSuccQuotMultiplicativeMulDistribMulActionOfIsInteg [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - MulDistribMulAction (Gal(L / K)) (Multiplicative (MaximalIdealPowSuccQuot L n)) where + MulDistribMulAction (Gal(L/K)) (Multiplicative (MaximalIdealPowSuccQuot L n)) where smul σ x := maximalIdealPowSuccQuotMultiplicativeMapEquivOfIntegerRingEquiv L n (galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ) x @@ -548,7 +548,7 @@ def galoisGroupPrincipalUnitsSuccQuotMapEquivHomOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - Gal(L / K) →* (PrincipalUnitsSuccQuot L n ≃* PrincipalUnitsSuccQuot L n) where + Gal(L/K) →* (PrincipalUnitsSuccQuot L n ≃* PrincipalUnitsSuccQuot L n) where toFun := galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n map_one' := by ext x @@ -572,7 +572,7 @@ def galoisGroupPrincipalUnitsSuccQuotMulDistribMulActionOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - MulDistribMulAction (Gal(L / K)) (PrincipalUnitsSuccQuot L n) where + MulDistribMulAction (Gal(L/K)) (PrincipalUnitsSuccQuot L n) where smul σ x := galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ x one_smul := by intro x @@ -618,7 +618,7 @@ def galoisGroupPrincipalUnitsSuccQuotAddDistribMulActionOfIsIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (n : Nat) : - DistribMulAction (Gal(L / K)) (Additive (PrincipalUnitsSuccQuot L n)) where + DistribMulAction (Gal(L/K)) (Additive (PrincipalUnitsSuccQuot L n)) where smul σ x := Additive.ofMul (galoisGroupPrincipalUnitsSuccQuotMapEquivOfIsIntegralClosure K L n σ @@ -765,14 +765,14 @@ theorem galoisGroup_prod_one_add_sub_one_sub_sum_mem_maximalIdeal_pow_succ_of_is [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) => + (Finset.univ.prod fun σ : Gal(L/K) => 1 + galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) - 1 - - (Finset.univ.sum fun σ : Gal(L / K) => + (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 + (Finset.univ : Finset (Gal(L/K))) n hn (fun σ => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ (a : 𝒪[L])) ?_ intro σ _ exact (integerRingEquiv_mem_maximalIdeal_pow L diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean index b1ec1cfd60..4568d7f279 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean @@ -17,6 +17,11 @@ valuation to the integer model and proves that completeness and the finite residue field are preserved. -/ +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + moduleFinite_target_valuationSubring_of_finite_separable → + moduleFinite_target_valuationSubring_of_finite_separable + + noncomputable section namespace LocalFieldTheory @@ -75,7 +80,7 @@ theorem integerRing_moduleFinite_of_finite_separable let : Module.Finite (localCompleteDVF K).valuationSubring (localCompleteDVF L).valuationSubring := - ValuationTheory.DiscreteValuationField.ValuedExtension.moduleFinite_target_valuationSubring_of_finite_separable + moduleFinite_target_valuationSubring_of_finite_separable (localCompleteDVF K) (localCompleteDVF L) have hK : (ValuativeRel.valuation K).integer = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean index eab8a59104..09af235d63 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean @@ -16,6 +16,19 @@ for maximal Kummer extensions and the characteristic-zero local existence theorem. -/ +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 @@ -46,7 +59,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero LocalFieldTheory.DiscreteValuationField.LocalField.mixedWithZeroValuationContext v let d := Module.finrank ℚ_[F.residueCharacteristic] K obtain ⟨a, e⟩ := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation + chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v (localIntegerValuation_surjective K) let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup @@ -69,7 +82,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero F.toCompleteDVF.valuation.IsUniformizer (π : K) := Classical.choose_spec hex exact - LocalFieldTheory.DiscreteValuationField.finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits F.toCompleteDVF hπ n · let : CharP K p := hcharP have hpne : p ≠ 0 := hp.out.ne_zero @@ -86,7 +99,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero ⟨(F.residueCharacteristic_prime.coprime_iff_not_dvd.mpr hpn).symm⟩ let valuedK : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let e := - LocalFieldTheory.DiscreteValuationField.LocalField.chosenFirstPrincipalUnitStructureEqualCharacteristic + chosenFirstPrincipalUnitStructureEqualCharacteristic v let U1 := LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup @@ -106,7 +119,7 @@ theorem finite_nthPowerQuotient_of_natCast_ne_zero F.toCompleteDVF.valuation.IsUniformizer (π : K) := Classical.choose_spec hex exact - LocalFieldTheory.DiscreteValuationField.finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits + finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits F.toCompleteDVF hπ n end LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean index 207de758ae..ff61b3c828 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -96,7 +96,7 @@ 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 + Gal(L/K) →* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) where toFun := galoisGroupResidueAlgEquivOfIsIntegralClosure K L map_one' := by apply AlgEquiv.ext @@ -130,9 +130,9 @@ theorem galoisGroup_sum_residue_eq_residueAlgEquiv_sum_of_isIntegralClosure [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (a : 𝒪[L]) : IsLocalRing.residue 𝒪[L] - (Finset.univ.sum fun σ : Gal(L / K) => + (Finset.univ.sum fun σ : Gal(L/K) => galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ a) = - Finset.univ.sum fun σ : Gal(L / K) => + Finset.univ.sum fun σ : Gal(L/K) => galoisGroupResidueAlgEquivOfIsIntegralClosure K L σ (IsLocalRing.residue 𝒪[L] a) := by rw [map_sum] @@ -146,7 +146,7 @@ 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]) _ + @MulAction.stabilizer Gal(L/K) (Ideal 𝒪[L]) _ (galoisGroupIntegerRingIdealMulActionOfIsIntegralClosure K L) (𝓂[L] : Ideal 𝒪[L]) →* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := by @@ -154,23 +154,23 @@ def galoisGroupResidueStabilizerHomOfIsIntegralClosure (K L : Type u) letI := galoisGroupIntegerRingSMulCommClassOfIsIntegralClosure K L letI := galoisGroupIntegerRingIdealDistribMulActionOfIsIntegralClosure K L exact Ideal.Quotient.stabilizerHom (𝓂[L] : Ideal 𝒪[L]) - (𝓂[K] : Ideal 𝒪[K]) Gal(L / K) + (𝓂[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 + Subgroup Gal(L/K) := by letI := galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure K L - exact (𝓂[L] : Ideal 𝒪[L]).toAddSubgroup.inertia Gal(L / K) + 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]) := + Gal(L/K) →* (𝓀[L] ≃ₐ[𝓀[K]] 𝓀[L]) := (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).comp (galoisGroupMaximalIdealStabilizerHomOfIsIntegralClosure K L) @@ -208,14 +208,14 @@ theorem galoisGroupResidueStabilizerHomOfIsIntegralClosure_ker_eq_maximalIdealIn [IsIntegralClosure 𝒪[L] 𝒪[K] L] : (galoisGroupResidueStabilizerHomOfIsIntegralClosure K L).ker = (galoisGroupMaximalIdealInertiaOfIsIntegralClosure K L).subgroupOf - (@MulAction.stabilizer Gal(L / K) (Ideal 𝒪[L]) _ + (@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) + (𝓂[K] : Ideal 𝒪[K]) Gal(L/K) /-- A Galois automorphism acts trivially on the residue field exactly when it belongs to maximal-ideal inertia. -/ @@ -323,7 +323,7 @@ theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationId infer_instance simpa [galoisGroupMaximalIdealInertiaOfIsIntegralClosure] using (Ideal.card_inertia_eq_ramificationIdxIn - (R := 𝒪[K]) (S := 𝒪[L]) (G := Gal(L / K)) + (R := 𝒪[K]) (S := 𝒪[L]) (G := Gal(L/K)) (𝓂[K] : Ideal 𝒪[K]) (𝓂[L] : Ideal 𝒪[L])) /-- The actual integral-closure inertia cardinality, rewritten with the @@ -341,7 +341,7 @@ theorem galoisGroupMaximalIdealInertiaOfIsIntegralClosure_card_eq_ramificationId 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) + (𝓂[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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean index be674152e4..8eab4d861a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean @@ -8,6 +8,11 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLoca import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence /-! # Uniformizer Principal Quotient -/ + +open _root_.LocalFieldTheory.IsNonarchimedeanLocalField renaming + integerUnitsToFieldUnits_uniformizerUnitFactor → + integerUnitsToFieldUnits_uniformizerUnitFactor + open scoped ValuativeRel /-! @@ -39,7 +44,7 @@ theorem uniformizerUnitFactor_one (hpi : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul pi) = 1) : LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi 1 = 1 := by apply integerUnitsToFieldUnits_injective K - rw [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_one] simp @@ -57,7 +62,7 @@ theorem uniformizerUnitFactor_mul apply integerUnitsToFieldUnits_injective K rw [map_mul] simp only - [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor] + [integerUnitsToFieldUnits_uniformizerUnitFactor] rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_ofMul_mul, zpow_add] simp only [div_eq_mul_inv, mul_inv_rev] ac_rfl @@ -73,7 +78,7 @@ theorem uniformizerUnitFactor_integerUnit LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi (integerUnitsToFieldUnits K u) = u := by apply integerUnitsToFieldUnits_injective K - rw [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor] + rw [integerUnitsToFieldUnits_uniformizerUnitFactor] have hv : LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap K (Additive.ofMul (integerUnitsToFieldUnits K u)) = 0 := by rw [LocalFieldTheory.IsNonarchimedeanLocalField.valuationMap_apply] @@ -152,7 +157,7 @@ theorem fieldUnitsToIntegerUnitsPrincipalQuotientHom_ker have hfactor : LocalFieldTheory.IsNonarchimedeanLocalField.uniformizerUnitFactor K pi hpi pi = 1 := by apply integerUnitsToFieldUnits_injective K - rw [LocalFieldTheory.IsNonarchimedeanLocalField.integerUnitsToFieldUnits_uniformizerUnitFactor, + rw [integerUnitsToFieldUnits_uniformizerUnitFactor, hpi] simp rw [hfactor] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean index 93455bede5..8868c54304 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -132,7 +132,7 @@ noncomputable def arithmeticFrobeniusOfUnramifiedValuation [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : - Gal(L / K) := + Gal(L/K) := (galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L).symm (residueExtensionArithmeticFrobeniusOfValuationExtension K L) @@ -277,7 +277,7 @@ theorem arithmeticFrobeniusOfUnramifiedValuation_apply_primitiveRoot (A := 𝒪[L]) (R := 𝒪[K]) (B := L)).1 hζIntegral with ⟨a, ha⟩ change (a : L) = ζ at ha - let φ : Gal(L / K) := + let φ : Gal(L/K) := arithmeticFrobeniusOfUnramifiedValuation K L let b : 𝒪[L] := galoisGroupIntegerRingEquivOfIsIntegralClosure K L φ a @@ -369,7 +369,7 @@ theorem arithmeticFrobeniusOfUnramifiedValuation_generates [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] [Module.Finite 𝒪[K] 𝒪[L]] [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : - ∀ σ : Gal(L / K), + ∀ σ : Gal(L/K), σ ∈ Subgroup.zpowers (arithmeticFrobeniusOfUnramifiedValuation K L) := by intro σ let e := galoisGroupEquivResidueAlgEquivOfUnramifiedValuationOfIsIntegralClosure K L @@ -403,7 +403,7 @@ theorem isCyclic_galoisGroup_of_unramifiedValuation [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 + IsCyclic Gal(L/K) := by rw [isCyclic_iff_exists_zpowers_eq_top] exact ⟨arithmeticFrobeniusOfUnramifiedValuation K L, arithmeticFrobeniusOfUnramifiedValuation_zpowers_eq_top K L⟩ @@ -419,7 +419,7 @@ theorem galoisGroup_card_eq_finrank_of_unramifiedValuation [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 + 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) @@ -436,11 +436,11 @@ noncomputable def galoisGroupEquivZModOfUnramifiedValuation [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) := + 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 + (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 @@ -531,7 +531,7 @@ noncomputable def galoisGroupEquivZModOfUnramifiedValuationNormalized [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)) := + Gal(L/K) ≃* Multiplicative (ZMod (Module.finrank K L)) := (zmodCyclicMulEquivOfGenerator (arithmeticFrobeniusOfUnramifiedValuation K L) (orderOf_arithmeticFrobeniusOfUnramifiedValuation K L) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean index 91f0f2df5e..7b0dfa57a5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean @@ -11,6 +11,11 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.T This file packages the actual integral-closure complete-DVF model as a totally ramified extension. -/ +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 @@ -78,7 +83,7 @@ theorem padicCyclotomicTotallyRamified_exists_totallyRamified_extension padicCyclotomicTotallyRamified_uniformizer_and_ramificationIndex_eq_degree ζ hζ hgen target exact ⟨hfd, target, hExt, hsource.1, - (LocalFieldTheory.DiscreteValuationField.ValuedExtension.isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable + (isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable base target).2 hsource.2⟩ end CyclotomicExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean index 42af2a2735..09090f4c20 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean @@ -12,6 +12,11 @@ This file identifies `ℤ_[p][ζ]` with the actual integral closure and proves that it is a discrete valuation ring. -/ +open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming + integralClosure_isDiscreteValuationRing_of_finite_separable → + integralClosure_isDiscreteValuationRing_of_finite_separable + + noncomputable section namespace AlgebraicNumberTheory @@ -164,7 +169,7 @@ theorem padicCyclotomicTotallyRamified_adjoin_isDiscreteValuationRing map_mul' := fun _ _ => rfl map_add' := fun _ _ => rfl } let : IsDiscreteValuationRing (integralClosure V L) := - ValuationTheory.DiscreteValuationField.ValuedExtension.integralClosure_isDiscreteValuationRing_of_finite_separable + integralClosure_isDiscreteValuationRing_of_finite_separable base let : IsDiscreteValuationRing (integralClosure ℤ_[p] L) := IsDiscreteValuationRing.RingEquivClass.isDiscreteValuationRing eIC.symm diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean index ab17ef9953..f133611c03 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean @@ -13,6 +13,11 @@ This file maps the Eisenstein unit relation into the target valuation ring and p ℚ_[p]]`, together with the uniformizer statement. -/ +open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming + target_maximalIdeal_pow_not_le_pow_succ → + target_maximalIdeal_pow_not_le_pow_succ + + noncomputable section namespace AlgebraicNumberTheory @@ -164,7 +169,7 @@ theorem padicCyclotomicTotallyRamified_uniformizer_and_ramificationIndex_eq_degr base.maximalIdeal ≤ target.maximalIdeal ^ (d + 1) := by rw [hmapT] exact - LocalFieldTheory.DiscreteValuationField.ValuedExtension.target_maximalIdeal_pow_not_le_pow_succ + target_maximalIdeal_pow_not_le_pow_succ target hπ d have he : ValuedExtension.ramificationIndex diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean index 7a6a766af8..3ff3dbe842 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean @@ -40,7 +40,6 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index 588a4bc50b..f9ccbc03de 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -421,7 +421,7 @@ noncomputable def padicCyclotomicUnramifiedGalToResidueGal (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt Gal(L/K) →* - Gal(padicCyclotomicUnramifiedResidueField vL / padicCyclotomicUnramifiedResidueField vK) := by + Gal(padicCyclotomicUnramifiedResidueField vL/padicCyclotomicUnramifiedResidueField vK) := by let V := LubinTate.Valuations.exponentialValuationSubring vK let W := LubinTate.Valuations.exponentialValuationSubring vL let i := unramifiedValuationRingValuationRingMap vK vL hExt @@ -1000,7 +1000,7 @@ noncomputable def padicCyclotomicUnramifiedGalEquivResidueGal (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt Gal(L/K) ≃* - Gal(padicCyclotomicUnramifiedResidueField vL / padicCyclotomicUnramifiedResidueField vK) := by + Gal(padicCyclotomicUnramifiedResidueField vL/padicCyclotomicUnramifiedResidueField vK) := by letI : Algebra (padicCyclotomicUnramifiedResidueField vK) (padicCyclotomicUnramifiedResidueField vL) := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean index d5478c84b9..f96ee53855 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean @@ -21,6 +21,55 @@ computes their principal-unit quotients, and records the logarithm/exponential power formulas used by local cyclotomic norm calculations. -/ +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 @@ -151,7 +200,7 @@ theorem nat_card_integerUnitsPrincipalQuot_padic_succ (k : ℕ) : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1)) := Nat.card_congr (integerUnitsPrincipalQuotEquivPadicDVR p (k + 1)).toEquiv _ = Nat.card ((F.valuationSubring ⧸ F.maximalIdeal ^ (k + 1))ˣ) := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits + card_unitsModHigherPrincipalUnitGroup_eq_quotientUnits F (k + 1) (Nat.succ_le_succ (Nat.zero_le k)) _ = Nat.card (ZMod (p ^ (k + 1)))ˣ := Nat.card_congr @@ -315,7 +364,7 @@ theorem padicDVR_ramificationIndex_eq_one : (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p) = 1 := by let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p have h := - LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation_intCast v + 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 @@ -372,14 +421,14 @@ noncomputable def expLogMulEquivOfWithZeroValuation v).residueCharacteristic : ℚ) - 1) < (n : ℚ)) : Multiplicative - ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal - (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring) ≃* + (completeDVFOfWithZeroValuation v).valuationSubring) ≃* LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup - (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v) n := by + (completeDVFOfWithZeroValuation v) n := by letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v let P := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv + chosenExpLogContinuousMulEquiv v hv n hlevel refine { toFun := fun a => P a @@ -406,16 +455,16 @@ theorem expLogMulEquivOfWithZeroValuation_fieldVal v).residueCharacteristic : ℚ) - 1) < (n : ℚ)) (a : Multiplicative - ((LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).maximalIdeal ^ n : + ((completeDVFOfWithZeroValuation v).maximalIdeal ^ n : Ideal - (LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v).valuationSubring)) : + (completeDVFOfWithZeroValuation v).valuationSubring)) : let F := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + completeDVFOfWithZeroValuation v let E := expLogMulEquivOfWithZeroValuation v hv n hlevel ((((E a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F n) : F.valuationSubringˣ) : F.valuationSubring) : K) = - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation + expSeriesFieldOfWithZeroValuation v (((a.toAdd : F.valuationSubring) : K)) (fun m => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m)) := by @@ -427,34 +476,34 @@ theorem expLogMulEquivOfWithZeroValuation_fieldVal infer_instance simp only [expLogMulEquivOfWithZeroValuation] simp only [ - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.chosenExpLogContinuousMulEquiv, - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled, - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled] + chosenExpLogContinuousMulEquiv, + principalUnitExpLogContinuousMulEquivOfExactOfWithZeroValuationScaled, + principalUnitExpLogMulEquivOfExactOfWithZeroValuationScaled] apply - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled + principalUnitExpSeries_maximalIdealPow_val_ofWithZeroValuationScaled (v := v) (p := p) (LocalFieldTheory.DiscreteValuationField.LocalField.ramificationIndexOfWithZeroValuation v) n case hπval => exact Classical.choose_spec - (LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + (exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective v hv) case hπ => exact - LocalFieldTheory.DiscreteValuationField.WithZeroValuation.isUniformizer_of_valuation_eq_exp_neg_one + isUniformizer_of_valuation_eq_exp_neg_one v _ (Classical.choose_spec - (LocalFieldTheory.DiscreteValuationField.WithZeroValuation.exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective + (exists_valuationSubring_valuation_eq_exp_neg_one_of_surjective v hv)) case hlevel => exact hlevel case hnval => intro m exact - LocalFieldTheory.DiscreteValuationField.LocalField.valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat + valuation_natCast_factorial_eq_exp_neg_ramificationIndex_mul_padicValNat v m case hcomplete => exact - LocalFieldTheory.DiscreteValuationField.WithZeroValuationTopology.completeSpace_ofWithZeroValuation + completeSpace_ofWithZeroValuation v /-- For odd `p`, every element of `U^(k+1)` is a @@ -463,14 +512,14 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd (hp2 : p ≠ 2) (k : ℕ) : let v := LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicDVRValuation p let F := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + 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 := - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.completeDVFOfWithZeroValuation v + completeDVFOfWithZeroValuation v change ∀ u : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1), ∃ r : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1, @@ -530,7 +579,7 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F 1) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[p]) = - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation + expSeriesFieldOfWithZeroValuation v ((((Multiplicative.ofAdd b1) ^ ((p - 1) * p ^ k)).toAdd : F.valuationSubring) : ℚ_[p]) (fun m => @@ -540,7 +589,7 @@ theorem padicDVR_higherPrincipalUnit_degree_is_power_odd ((((En a : LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F (k + 1)) : F.valuationSubringˣ) : F.valuationSubring) : ℚ_[p]) = - LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.expSeriesFieldOfWithZeroValuation + expSeriesFieldOfWithZeroValuation v ((a.toAdd : F.valuationSubring) : ℚ_[p]) (fun m => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero m)) := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean index 87b6476353..814a3988fe 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -18,6 +18,27 @@ This file constructs the reusable topological decomposition of `ℤ_[p]ˣ` into its finite factor and its principal `p`-adic factor. -/ +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 @@ -515,11 +536,11 @@ noncomputable def padicUnitDecomposition LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F.toCompleteDVF exact - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityContinuousMulEquivZMod + (residueRootsOfUnityContinuousMulEquivZMod F.toCompleteDVF).toMulEquiv letI : Finite RootGroup := Finite.of_equiv F.residueFieldˣ - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityEquivResidueFieldUnits + (residueRootsOfUnityEquivResidueFieldUnits F.toCompleteDVF).symm.toEquiv letI : Finite RootCyc := Finite.of_equiv RootGroup rootsAlg.symm.toEquiv @@ -553,7 +574,7 @@ noncomputable def padicUnitDecomposition (continuousMulEquivProdCongr roots principal) let unitsAlg : RootGroup × U ≃* F.valuationSubringˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits + valuationSubringUnitsEquivRootsTimesPrincipalUnits F.toCompleteDVF let totalAlg : (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃* @@ -568,14 +589,14 @@ noncomputable def padicUnitDecomposition refine hmul.congr ?_ intro z exact - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply + (valuationSubringUnitsEquivRootsTimesPrincipalUnits_apply F.toCompleteDVF z).symm have hTotal : Continuous totalAlg := hUnitsAlg.comp factors.continuous_toFun let total : (RootCyc × FinCyc) × Multiplicative ℤ_[p] ≃ₜ* F.valuationSubringˣ := - LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup.continuousMulEquivOfCompactToT2 + continuousMulEquivOfCompactToT2 totalAlg hTotal let integral : ℤ_[p]ˣ ≃ₜ* F.valuationSubringˣ := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean index d2daeef16c..c35fd78b3e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean @@ -133,17 +133,14 @@ private theorem primitive_separable_integral_model_on_commonTop_core (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 @@ -156,7 +153,6 @@ private theorem primitive_separable_integral_model_on_commonTop_core 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] @@ -164,7 +160,6 @@ private theorem primitive_separable_integral_model_on_commonTop_core 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 := @@ -176,7 +171,6 @@ private theorem primitive_separable_integral_model_on_commonTop_core 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 @@ -194,7 +188,9 @@ private theorem primitive_separable_integral_model_on_commonTop_core apply Polynomial.ext intro n apply Subtype.ext - simp [FRight, iRight, iLeftTop] + 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)) : @@ -210,7 +206,6 @@ private theorem primitive_separable_integral_model_on_commonTop_core (aTop : (L ⊔ K' : IntermediateField K Ω)) = 0 := by rw [hFmapTop] exact hFrootTopFromLeft - have hFRightReduction : (FRight.map (IsLocalRing.residue WRight)).Separable := by have hReductionMap := @@ -221,7 +216,6 @@ private theorem primitive_separable_integral_model_on_commonTop_core at hReductionMap rw [hReductionMap] exact hFreduction.map - exact ⟨hhensRight, hRightTop, a, aTop, FRight, rfl, haTopGen, hFRightMonic, hFRightRoot, hFRightReduction⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean index a4f47b070f..7eccfcaecf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean @@ -197,7 +197,6 @@ 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 := @@ -266,7 +265,6 @@ def finiteUnramifiedSubextensionUnion /-- 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 := @@ -289,7 +287,6 @@ separate from the literal union definition, so the finite unramified-extension d 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 := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean index a5d0931519..6f03d71b20 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean @@ -103,7 +103,6 @@ theorem exists_integral_root_lifting_separable_residue_element 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 @@ -220,7 +219,6 @@ theorem exists_finiteUnramifiedSubextension_residue_image_eq 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean index c783ed4631..d693d7e26a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -196,7 +196,6 @@ theorem exists_primitive_lift_minpoly_of_finiteUnramifiedExtension 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 := @@ -252,7 +251,6 @@ theorem exists_primitive_lift_minpoly_of_finiteUnramifiedExtension intro j rw [hbL j] rfl } - let algVL : Algebra V L := ((algebraMap K L).comp V.subtype).toAlgebra let : Algebra V L := algVL @@ -292,7 +290,6 @@ theorem exists_primitive_lift_minpoly_of_finiteUnramifiedExtension 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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean index 163b27cb69..3ca1e42989 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -46,7 +46,6 @@ 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) ↔ @@ -169,7 +168,6 @@ 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 @@ -697,7 +695,6 @@ theorem differentIdeal_tower /-- 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean index a034fc7bd7..9289646cd2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -7,6 +7,31 @@ Authors: n-yamaguchi-0729 import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction /-! # Absolute Ramification -/ + +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 @@ -36,9 +61,9 @@ variable (K : Type u) [Field K] 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 + (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 : @@ -115,7 +140,7 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_restrictUnique decompositionSubgroup K A = ⊤ := by have hpres (σ : Field.absoluteGaloisGroup K) (z : AlgebraicClosure K) : - z ∈ A ↔ (show Gal(AlgebraicClosure K / K) from σ) z ∈ A := by + 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 @@ -123,29 +148,29 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_restrictUnique let x : E := ⟨z ^ n, hzpowE⟩ have hlevel : ((x : AlgebraicClosure K) ∈ A) ↔ - (show Gal(AlgebraicClosure K / K) from σ) + (show Gal(AlgebraicClosure K/K) from σ) (x : AlgebraicClosure K) ∈ A := by exact - RamificationTheory.ValuationSubring.mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + mem_algEquiv_apply_iff_of_restrictIntermediateField_unique (v := v) (A := A) (E := E) (huniq E) - (show Gal(AlgebraicClosure K / K) from σ) x + (show Gal(AlgebraicClosure K/K) from σ) x have hpow : z ^ n ∈ A ↔ - (show Gal(AlgebraicClosure K / K) from σ) (z ^ n) ∈ A := by + (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 + ((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) + ((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 + 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 @@ -163,10 +188,10 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_restr (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 := - RamificationTheory.ValuationSubring.mem_algEquiv_apply_iff_of_restrictIntermediateField_unique + (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 + (show Gal(AlgebraicClosure K/K) from σ) x /-- Target-free finite-level membership preservation from the integral valuation-ring frontier on that finite separable level. -/ @@ -183,7 +208,7 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integ B.valuation.valuationSubring) (σ : Field.absoluteGaloisGroup K) (x : E) : ((x : AlgebraicClosure K) ∈ A) ↔ - (show Gal(AlgebraicClosure K / K) from σ) (x : AlgebraicClosure K) ∈ A := by + (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) @@ -208,19 +233,19 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_integ constructor · intro hz have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + 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 := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := E) F.valuation B.valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + integralClosure_mem_valuationSubring_of_hasExtension (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz_int⟩ @@ -247,7 +272,7 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate_of_modul B.valuation.valuationSubring) (σ : Field.absoluteGaloisGroup K) (x : E) : ((x : AlgebraicClosure K) ∈ A) ↔ - (show Gal(AlgebraicClosure K / K) from σ) (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 @@ -270,15 +295,15 @@ theorem valuationSubring_mem_preserved_on_finite_separable_intermediate (hA : target.valuation.valuationSubring = (RamificationTheory.ValuationSubring.restrictIntermediateField A E)) (huniq : - ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, + 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 := - RamificationTheory.ValuationSubring.mem_algEquiv_apply_iff_of_restrictIntermediateField_henselianUnique + (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 + (show Gal(AlgebraicClosure K/K) from σ) x /-- Henselian-DVF specialization of the target-free Route-P core. -/ theorem decompositionSubgroup_eq_top_of_henselianDVF_restrictUnique @@ -335,18 +360,18 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_integral constructor · intro hz have hz_int : z ∈ integralClosure F.valuation.valuationSubring E := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + 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 := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := E) F.valuation B.valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + integralClosure_mem_valuationSubring_of_hasExtension (L := E) F.valuation ((RamificationTheory.ValuationSubring.restrictIntermediateField A E)).valuation ⟨z, hz_int⟩ calc @@ -396,7 +421,7 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_henselianUnique ∃ target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E, target.valuation.valuationSubring = (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ - ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} + HasUniqueValuationExtension.{u, v, u, w, u} F target) : decompositionSubgroup K A = ⊤ := by apply decompositionSubgroup_eq_top_of_finite_separable_restrictUnique @@ -406,7 +431,7 @@ theorem decompositionSubgroup_eq_top_of_finite_separable_henselianUnique have htarget : target.valuation.valuationSubring = B := by have hsub := - ValuationTheory.DiscreteValuationField.HenselianDVF.valuationSubring_eq_of_hasUniqueValuationExtension + valuationSubring_eq_of_hasUniqueValuationExtension F target htargetUnique B.valuation simpa [ValuationSubring.valuationSubring_valuation] using hsub exact hA.symm.trans htarget @@ -425,7 +450,7 @@ theorem decompositionSubgroup_eq_top_of_henselianDVF_powerRoute ∃ target : ValuationTheory.DiscreteValuationField.HenselianDVF.{u, w} E, target.valuation.valuationSubring = (RamificationTheory.ValuationSubring.restrictIntermediateField A E) ∧ - ValuationTheory.DiscreteValuationField.HenselianDVF.HasUniqueValuationExtension.{u, v, u, w, u} + HasUniqueValuationExtension.{u, v, u, w, u} F target) : decompositionSubgroup K A = ⊤ := decompositionSubgroup_eq_top_of_finite_separable_henselianUnique diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index b86c1ae121..66050c9c16 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -9,6 +9,11 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation. /-! Provides the public declarations in the `RamificationTheory.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence` Lean module. -/ +open _root_.RamificationTheory.Field.absoluteGaloisGroup renaming + valuationSubring_mem_preserved_on_finite_separable_intermediate → + valuationSubring_mem_preserved_on_finite_separable_intermediate + + namespace RamificationTheory open ValuationTheory @@ -47,30 +52,30 @@ 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} + (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 + 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 + 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) + (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)) + ((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 := + ∀ 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 @@ -80,7 +85,7 @@ theorem fixingSubgroupOfExtension_eq_fieldRange_fixingSubgroup fixingSubgroupOfExtension K i = (AlgHom.fieldRange i).fixingSubgroup := by change - (show Subgroup (Gal(AlgebraicClosure K / K)) from + (show Subgroup (Gal(AlgebraicClosure K/K)) from fixingSubgroupOfExtension K i) = (AlgHom.fieldRange i).fixingSubgroup ext σ @@ -107,7 +112,7 @@ theorem fixingSubgroupOfExtension_le_of_fieldRange_le 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) = + change (show Gal(AlgebraicClosure K/K) from σ) (iL.toRingHom x) = iL.toRingHom x rw [← hy] exact hσ y @@ -148,7 +153,7 @@ 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 + (show Gal(AlgebraicClosure K/K) from σ) x = x := by let := finiteDimensional_fieldRange (K := K) i exact mem_openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange i) σ @@ -159,7 +164,7 @@ 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 + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by rw [mem_openSubgroupOfFiniteExtension] constructor · intro hσ x @@ -246,7 +251,7 @@ def quotientNormalClosureOpenSubgroupEquivGalOfFiniteExtension (openSubgroupOfNormalClosureFiniteExtension K i : Subgroup (Field.absoluteGaloisGroup K)) ≃* Gal(IntermediateField.normalClosure K (AlgHom.fieldRange i) - (AlgebraicClosure K) / K) := by + (AlgebraicClosure K)/K) := by letI := finiteDimensional_fieldRange (K := K) i exact quotientNormalClosureOpenSubgroupEquivGal K (AlgHom.fieldRange i) @@ -272,7 +277,7 @@ 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)) + (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. -/ @@ -293,7 +298,7 @@ instance openSubgroupOfFiniteExtension.instFiniteIndex [FiniteDimensional K L] Subgroup (Field.absoluteGaloisGroup K))).FiniteIndex := by let := finiteDimensional_fieldRange (K := K) i change ((openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange i) : - Subgroup (Gal(AlgebraicClosure K / K)))).FiniteIndex + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex infer_instance /-- Provides the instance `instFiniteIndex`. -/ @@ -305,7 +310,7 @@ instance openSubgroupOfNormalClosureFiniteExtension.instFiniteIndex let := finiteDimensional_fieldRange (K := K) i change ((openSubgroupOfNormalClosureFiniteIntermediateField K (AlgHom.fieldRange i) : - Subgroup (Gal(AlgebraicClosure K / K)))).FiniteIndex + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex infer_instance /-- If the chosen algebraic closure is Galois over `K`, the index of the @@ -325,7 +330,7 @@ theorem openSubgroupOfFiniteExtension_index_eq_finrank def conjugateEmbedding (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup K) : L →ₐ[K] AlgebraicClosure K := - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom.comp i + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom.comp i /-- States the theorem `conjugateEmbedding_apply`. -/ @[simp] @@ -333,7 +338,7 @@ 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) := + (show Gal(AlgebraicClosure K/K) from σ) (i x) := rfl /-- The field range of the conjugated embedding is the image of the original @@ -343,9 +348,9 @@ theorem fieldRange_conjugateEmbedding (σ : Field.absoluteGaloisGroup K) : AlgHom.fieldRange (conjugateEmbedding K i σ) = (AlgHom.fieldRange i).map - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom := + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := (AlgHom.map_fieldRange i - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom).symm + (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 @@ -361,26 +366,26 @@ theorem mem_openSubgroupOfFiniteExtension_conjugateEmbedding_iff 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 + 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)) + (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) + 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' + (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`. -/ @@ -471,9 +476,9 @@ theorem openSubgroupOfFiniteExtensionSup_toSubgroup change (openSubgroupOfFiniteIntermediateFieldSup K (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) : - Subgroup (Gal(AlgebraicClosure K / K))) = + Subgroup (Gal(AlgebraicClosure K/K))) = (openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iL) : - Subgroup (Gal(AlgebraicClosure K / K))) ⊓ + Subgroup (Gal(AlgebraicClosure K/K))) ⊓ openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iM) exact openSubgroupOfFiniteIntermediateFieldSup_toSubgroup K (AlgHom.fieldRange iL) (AlgHom.fieldRange iM) @@ -492,16 +497,16 @@ theorem mem_openSubgroupOfFiniteExtensionSup let : FiniteDimensional K (AlgHom.fieldRange iM) := finiteDimensional_fieldRange (K := K) iM change - (show Gal(AlgebraicClosure K / K) from σ) ∈ + (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 σ) ∈ + 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 σ) ∈ + Subgroup (Gal(AlgebraicClosure K/K))) ∧ + (show Gal(AlgebraicClosure K/K) from σ) ∈ (openSubgroupOfFiniteIntermediateField K (AlgHom.fieldRange iM) : - Subgroup (Gal(AlgebraicClosure K / K))) + Subgroup (Gal(AlgebraicClosure K/K))) rw [openSubgroupOfFiniteIntermediateFieldSup_toSubgroup] exact Iff.rfl @@ -513,8 +518,8 @@ theorem mem_openSubgroupOfFiniteExtensionSup_iff_forall_apply_eq (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 + (∀ 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] @@ -526,7 +531,7 @@ 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 + Gal(AlgebraicClosure K/AlgHom.fieldRange i) := by letI := finiteDimensional_fieldRange (K := K) i exact openSubgroupOfFiniteIntermediateFieldContinuousMulEquiv K @@ -535,7 +540,7 @@ def openSubgroupOfFiniteExtensionContinuousMulEquiv [FiniteDimensional K L] /-- 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) →* + Gal(AlgebraicClosure K/AlgHom.fieldRange i) →* Field.absoluteGaloisGroup K := ofIntermediateField K (AlgHom.fieldRange i) @@ -602,12 +607,12 @@ theorem mem_range_ofFiniteExtension_iff (σ : Field.absoluteGaloisGroup K) : σ ∈ MonoidHom.range (ofFiniteExtension K i) ↔ ∀ x ∈ AlgHom.fieldRange i, - (show Gal(AlgebraicClosure K / K) from σ) x = x := by + (show Gal(AlgebraicClosure K/K) from σ) x = x := by change - (show Gal(AlgebraicClosure K / K) from σ) ∈ + (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 + (show Gal(AlgebraicClosure K/K) from σ) x = x rw [mem_range_ofIntermediateField_iff] exact IntermediateField.mem_fixingSubgroup_iff (AlgHom.fieldRange i) σ @@ -616,7 +621,7 @@ 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 + ∀ 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 σ @@ -663,8 +668,8 @@ instance openSubgroupOfFiniteExtension.instNormal_coe 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) := + Gal(AlgebraicClosure K/K) ⧸ (AlgHom.fieldRange i).fixingSubgroup ≃* + Gal(AlgHom.fieldRange i/K) := quotientEquivGalOfNormalIntermediateField K (AlgHom.fieldRange i) /-- States the theorem `quotientEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ @@ -680,8 +685,8 @@ theorem quotientEquivGalFieldRangeOfNormalFiniteExtension_mk' 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) := + Gal(AlgebraicClosure K/K) ⧸ (AlgHom.fieldRange i).fixingSubgroup ≃* + Gal(L/K) := (quotientEquivGalFieldRangeOfNormalFiniteExtension K i).trans (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm @@ -706,7 +711,7 @@ def quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension Field.absoluteGaloisGroup K ⧸ (openSubgroupOfFiniteExtension K i : Subgroup (Field.absoluteGaloisGroup K)) ≃* - Gal(AlgHom.fieldRange i / K) := + Gal(AlgHom.fieldRange i/K) := quotientEquivGalFieldRangeOfNormalFiniteExtension K i /-- States the theorem `quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension_mk'`. -/ @@ -730,7 +735,7 @@ def quotientOpenSubgroupEquivGalOfNormalFiniteExtension Field.absoluteGaloisGroup K ⧸ (openSubgroupOfFiniteExtension K i : Subgroup (Field.absoluteGaloisGroup K)) ≃* - Gal(L / K) := + Gal(L/K) := (quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i).trans (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm @@ -754,7 +759,7 @@ private 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 + Gal(AlgebraicClosure K/AlgHom.fieldRange i) where toFun σ := { σ.toRingEquiv with commutes' := by @@ -786,7 +791,7 @@ private theorem automorphismsOverFieldRangeEquiv_continuous (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 + 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) := @@ -868,7 +873,7 @@ 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) → + 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 @@ -966,7 +971,7 @@ identified with `Gal(K^al / i(L))`. -/ def equivGalFieldRangeOfFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : Field.absoluteGaloisGroup L ≃* - Gal(AlgebraicClosure K / AlgHom.fieldRange i) := by + 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 @@ -985,7 +990,7 @@ 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 + 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 @@ -1000,7 +1005,7 @@ theorem equivGalFieldRangeOfFiniteExtension_continuous change Continuous (((AlgEquiv.autCongr e).trans (automorphismsOverFieldRangeEquiv K i hmap)) : Field.absoluteGaloisGroup L → - Gal(AlgebraicClosure K / AlgHom.fieldRange i)) + Gal(AlgebraicClosure K/AlgHom.fieldRange i)) exact (automorphismsOverFieldRangeEquiv_continuous K i hmap).comp (algEquiv_autCongr_continuous e) @@ -1009,7 +1014,7 @@ continuous. -/ theorem equivGalFieldRangeOfFiniteExtension_symm_continuous [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : Continuous ((equivGalFieldRangeOfFiniteExtension K i).symm : - Gal(AlgebraicClosure K / AlgHom.fieldRange i) → + 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 @@ -1024,7 +1029,7 @@ theorem equivGalFieldRangeOfFiniteExtension_symm_continuous IsAlgClosure.equiv L (AlgebraicClosure L) (AlgebraicClosure K) change Continuous ((((AlgEquiv.autCongr e).trans (automorphismsOverFieldRangeEquiv K i hmap)).symm) : - Gal(AlgebraicClosure K / AlgHom.fieldRange i) → + Gal(AlgebraicClosure K/AlgHom.fieldRange i) → Field.absoluteGaloisGroup L) exact (algEquiv_autCongr_symm_continuous e).comp (automorphismsOverFieldRangeEquiv_symm_continuous K i hmap) @@ -1034,7 +1039,7 @@ topological group isomorphism. -/ def equivGalFieldRangeOfFiniteExtensionContinuousMulEquiv [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) : Field.absoluteGaloisGroup L ≃ₜ* - Gal(AlgebraicClosure K / AlgHom.fieldRange i) := + Gal(AlgebraicClosure K/AlgHom.fieldRange i) := { toMulEquiv := equivGalFieldRangeOfFiniteExtension K i continuous_toFun := equivGalFieldRangeOfFiniteExtension_continuous K i continuous_invFun := equivGalFieldRangeOfFiniteExtension_symm_continuous K i } @@ -1294,7 +1299,7 @@ theorem mem_range_ofFiniteExtensionAbsolute_iff [FiniteDimensional K L] (σ : Field.absoluteGaloisGroup K) : σ ∈ MonoidHom.range (ofFiniteExtensionAbsolute K i) ↔ ∀ x ∈ AlgHom.fieldRange i, - (show Gal(AlgebraicClosure K / K) from σ) x = x := by + (show Gal(AlgebraicClosure K/K) from σ) x = x := by rw [range_ofFiniteExtensionAbsolute] exact mem_openSubgroupOfFiniteExtension K i σ @@ -1322,7 +1327,7 @@ def quotientRangeEquivGalFieldRangeOfNormalFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : Field.absoluteGaloisGroup K ⧸ MonoidHom.range (ofFiniteExtensionAbsolute K i) ≃* - Gal(AlgHom.fieldRange i / K) := + Gal(AlgHom.fieldRange i/K) := (QuotientGroup.quotientMulEquivOfEq (range_ofFiniteExtensionAbsolute K i)).trans (quotientOpenSubgroupEquivGalFieldRangeOfNormalFiniteExtension K i) @@ -1353,7 +1358,7 @@ def quotientRangeEquivGalOfNormalFiniteExtension (i : L →ₐ[K] AlgebraicClosure K) : Field.absoluteGaloisGroup K ⧸ MonoidHom.range (ofFiniteExtensionAbsolute K i) ≃* - Gal(L / K) := + Gal(L/K) := (quotientRangeEquivGalFieldRangeOfNormalFiniteExtension K i).trans (AlgEquiv.autCongr (AlgEquiv.ofInjectiveField i)).symm @@ -1417,13 +1422,13 @@ theorem mem_range_ofFiniteExtensionAbsolute_inf_iff (σ : 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 + (∀ 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 + (∀ 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 @@ -1433,7 +1438,7 @@ 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 + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by rw [range_ofFiniteExtensionAbsolute_eq_fixingSubgroupOfExtension] rfl @@ -1441,7 +1446,7 @@ theorem mem_range_ofFiniteExtensionAbsolute_iff_forall_apply_eq theorem ofFiniteExtensionAbsolute_apply_embedding [FiniteDimensional K L] (i : L →ₐ[K] AlgebraicClosure K) (σ : Field.absoluteGaloisGroup L) (x : L) : - (show Gal(AlgebraicClosure K / K) from + (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 @@ -1451,7 +1456,7 @@ theorem ofFiniteExtensionAbsolute_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 + (show Gal(AlgebraicClosure K/K) from ((toOpenSubgroupOfFiniteExtension K i σ : openSubgroupOfFiniteExtension K i) : Field.absoluteGaloisGroup K)) (i x) = i x := by @@ -1590,7 +1595,7 @@ theorem existsUnique_ofFiniteExtensionAbsolute_eq_iff_forall_apply_eq (σ : Field.absoluteGaloisGroup K) : (∃! τ : Field.absoluteGaloisGroup L, ofFiniteExtensionAbsolute K i τ = σ) ↔ - ∀ x : L, (show Gal(AlgebraicClosure K / K) from σ) (i x) = i x := by + ∀ x : L, (show Gal(AlgebraicClosure K/K) from σ) (i x) = i x := by constructor · rintro ⟨τ, hτ, _⟩ x rw [← hτ] @@ -1628,8 +1633,8 @@ theorem mem_absoluteValuationSubring_iff_apply_mem_of_finite_separable_intermedi F target) (sigma : Field.absoluteGaloisGroup K) (x : E) : ((x : AlgebraicClosure K) ∈ A) ↔ - (show Gal(AlgebraicClosure K / K) from sigma) (x : AlgebraicClosure K) ∈ A := - RamificationTheory.Field.absoluteGaloisGroup.valuationSubring_mem_preserved_on_finite_separable_intermediate + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean index f90462888a..47be443124 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean @@ -176,7 +176,8 @@ theorem smul_hasExtension _root_.Valuation.HasExtension v (σ • A).valuation := by apply _root_.Valuation.HasExtension.ofComapInteger ext x - simp [ValuationSubring.integer_valuation, Valuation.mem_integer_iff] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index 09ea45081b..5a12d3946f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -238,8 +238,8 @@ theorem semilinear_conjugation_continuous (τ : F ≃+* F') (e : Ω ≃+* Ω') (he : ∀ x : F, e (algebraMap F Ω x) = algebraMap F' Ω' (τ x)) - (φ : Gal(Ω / F) →* Gal(Ω' / F')) - (hφ : ∀ g : Gal(Ω / F), + (φ : Gal(Ω/F) →* Gal(Ω'/F')) + (hφ : ∀ g : Gal(Ω/F), (φ g).toRingEquiv = e.symm.trans (g.toRingEquiv.trans e)) : Continuous φ := by @@ -278,7 +278,7 @@ 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 + 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 @@ -313,7 +313,7 @@ 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 + Continuous ((AlgEquiv.autCongr e).symm : Gal(B/F) → Gal(A/F)) := by rw [AlgEquiv.autCongr_symm] exact algEquiv_autCongr_continuous e.symm @@ -323,7 +323,7 @@ chosen algebraic closure. The extension is canonical because noncomputable def separableClosureExtensionAlgEquiv (K : Type u) [Field K] (τ : Gal(SeparableClosure K/K)) : - Gal(AlgebraicClosure K / K) := by + 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) := @@ -372,7 +372,7 @@ noncomputable def separableClosureExtensionAlgEquiv absolute separable closure. -/ def restrictToSeparableClosure (K : Type u) [Field K] : - Gal(AlgebraicClosure K / K) →* Gal(SeparableClosure K / K) where + Gal(AlgebraicClosure K/K) →* Gal(SeparableClosure K/K) where toFun σ := AlgEquiv.separableClosure σ map_one' := by ext x @@ -449,7 +449,7 @@ theorem extension_restrictToSeparableClosure 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 + Gal(AlgebraicClosure K/K) ≃* Gal(SeparableClosure K/K) where toFun σ := AlgEquiv.separableClosure σ invFun τ := separableClosureExtensionAlgEquiv K τ left_inv σ := extension_restrictToSeparableClosure K σ @@ -462,7 +462,7 @@ noncomputable def separableClosureMulEquiv theorem separableClosureMulEquiv_continuous (K : Type u) [Field K] : Continuous (separableClosureMulEquiv K : - Gal(AlgebraicClosure K / K) → Gal(SeparableClosure K / K)) := by + 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 @@ -593,7 +593,7 @@ theorem separableClosureExtension_mem_fixingSubgroup_of_mem_separablePart theorem separableClosureMulEquiv_symm_continuous (K : Type u) [Field K] : Continuous ((separableClosureMulEquiv K).symm : - Gal(SeparableClosure K / K) → Gal(AlgebraicClosure K / K)) := by + 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 @@ -619,7 +619,7 @@ theorem separableClosureMulEquiv_symm_continuous 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 + Gal(AlgebraicClosure K/K) ≃ₜ* Gal(SeparableClosure K/K) where toMulEquiv := separableClosureMulEquiv K continuous_toFun := separableClosureMulEquiv_continuous K continuous_invFun := separableClosureMulEquiv_symm_continuous K @@ -629,7 +629,7 @@ noncomputable def separableClosureContinuousMulEquiv 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 + Gal(M/E) →* Gal(M/K) where toFun σ := σ.restrictScalars K map_one' := rfl map_mul' _ _ := rfl @@ -665,7 +665,7 @@ theorem range_ofIntermediateFieldInExtension 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 = + (AlgEquiv.restrictNormalHom E : Gal(M/K) →* Gal(E/K)).ker = MonoidHom.range (ofIntermediateFieldInExtension E) := by rw [IntermediateField.restrictNormalHom_ker E, range_ofIntermediateFieldInExtension] @@ -675,7 +675,7 @@ 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 + Gal(AlgebraicClosure K/E) →* Gal(AlgebraicClosure K/K) where toFun σ := σ.restrictScalars K map_one' := rfl map_mul' _ _ := rfl @@ -713,7 +713,7 @@ theorem ofIntermediateField_injective apply AlgEquiv.ext intro x exact congrArg - (fun ρ : Gal(AlgebraicClosure K / K) => ρ x) hστ + (fun ρ : Gal(AlgebraicClosure K/K) => ρ x) hστ /-- States the theorem `ofIntermediateField_eq_iff`. -/ theorem ofIntermediateField_eq_iff @@ -767,7 +767,6 @@ theorem finiteDimensional_extendScalars_sup `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 @@ -859,7 +858,7 @@ theorem ofIntermediateField_continuous `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)) := + OpenSubgroup (Gal(AlgebraicClosure K/K)) := ⟨E.fixingSubgroup, IntermediateField.fixingSubgroup_isOpen E⟩ /-- States the theorem `openSubgroupOfFiniteIntermediateField_toSubgroup`. -/ @@ -867,7 +866,7 @@ def openSubgroupOfFiniteIntermediateField theorem openSubgroupOfFiniteIntermediateField_toSubgroup (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : (openSubgroupOfFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) = + Subgroup (Gal(AlgebraicClosure K/K))) = E.fixingSubgroup := rfl @@ -887,7 +886,7 @@ 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))) ≤ + Subgroup (Gal(AlgebraicClosure K/K))) ≤ openSubgroupOfFiniteIntermediateField K E := by change F.fixingSubgroup ≤ E.fixingSubgroup exact E.fixingSubgroup_le hEF @@ -898,7 +897,7 @@ Its underlying subgroup is the intersection of the open subgroups attached to def openSubgroupOfFiniteIntermediateFieldSup (E F : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] [FiniteDimensional K F] : - OpenSubgroup (Gal(AlgebraicClosure K / K)) := by + 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 @@ -909,9 +908,9 @@ theorem openSubgroupOfFiniteIntermediateFieldSup_toSubgroup (E F : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] [FiniteDimensional K F] : (openSubgroupOfFiniteIntermediateFieldSup K E F : - Subgroup (Gal(AlgebraicClosure K / K))) = + Subgroup (Gal(AlgebraicClosure K/K))) = (openSubgroupOfFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) ⊓ + Subgroup (Gal(AlgebraicClosure K/K))) ⊓ openSubgroupOfFiniteIntermediateField K F := by change (E ⊔ F).fixingSubgroup = E.fixingSubgroup ⊓ F.fixingSubgroup exact IntermediateField.fixingSubgroup_sup @@ -926,11 +925,11 @@ theorem mem_openSubgroupOfFiniteIntermediateFieldSup σ ∈ openSubgroupOfFiniteIntermediateField K F := by change σ ∈ (openSubgroupOfFiniteIntermediateFieldSup K E F : - Subgroup (Gal(AlgebraicClosure K / K))) ↔ + Subgroup (Gal(AlgebraicClosure K/K))) ↔ σ ∈ (openSubgroupOfFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) ∧ + Subgroup (Gal(AlgebraicClosure K/K))) ∧ σ ∈ (openSubgroupOfFiniteIntermediateField K F : - Subgroup (Gal(AlgebraicClosure K / K))) + Subgroup (Gal(AlgebraicClosure K/K))) rw [openSubgroupOfFiniteIntermediateFieldSup_toSubgroup] simp @@ -953,7 +952,7 @@ theorem mem_range_ofIntermediateField_sup_iff to a finite intermediate field. -/ def openSubgroupOfNormalClosureFiniteIntermediateField (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : - OpenSubgroup (Gal(AlgebraicClosure K / K)) := + OpenSubgroup (Gal(AlgebraicClosure K/K)) := openSubgroupOfFiniteIntermediateField K (IntermediateField.normalClosure K E (AlgebraicClosure K)) @@ -962,7 +961,7 @@ def openSubgroupOfNormalClosureFiniteIntermediateField theorem openSubgroupOfNormalClosureFiniteIntermediateField_toSubgroup (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : (openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) = + Subgroup (Gal(AlgebraicClosure K/K))) = (IntermediateField.normalClosure K E (AlgebraicClosure K)).fixingSubgroup := rfl @@ -971,7 +970,7 @@ theorem openSubgroupOfNormalClosureFiniteIntermediateField_toSubgroup theorem openSubgroupOfNormalClosureFiniteIntermediateField_le (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : (openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) ≤ + Subgroup (Gal(AlgebraicClosure K/K))) ≤ openSubgroupOfFiniteIntermediateField K E := by change (IntermediateField.normalClosure K E (AlgebraicClosure K)).fixingSubgroup ≤ E.fixingSubgroup @@ -981,7 +980,7 @@ theorem openSubgroupOfNormalClosureFiniteIntermediateField_le ordinary Galois group `Gal(K^al/E)`. -/ def openSubgroupOfFiniteIntermediateFieldEquiv (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : - openSubgroupOfFiniteIntermediateField K E ≃* Gal(AlgebraicClosure K / E) := + openSubgroupOfFiniteIntermediateField K E ≃* Gal(AlgebraicClosure K/E) := IntermediateField.fixingSubgroupEquiv E /-- States the theorem `openSubgroupOfFiniteIntermediateFieldEquiv_apply`. -/ @@ -990,7 +989,7 @@ theorem openSubgroupOfFiniteIntermediateFieldEquiv_apply (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] (σ : openSubgroupOfFiniteIntermediateField K E) : openSubgroupOfFiniteIntermediateFieldEquiv K E σ = - { AlgEquiv.toRingEquiv (σ : Gal(AlgebraicClosure K / K)) with + { AlgEquiv.toRingEquiv (σ : Gal(AlgebraicClosure K/K)) with commutes' := σ.2 } := rfl @@ -1000,7 +999,7 @@ 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)) = + Gal(AlgebraicClosure K/K)) = ofIntermediateField K E σ := rfl @@ -1009,12 +1008,12 @@ theorem coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply 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 → Gal(AlgebraicClosure K/E)) := by + let H : Subgroup (Gal(AlgebraicClosure K/K)) := openSubgroupOfFiniteIntermediateField K E - let e : H ≃* Gal(AlgebraicClosure K / E) := + let e : H ≃* Gal(AlgebraicClosure K/E) := openSubgroupOfFiniteIntermediateFieldEquiv K E - change Continuous (e : H → Gal(AlgebraicClosure 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 @@ -1027,14 +1026,14 @@ theorem openSubgroupOfFiniteIntermediateFieldEquiv_continuous finiteDimensional_restrictScalars K E F have hOpen : IsOpen {τ : openSubgroupOfFiniteIntermediateField K E | - (τ : Gal(AlgebraicClosure K / K)) ∈ FK.fixingSubgroup} := + (τ : 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} ∈ + (τ : Gal(AlgebraicClosure K/K)) ∈ FK.fixingSubgroup} ∈ 𝓝 (1 : openSubgroupOfFiniteIntermediateField K E) := by apply hOpen.mem_nhds - change (1 : Gal(AlgebraicClosure K / K)) ∈ FK.fixingSubgroup + change (1 : Gal(AlgebraicClosure K/K)) ∈ FK.fixingSubgroup exact FK.fixingSubgroup.one_mem refine Filter.mem_of_superset hMem ?_ intro τ hτ @@ -1042,25 +1041,25 @@ theorem openSubgroupOfFiniteIntermediateFieldEquiv_continuous change e τ ∈ F.fixingSubgroup rw [IntermediateField.mem_fixingSubgroup_iff] intro x hx - change (τ : Gal(AlgebraicClosure K / K)) x = x + 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 + (τ : 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 + Gal(AlgebraicClosure K/E) → openSubgroupOfFiniteIntermediateField K E) := by have hcomp : Continuous - (fun σ : Gal(AlgebraicClosure K / E) => + (fun σ : Gal(AlgebraicClosure K/E) => (((openSubgroupOfFiniteIntermediateFieldEquiv K E).symm σ : openSubgroupOfFiniteIntermediateField K E) : - Gal(AlgebraicClosure K / K))) := by + Gal(AlgebraicClosure K/K))) := by simpa only [coe_openSubgroupOfFiniteIntermediateFieldEquiv_symm_apply, ofIntermediateField] using ofIntermediateField_continuous K E exact Continuous.subtype_mk hcomp fun σ => @@ -1071,7 +1070,7 @@ theorem openSubgroupOfFiniteIntermediateFieldEquiv_symm_continuous def openSubgroupOfFiniteIntermediateFieldContinuousMulEquiv (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : openSubgroupOfFiniteIntermediateField K E ≃ₜ* - Gal(AlgebraicClosure K / E) := + Gal(AlgebraicClosure K/E) := { toMulEquiv := openSubgroupOfFiniteIntermediateFieldEquiv K E continuous_toFun := openSubgroupOfFiniteIntermediateFieldEquiv_continuous K E continuous_invFun := openSubgroupOfFiniteIntermediateFieldEquiv_symm_continuous K E } @@ -1082,7 +1081,7 @@ 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 + Subgroup (Gal(AlgebraicClosure K/K))) := by rw [range_ofIntermediateField] rfl @@ -1091,7 +1090,7 @@ theorem range_ofIntermediateField_eq_openSubgroup theorem isOpen_range_ofIntermediateField (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : IsOpen (MonoidHom.range (ofIntermediateField K E) : - Set (Gal(AlgebraicClosure K / K))) := by + Set (Gal(AlgebraicClosure K/K))) := by rw [range_ofIntermediateField_eq_openSubgroup] exact (openSubgroupOfFiniteIntermediateField K E).isOpen' @@ -1117,7 +1116,7 @@ theorem openSubgroupOfFiniteIntermediateField_normal (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] [Normal K E] : ((openSubgroupOfFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K)))).Normal := by + Subgroup (Gal(AlgebraicClosure K/K)))).Normal := by change E.fixingSubgroup.Normal infer_instance @@ -1125,7 +1124,7 @@ theorem openSubgroupOfFiniteIntermediateField_normal theorem openSubgroupOfNormalClosureFiniteIntermediateField_normal (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : ((openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K)))).Normal := by + 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 @@ -1147,11 +1146,11 @@ ordinary Galois group `Gal(E/K)`. The quotient is written with `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) := + 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 E : Gal(AlgebraicClosure K/K) →* Gal(E/K)) (AlgEquiv.restrictNormalHom_surjective (AlgebraicClosure K))) /-- States the theorem `quotientEquivGalOfNormalIntermediateField_mk'`. -/ @@ -1162,27 +1161,27 @@ theorem quotientEquivGalOfNormalIntermediateField_mk' (QuotientGroup.mk' E.fixingSubgroup σ) = AlgEquiv.restrictNormalHom E σ := by exact QuotientGroup.kerLift_mk - (AlgEquiv.restrictNormalHom E : Gal(AlgebraicClosure K / K) →* Gal(E / K)) σ + (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) ⧸ + Gal(AlgebraicClosure K/K) ⧸ (openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) ≃* - Gal(IntermediateField.normalClosure K E (AlgebraicClosure K) / K) := + 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)) : + (σ : Gal(AlgebraicClosure K/K)) : quotientNormalClosureOpenSubgroupEquivGal K E (QuotientGroup.mk' (openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K))) σ) = + Subgroup (Gal(AlgebraicClosure K/K))) σ) = AlgEquiv.restrictNormalHom (IntermediateField.normalClosure K E (AlgebraicClosure K)) σ := quotientEquivGalOfNormalIntermediateField_mk' K @@ -1193,8 +1192,8 @@ 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 + 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 @@ -1202,7 +1201,7 @@ theorem openSubgroupOfNormalClosureFiniteIntermediateField_index_eq_natCard_gal instance openSubgroupOfNormalClosureFiniteIntermediateField.instFiniteIndex (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : ((openSubgroupOfNormalClosureFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K)))).FiniteIndex := by + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex := by rw [Subgroup.finiteIndex_iff, openSubgroupOfNormalClosureFiniteIntermediateField_index_eq_natCard_gal] exact Nat.card_pos.ne' @@ -1211,7 +1210,7 @@ instance openSubgroupOfNormalClosureFiniteIntermediateField.instFiniteIndex instance openSubgroupOfFiniteIntermediateField.instFiniteIndex (E : IntermediateField K (AlgebraicClosure K)) [FiniteDimensional K E] : ((openSubgroupOfFiniteIntermediateField K E : - Subgroup (Gal(AlgebraicClosure K / K)))).FiniteIndex := + Subgroup (Gal(AlgebraicClosure K/K)))).FiniteIndex := Subgroup.finiteIndex_of_le (openSubgroupOfNormalClosureFiniteIntermediateField_le K E) @@ -1222,7 +1221,7 @@ 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 + 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 @@ -1247,18 +1246,18 @@ theorem range_ofIntermediateField_index_eq_finrank 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 : OpenSubgroup (Gal(AlgebraicClosure K/K))) : + ClosedSubgroup (Gal(AlgebraicClosure K/K)) := ⟨H.toSubgroup, by - change IsClosed (H : Set (Gal(AlgebraicClosure K / K))) + 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))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : (closedSubgroupOfOpenSubgroup K H : - Subgroup (Gal(AlgebraicClosure K / K))) = H.toSubgroup := + Subgroup (Gal(AlgebraicClosure K/K))) = H.toSubgroup := rfl /-- The finite fixed field attached to an open subgroup of `G_K`. -/ @@ -1383,23 +1382,23 @@ theorem fixedFieldOfOpenSubgroup_sup rw [fixedFieldOfOpenSubgroup_def, IntermediateField.mem_fixedField_iff] at hxH hxJ ⊢ intro σ hσ change σ ∈ (H.toSubgroup ⊔ J.toSubgroup : - Subgroup (Gal(AlgebraicClosure K / K))) at hσ + 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σ + (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 + 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τ + ((show Gal(AlgebraicClosure K/K) from τ)⁻¹) y) hτ simpa using h.symm /-- Conjugate an arbitrary open subgroup of `G_K` through the finite-level @@ -1407,14 +1406,14 @@ 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)) + (σ : Gal(AlgebraicClosure K/K)) (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : - OpenSubgroup (Gal(AlgebraicClosure K / K)) := by + 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) := σ + let σ' : Gal(AlgebraicClosure K/K) := σ haveI : FiniteDimensional K (E.map σ'.toAlgHom) := finiteDimensional_map_algEquiv σ' E exact openSubgroupOfFiniteIntermediateField K (E.map σ'.toAlgHom) @@ -1424,14 +1423,14 @@ conjugate subgroup. -/ @[simp] theorem conjugateOpenSubgroupOfOpenSubgroup_toSubgroup [IsGalois K (AlgebraicClosure K)] - (σ : Gal(AlgebraicClosure K / K)) - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (σ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : (conjugateOpenSubgroupOfOpenSubgroup K σ H : - Subgroup (Gal(AlgebraicClosure K / K))) = + 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) := σ + let σ' : Gal(AlgebraicClosure K/K) := σ change (E.map σ'.toAlgHom).fixingSubgroup = Subgroup.map (MulAut.conj σ').toMonoidHom H.toSubgroup calc @@ -1449,12 +1448,12 @@ theorem conjugateOpenSubgroupOfOpenSubgroup_toSubgroup 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))) : + (σ τ : Gal(AlgebraicClosure K/K)) + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : τ ∈ conjugateOpenSubgroupOfOpenSubgroup K σ H ↔ σ⁻¹ * τ * σ ∈ H := by change τ ∈ (conjugateOpenSubgroupOfOpenSubgroup K σ H : - Subgroup (Gal(AlgebraicClosure K / K))) ↔ + Subgroup (Gal(AlgebraicClosure K/K))) ↔ σ⁻¹ * τ * σ ∈ H rw [conjugateOpenSubgroupOfOpenSubgroup_toSubgroup] constructor @@ -1473,15 +1472,15 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup fixedFieldOfOpenSubgroup K (conjugateOpenSubgroupOfOpenSubgroup K σ H) = (fixedFieldOfOpenSubgroup K H).map - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom := by + (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 + (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) + (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. -/ @@ -1492,7 +1491,7 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_inf fixedFieldOfOpenSubgroup K (conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊓ J)) = (fixedFieldOfOpenSubgroup K H ⊔ fixedFieldOfOpenSubgroup K J).map - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom := by + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := by rw [fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup, fixedFieldOfOpenSubgroup_inf] @@ -1505,7 +1504,7 @@ theorem fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup_sup fixedFieldOfOpenSubgroup K (conjugateOpenSubgroupOfOpenSubgroup K σ (H ⊔ J)) = (fixedFieldOfOpenSubgroup K H ⊓ fixedFieldOfOpenSubgroup K J).map - (show Gal(AlgebraicClosure K / K) from σ).toAlgHom := by + (show Gal(AlgebraicClosure K/K) from σ).toAlgHom := by rw [fixedFieldOfConjugateOpenSubgroupOfOpenSubgroup, fixedFieldOfOpenSubgroup_sup] @@ -1559,10 +1558,10 @@ level. -/ def openNormalCoreOfOpenSubgroup [IsGalois K (AlgebraicClosure K)] (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : - OpenNormalSubgroup (Gal(AlgebraicClosure K / K)) where + OpenNormalSubgroup (Gal(AlgebraicClosure K/K)) where toOpenSubgroup := ⟨H.toSubgroup.normalCore, by - have : Finite (Gal(AlgebraicClosure K / K) ⧸ H.toSubgroup) := + 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 @@ -1574,17 +1573,17 @@ def openNormalCoreOfOpenSubgroup @[simp] theorem openNormalCoreOfOpenSubgroup_toSubgroup [IsGalois K (AlgebraicClosure K)] - (H : OpenSubgroup (Gal(AlgebraicClosure K / K))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : (openNormalCoreOfOpenSubgroup K H : - Subgroup (Gal(AlgebraicClosure K / K))) = H.toSubgroup.normalCore := + 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))) : + (H : OpenSubgroup (Gal(AlgebraicClosure K/K))) : (openNormalCoreOfOpenSubgroup K H : - Subgroup (Gal(AlgebraicClosure K / K))) ≤ H.toSubgroup := by + Subgroup (Gal(AlgebraicClosure K/K))) ≤ H.toSubgroup := by rw [openNormalCoreOfOpenSubgroup_toSubgroup] exact Subgroup.normalCore_le H.toSubgroup @@ -1635,9 +1634,9 @@ 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)) := + 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 @@ -1648,12 +1647,12 @@ def quotientOpenNormalSubgroupEquivGalFixedField theorem quotientOpenNormalSubgroupEquivGalFixedField_mk' [IsGalois K (AlgebraicClosure K)] (H : OpenNormalSubgroup (Gal(AlgebraicClosure K/K))) - (σ : 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)) := + let Hc : ClosedSubgroup (Gal(AlgebraicClosure K/K)) := closedSubgroupOfOpenSubgroup K H.toOpenSubgroup have : Hc.Normal := by change H.toSubgroup.Normal @@ -1674,7 +1673,7 @@ theorem fixedFieldOfOpenNormalCoreOfOpenSubgroup (AlgebraicClosure K) := by let E : IntermediateField K (AlgebraicClosure K) := fixedFieldOfOpenSubgroup K H - let C : OpenNormalSubgroup (Gal(AlgebraicClosure K / K)) := + let C : OpenNormalSubgroup (Gal(AlgebraicClosure K/K)) := openNormalCoreOfOpenSubgroup K H apply intermediateField_eq_of_fixingSubgroup_eq K change (fixedFieldOfOpenSubgroup K C.toOpenSubgroup).fixingSubgroup = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean index 3413cefa36..c1300a799b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -24,6 +24,27 @@ valued-field equality between this average and the actual quotient depth is the separate input of the quotient-depth identity. -/ +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 @@ -115,7 +136,7 @@ omit [H.Normal] in /-- States the theorem `truncatedLowerDepth_add_one`. -/ theorem truncatedLowerDepth_add_one (n : ℕ) (τ : (D.depthLowerFiltration H).lower 0) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ + 1 = + (truncatedLowerDepth (D.depthLowerFiltration H)) n τ + 1 = WithTop.untopD (α := ℕ) 0 (min (D.depth ((τ : H) : G)) (WithTop.some (n + 1))) := by classical @@ -126,7 +147,7 @@ theorem truncatedLowerDepth_add_one (n : ℕ) Finset.range n := by ext i simp [depthLowerFiltration, depthLowerSubgroup, htop] - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth, hfilter] + 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 @@ -154,7 +175,7 @@ theorem truncatedLowerDepth_add_one (n : ℕ) simp only [lt_min_iff] at hi refine ⟨hi.1, WithTop.coe_le_coe.2 ?_⟩ omega - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth, hfilter, ← hdepth] + rw [truncatedLowerDepth, hfilter, ← hdepth] rw [← WithTop.coe_min] simp only [Finset.card_range, WithTop.untopD_coe] omega @@ -187,7 +208,7 @@ theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Finite G] : (min (D.depth (τ : G)) (WithTop.some (n + 1))) : ℝ)) = D.depthRamificationIndex H + ∑ τ : (D.depthLowerFiltration H).lower 0, - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ) := by + ((truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ) := by classical let := Fintype.ofFinite G classical @@ -215,7 +236,7 @@ theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Finite G] : simp [p] _ = ∑ τ : F.lower 0, ((1 : ℝ) + - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) n τ : ℝ)) := by + ((truncatedLowerDepth F) n τ : ℝ)) := by apply Finset.sum_congr rfl intro τ _ dsimp [f, F] @@ -223,7 +244,7 @@ theorem sum_min_depth_eq_card_add_truncated (n : ℕ) [Finite G] : simpa [add_comm] using (D.truncatedLowerDepth_add_one H n τ).symm) _ = D.depthRamificationIndex H + ∑ τ : F.lower 0, - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) n τ : ℝ) := by + ((truncatedLowerDepth F) n τ : ℝ) := by rw [Finset.sum_add_distrib] congr 1 calc @@ -247,7 +268,7 @@ theorem quotientFiberAverage_sub_one_eq_herbrandValueNat_of_depth_eq_succ D.depth γ ≤ D.depth σ) (n : ℕ) (hdepth : D.depth σ = WithTop.some (n + 1)) : D.quotientFiberAverage H hq - 1 = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat (D.depthLowerFiltration H)) n := by + (herbrandValueNat (D.depthLowerFiltration H)) n := by classical let F := D.depthLowerFiltration H let f : WithTop ℕ → ℝ := fun d => @@ -280,13 +301,13 @@ theorem quotientFiberAverage_sub_one_eq_herbrandValueNat_of_depth_eq_succ rw [← hsum] at hdecomp rw [quotientFiberAverage, hdecomp] rw [show - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat + (herbrandValueNat (D.depthLowerFiltration H)) n = (∑ τ : (D.depthLowerFiltration H).lower 0, - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ)) / + ((truncatedLowerDepth (D.depthLowerFiltration H)) n τ : ℝ)) / D.depthRamificationIndex H by simpa [depthRamificationIndex] using - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandValueNat_eq_depth_sum (D.depthLowerFiltration H) n] + 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 @@ -328,7 +349,7 @@ theorem quotientFiberAverage_sub_one_eq_herbrandFunction_of_maximal (hmax : ∀ γ : G, QuotientGroup.mk' H γ = q → D.depth γ ≤ D.depth σ) : D.quotientFiberAverage H hq - 1 = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (D.depthLowerFiltration H)) + (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 @@ -365,7 +386,7 @@ theorem quotientFiberAverage_ge_herbrandFunction_add_one_iff_exists D.depth γ ≤ D.depth σ) (s : ℕ) : D.quotientFiberAverage H hq ≥ - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (D.depthLowerFiltration H)) s + 1 ↔ + (herbrandFunction (D.depthLowerFiltration H)) s + 1 ↔ ∃ γ : QuotientFiber H q, WithTop.some (s + 1) ≤ D.depth (γ : G) := by let F := D.depthLowerFiltration H @@ -400,16 +421,16 @@ theorem quotientFiberAverage_ge_herbrandFunction_add_one_iff_exists exact WithTop.coe_le_coe rw [hfiber, hwithTopNat, ← hrealNat] change D.quotientFiberAverage H hq ≥ - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction F) s + 1 ↔ _ rw [show D.quotientFiberAverage H hq ≥ - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction F) s + 1 ↔ - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s ≤ D.quotientFiberAverage H hq - 1 by + (herbrandFunction F) s ≤ D.quotientFiberAverage H hq - 1 by constructor <;> intro h <;> linarith] rw [havg] exact - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).le_iff_le + (herbrandFunction_strictMono F).le_iff_le /-- Every nontrivial quotient fibre admits a maximal representative for which the Herbrand fibre-average identity holds. -/ @@ -419,7 +440,7 @@ theorem exists_maximal_representative_quotientFiberAverage [Fintype G] (∀ γ : G, QuotientGroup.mk' H γ = q → D.depth γ ≤ D.depth σ) ∧ D.quotientFiberAverage H hq - 1 = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (D.depthLowerFiltration H)) + (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, ?_⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean index df595bdd25..5771cc8076 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean @@ -11,6 +11,51 @@ import Mathlib.FieldTheory.Galois.Basic # Fixed-field group models for Herbrand towers -/ +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 @@ -31,7 +76,7 @@ def fixedFieldSubextensionFiltration (H : Subgroup Gal(L/K)) : AntitoneNormalSubgroupFiltration Gal(L/IntermediateField.fixedField H) := RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) omit [IsGalois K L] in @@ -50,7 +95,7 @@ def fixedFieldQuotientImageFiltration (F : AntitoneNormalSubgroupFiltration Gal(L/K)) (H : Subgroup Gal(L/K)) [H.Normal] : AntitoneNormalSubgroupFiltration Gal(IntermediateField.fixedField H/K) := - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport F H) (IsGalois.normalAutEquivQuotient H) + (quotientImageTransport F H) (IsGalois.normalAutEquivQuotient H) /-- States the theorem `fixedFieldQuotientImageFiltration_lower`. -/ @[simp] theorem fixedFieldQuotientImageFiltration_lower @@ -72,73 +117,69 @@ theorem card_fixedFieldSubextension_mul_card_fixedFieldQuotientImage Nat.card (F.lower n) := by change Nat.card ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.transportEquiv - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + (subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H)).lower n) * Nat.card - (((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport F H) + (((quotientImageTransport F H) (IsGalois.normalAutEquivQuotient H)).lower n) = _ - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + rw [card_lower_transportEquiv (subgroupFiltration F H) (IntermediateField.subgroupEquivAlgEquiv H) n] exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_subgroupFiltration_mul_card_quotientImageTransport F H + 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 : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction (fixedFieldSubextensionFiltration F H)) s = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H)) s := by + (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 - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + 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 : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldSubextensionFiltration F H)) t = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H)) t := by + (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 - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_transportEquiv (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.subgroupFiltration F H) + 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 : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction (fixedFieldQuotientImageFiltration F H)) s = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) s := by + (herbrandFunction (quotientImageFiltration F H)) s := by let : Fintype Gal(IntermediateField.fixedField H/K) := Fintype.ofFinite Gal(IntermediateField.fixedField H/K) exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_herbrandFunction F H + 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 : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (fixedFieldQuotientImageFiltration F H)) t = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageFiltration F H)) t := by + (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 - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.quotientImageTransport_inverseHerbrandFunction F H + quotientImageTransport_inverseHerbrandFunction F H (IsGalois.normalAutEquivQuotient H) t end Higher diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean index 68d35dd617..f0426bec1f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -22,6 +22,27 @@ averaging; the inverse-function and upper-numbering statements are proved direct in the Hilbert-ramification Herbrand theorem module. -/ +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 @@ -190,7 +211,6 @@ def lowerEquivTransportEquiv /-- 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 @@ -200,11 +220,11 @@ equivalence. -/ theorem herbrandFunction_transportEquiv [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction (transportEquiv F e)) s = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s := by + (herbrandFunction F) s := by apply - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq (transportEquiv F e) F + herbrandFunction_eq_of_card_lower_eq (transportEquiv F e) F intro n exact card_lower_transportEquiv F e n @@ -213,12 +233,12 @@ group equivalence. -/ theorem inverseHerbrandFunction_transportEquiv [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (e : G ≃* G') (t : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (transportEquiv F e)) t = (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t := by + (inverseHerbrandFunction (transportEquiv F e)) t = (inverseHerbrandFunction F) t := by apply - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono (transportEquiv F e)).injective - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] + (herbrandFunction_strictMono (transportEquiv F e)).injective + rw [herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv F)] - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction F)] + rw [(herbrandFunction_inverseHerbrandFunction F)] /-- The quotient-image filtration, transported to any isomorphic model of the quotient group. -/ @@ -301,9 +321,9 @@ theorem quotientImageTransport_herbrandFunction [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] (e : (G ⧸ H) ≃* G') (s : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction (quotientImageTransport F H e)) s = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction (quotientImageFiltration F H)) s := + (herbrandFunction (quotientImageFiltration F H)) s := by exact herbrandFunction_transportEquiv (quotientImageFiltration F H) e s @@ -312,8 +332,8 @@ theorem quotientImageTransport_inverseHerbrandFunction [Finite G] [Finite G'] (F : AntitoneNormalSubgroupFiltration G) (H : Subgroup G) [H.Normal] (e : (G ⧸ H) ≃* G') (t : ℝ) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (quotientImageTransport F H e)) t = - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction (quotientImageFiltration F H)) t := + (inverseHerbrandFunction (quotientImageTransport F H e)) t = + (inverseHerbrandFunction (quotientImageFiltration F H)) t := by exact inverseHerbrandFunction_transportEquiv (quotientImageFiltration F H) e t diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean index 2c96969b47..a785eb24df 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -17,6 +17,11 @@ the archimedean case; the valuation-subring statements give the three nonarchimedean homomorphisms. -/ +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' @@ -188,7 +193,7 @@ private theorem mem_inertiaGroup_iff_sub_mem_nonunits change sigma • (IsLocalRing.residue A x) = IsLocalRing.residue A x at happ rw [← IsLocalRing.ResidueField.residue_smul, - ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + residue_eq_residue_iff_sub_mem_maximalIdeal] at happ exact A.coe_mem_nonunits_iff.mpr happ · intro hsigma @@ -198,7 +203,7 @@ private theorem mem_inertiaGroup_iff_sub_mem_nonunits change sigma • (IsLocalRing.residue A x) = IsLocalRing.residue A x rw [← IsLocalRing.ResidueField.residue_smul, - ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + residue_eq_residue_iff_sub_mem_maximalIdeal] exact A.coe_mem_nonunits_iff.mp (hsigma x) include hsquare in diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean index 8b7d416778..d3dad74939 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -19,6 +19,11 @@ canonical residue-field isomorphism and equality of absolute-value ranges in the nonarchimedean case. -/ +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 @@ -471,7 +476,7 @@ theorem decompositionField_decompositionField_residueMap_surjective change IsLocalRing.ResidueField.map f (IsLocalRing.residue AK xA) = IsLocalRing.residue AZ z rw [IsLocalRing.ResidueField.map_residue] - rw [ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + rw [residue_eq_residue_iff_sub_mem_maximalIdeal] rw [absoluteValueValuationSubring_mem_maximalIdeal_iff_abs_lt_one] calc (AlgebraicNumberTheory.Valuations.absoluteValueRestrictIntermediateField w.1 Z) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean index 1bacb13b2c..ca1e4e1925 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean @@ -33,7 +33,6 @@ 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 = ⊤) @@ -123,7 +122,6 @@ 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 : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean index f0e386310a..d8976b7483 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean @@ -74,7 +74,6 @@ theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le 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⟩ @@ -82,7 +81,6 @@ theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le 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) := @@ -95,7 +93,6 @@ theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le 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 σ @@ -105,7 +102,6 @@ theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le rw [hIH] exact Nat.card_congr (Subgroup.subgroupOfEquivOfLe (hI Q)).toEquiv - have hcard_base : Nat.card (inertiaGroup Q G) = Q.ramificationIdx ℤ := @@ -119,7 +115,6 @@ theorem fixedFieldOfSubgroup_forall_isUnramifiedAt_of_inertiaGroup_le 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) := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean index 789ec998b5..47ca5090c0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean @@ -112,7 +112,7 @@ noncomputable def chosenLowerRamificationFiltration (base : CompleteDVF.{u, v} K) (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration - Gal(E / K) := + Gal(E/K) := Higher.lowerRamificationFiltrationOfUniqueExtension (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) @@ -122,7 +122,7 @@ integral-closure valuation. -/ noncomputable def chosenUpperRamificationFiltration (base : CompleteDVF.{u, v} K) (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : - ℝ → Subgroup Gal(E / K) := fun t => + ℝ → Subgroup Gal(E/K) := fun t => Higher.upperRamificationGroupOfUniqueExtension (base := base.toDVF) (target := (chosenIntegralClosureTarget base E).toDVF) (chosenIntegralClosureTarget_hasUniqueDVFValuationExtension base E) t @@ -131,7 +131,7 @@ noncomputable def chosenUpperRamificationFiltration noncomputable abbrev chosenUpperRamificationGroup (base : CompleteDVF.{u, v} K) (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) - (t : ℝ) : Subgroup Gal(E / K) := + (t : ℝ) : Subgroup Gal(E/K) := chosenUpperRamificationFiltration base E t /-- States the theorem `chosenUpperRamificationFiltration_apply`. -/ @@ -160,8 +160,8 @@ theorem chosenLowerRamificationGroup_isClosed (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 + ((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 @@ -181,7 +181,7 @@ 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 + 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 index 7fadb99d12..f435c3720a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean @@ -15,6 +15,11 @@ filtration formed from the chosen integral-closure target with the filtration formed from any other complete-DVF target extending the base valuation. -/ +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + inverseHerbrandFunction → + inverseHerbrandFunction + + noncomputable section universe u v w x y z @@ -167,7 +172,6 @@ theorem lowerRamificationFiltration_eq_of_valuationSubring_eq /-- 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, @@ -189,7 +193,6 @@ theorem herbrandFunction_eq_of_valuationSubring_eq /-- 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, @@ -205,7 +208,7 @@ theorem inverseHerbrandFunction_eq_of_valuationSubring_eq huniq huniq' hvaluationSubring exact congrArg (fun F => - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) + inverseHerbrandFunction F) hF /-- Upper ramification groups are unchanged when the two target valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean index 5095424069..98890d52ae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -16,6 +16,17 @@ For `M = L ^ H`, this file defines `e(L/M)` from the literal inclusion depth subgroup require no completeness or Henselian hypothesis. -/ +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 @@ -295,8 +306,8 @@ private theorem depthLowerFiltration_zero_eq_fixedFieldInertiaSubgroupDVF (base := base) (target := target) huniq).depthLowerFiltration H).lower 0 = target.maximalIdeal.toAddSubgroup.inertia H ext tau - rw [RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth.depthLowerFiltration_lower, - RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth.mem_depthLowerSubgroup_iff] + rw [depthLowerFiltration_lower, + mem_depthLowerSubgroup_iff] change (1 : ℕ∞) ≤ intrinsicRamificationNumberOfUniqueExtension (base := base) (target := target) huniq (tau : Gal(L/K)) ↔ @@ -346,7 +357,7 @@ private theorem card_stabilizer_eq_inertia_mul_inertiaDeg 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 Gal(P.ResidueField/p.ResidueField) := Nat.card_congr (IsFractionRing.stabilizerQuotientInertiaEquiv G p P p.ResidueField P.ResidueField).toEquiv diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean index 50e5cbb6ab..beb0165375 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -109,7 +109,10 @@ theorem base_hasExtension_fixedFieldValuationSubringDVF (K := K) (target := target) H).valuation := by apply _root_.Valuation.HasExtension.ofComapInteger ext a - simp [ValuationSubring.integer_valuation, _root_.Valuation.mem_integer_iff] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean index 6dbbef2283..82c23435fa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean @@ -32,7 +32,7 @@ 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) : + ∀ σ : Gal(M/K), σ b = b → σ a = a) : K⟮a⟯ ≤ K⟮b⟯ := by rw [← IsGalois.fixedField_fixingSubgroup K⟮b⟯, IntermediateField.adjoin_le_iff] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean index 59b02b1608..7861636e8e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean @@ -17,6 +17,31 @@ the definitions or elementary inverse-function facts below assumes that either field is complete. -/ +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 @@ -83,7 +108,7 @@ noncomputable def inverseHerbrandFunctionOfUniqueExtension (huniq : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension.{u, v, w, x, x} base target) (t : ℝ) : ℝ := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction + inverseHerbrandFunction (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) t @@ -108,7 +133,7 @@ omit [FiniteDimensional K L] in base target) (t : ℝ) : inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq t = - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction + inverseHerbrandFunction (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) t := rfl @@ -122,7 +147,7 @@ theorem herbrandFunctionOfUniqueExtension_psi (base := base) (target := target) huniq (inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq t) = t := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction + herbrandFunction_inverseHerbrandFunction (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) t @@ -135,7 +160,7 @@ theorem inverseHerbrandFunctionOfUniqueExtension_eta (base := base) (target := target) huniq (herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq s) = s := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_herbrandFunction + inverseHerbrandFunction_herbrandFunction (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) s @@ -146,7 +171,7 @@ theorem herbrandFunctionOfUniqueExtension_strictMono base target) : StrictMono (herbrandFunctionOfUniqueExtension (base := base) (target := target) huniq) := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono + herbrandFunction_strictMono (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) @@ -157,7 +182,7 @@ theorem inverseHerbrandFunctionOfUniqueExtension_strictMono base target) : StrictMono (inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq) := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_strictMono + inverseHerbrandFunction_strictMono (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) @@ -195,7 +220,7 @@ theorem inverseHerbrandFunctionOfUniqueExtension_ge_neg_one_iff base target) {t : ℝ} : -1 ≤ inverseHerbrandFunctionOfUniqueExtension (base := base) (target := target) huniq t ↔ -1 ≤ t := - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction_mem_Ici_neg_one_iff + inverseHerbrandFunction_mem_Ici_neg_one_iff (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean index ec86b960f8..a1b9d6b4b0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean @@ -20,6 +20,27 @@ the Herbrand quotient theorem and the quotient and tower filtration theorems. T the finite-group averaging argument used in the quotient-filtration comparison. -/ +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 @@ -339,7 +360,7 @@ private theorem truncate_depth_eq_intrinsic_summand_of_mem have : (k : ℝ) ≤ m + 1 := by exact_mod_cast hk_upper linarith rw [htrunc, hdepth] - simp [hsigma] + 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 @@ -423,7 +444,7 @@ private theorem herbrandFunction_eq_depth_sum_of_mem (hmem : ∀ n sigma, sigma ∈ F.lower n ↔ (((n + 1 : ℕ) : ℕ∞) ≤ depth sigma)) {s : ℝ} (hs : -1 ≤ s) : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction F) s = (1 / Nat.card (F.lower 0) : ℝ) * (∑ sigma : G, truncateENatAtDVF (depth sigma) (s + 1)) - 1 := by @@ -442,7 +463,7 @@ private theorem herbrandFunction_eq_depth_sum_of_mem field_simp ring · have hsle : s ≤ 0 := le_of_not_ge hs0 - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos F) hsle] + rw [(herbrandFunction_of_nonpos F) hsle] have hpoint : ∀ sigma : F.lower 0, truncateENatAtDVF (depth (sigma : G)) (s + 1) = s + 1 := by intro sigma @@ -640,7 +661,7 @@ private theorem depth_herbrandFunction_add_one_eq_average classical let F := D.depthLowerFiltration H change - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction + (herbrandFunction F) s + 1 = (1 / (Nat.card (F.lower 0) : ℝ)) * ∑ tau : H, truncateENatAtDVF (D.depth (tau : G)) (s + 1) @@ -656,7 +677,7 @@ private theorem depth_herbrandFunction_add_one_eq_average field_simp ring · have hsle : s ≤ 0 := le_of_not_ge hs0 - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos F) hsle] + 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 @@ -1283,8 +1304,8 @@ theorem herbrandFunction_trans (base := base) (target := target) huniq H let S := fixedFieldSubextensionFiltration F H change - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos F) hs0, + (herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) + rw [(herbrandFunction_of_nonpos F) hs0, S.herbrandFunction_of_nonpos hs0, Q.herbrandFunction_of_nonpos hs0] @@ -1309,16 +1330,16 @@ theorem inverseHerbrandFunction_trans (base := base) (target := target) huniq H let S := fixedFieldSubextensionFiltration F H have heta : ∀ s : ℝ, - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction F) s = Q.herbrandFunction (S.herbrandFunction s) := by + (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 - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) + (inverseHerbrandFunction F) t = S.inverseHerbrandFunction (Q.inverseHerbrandFunction t) apply - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_strictMono F).injective - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_inverseHerbrandFunction F)] + (herbrandFunction_strictMono F).injective + rw [(herbrandFunction_inverseHerbrandFunction F)] rw [heta] rw [S.herbrandFunction_inverseHerbrandFunction, Q.herbrandFunction_inverseHerbrandFunction] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean index 7eb9811d1d..8b780dc02d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -27,6 +27,11 @@ density consequences needed to transport inertia and ramification conditions between `L` and `L_w`. None of the results below assumes finite degree. -/ +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 @@ -99,7 +104,7 @@ theorem mem_inertiaGroup_iff_sub_mem_nonunits change sigma • (IsLocalRing.residue A x) = IsLocalRing.residue A x at happ rw [← IsLocalRing.ResidueField.residue_smul, - ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + residue_eq_residue_iff_sub_mem_maximalIdeal] at happ exact A.coe_mem_nonunits_iff.mpr happ · intro hsigma @@ -109,7 +114,7 @@ theorem mem_inertiaGroup_iff_sub_mem_nonunits change sigma • (IsLocalRing.residue A x) = IsLocalRing.residue A x rw [← IsLocalRing.ResidueField.residue_smul, - ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + residue_eq_residue_iff_sub_mem_maximalIdeal] exact A.coe_mem_nonunits_iff.mp (hsigma x) end ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean index d728f33960..3ba780ce02 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -17,6 +17,23 @@ supplies the generator hidden inside uses exactly the canonical standing hypotheses and has no generator parameter. -/ +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 @@ -83,7 +100,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa (intrinsicRamificationNumberOfUniqueExtension (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1) = - 1 + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq)) m sigma : ℝ) + + 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) @@ -94,7 +112,7 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa let i := intrinsicRamificationNumberOfUniqueExtension (base := base) (target := target) huniq (sigma : Gal(L/K)) change truncateENatAtDVF i (s + 1) = - 1 + ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma : ℝ) + + 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 @@ -105,8 +123,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa (base := base) (target := target) huniq (m + 1) (sigma : Gal(L/K))).2 (by simpa [i, Nat.add_assoc] using hhigh) have hdepth : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = m := by - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + (truncatedLowerDepth F) m sigma = m := by + rw [truncatedLowerDepth] rw [Finset.filter_eq_self.2] · simp · intro j hj @@ -141,8 +159,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa (sigma : Gal(L/K))).1 hmem exact hhigh (by simpa [i, Nat.add_assoc] using hge) have hdepth : - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma = k - 1 := by - rw [RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth] + (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)) = @@ -168,7 +186,8 @@ theorem truncate_intrinsicRamificationNumberOfUniqueExtension_eq_intrinsic_summa have : (k : ℝ) ≤ m + 1 := by exact_mod_cast hk_upper linarith rw [htrunc, hdepth] - simp [hmem] + simp only [lowerRamificationFiltrationOfUniqueExtension_lower, hmem, ↓reduceIte, mul_zero, + add_zero] exact_mod_cast (by omega : k = 1 + (k - 1)) /-- States the theorem @@ -251,7 +270,8 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int (base := base) (target := target) huniq).lower 0) + (∑ sigma : (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq).lower 0, - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth (lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq)) m sigma : ℝ)) + + ((truncatedLowerDepth (lowerRamificationFiltrationOfUniqueExtension (base := base) + (target := target) huniq)) m sigma : ℝ)) + (s - m) * Nat.card ((lowerRamificationFiltrationOfUniqueExtension (base := base) (target := target) huniq).lower (m + 1)) := by classical @@ -262,7 +282,7 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int (base := base) (target := target) huniq (sigma : Gal(L/K))) (s + 1)) = (Nat.card (F.lower 0) : ℝ) + (∑ sigma : F.lower 0, - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma : ℝ)) + + ((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] @@ -271,10 +291,10 @@ theorem sum_inertia_truncate_intrinsicRamificationNumberOfUniqueExtension_eq_int (if (sigma : Gal(L/K)) ∈ F.lower (m + 1) then (1 : ℝ) else 0)) = Nat.card (F.lower (m + 1)) := by exact_mod_cast - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.card_lower_succ_eq_sum_indicator F) m).symm + ((card_lower_succ_eq_sum_indicator F) m).symm change Finset.sum Finset.univ (fun sigma : F.lower 0 => (1 : ℝ) + - ((RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.truncatedLowerDepth F) m sigma : ℝ) + + ((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] @@ -319,11 +339,11 @@ theorem herbrandFunctionOfUniqueExtension_eq_intrinsicRamificationNumber_sum 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 [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_depth_sum_of_mem_Icc F) 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 [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos F) hsle] + rw [(herbrandFunction_of_nonpos F) hsle] have hpoint : ∀ sigma : F.lower 0, truncateENatAtDVF (intrinsicRamificationNumberOfUniqueExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean index 42c1b10715..d597a87dcd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -419,7 +419,7 @@ theorem dvfValuationSubringUnitAut_div_mem_succ (base := base) (target := target) huniq sigma (a : target.valuationSubring) - (a : target.valuationSubring)) := by - simp [div_eq_mul_inv] + simp? [div_eq_mul_inv] have hinv : ((a⁻¹ : target.valuationSubringˣ) : target.valuationSubring) * (a : target.valuationSubring) = 1 := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean index 0ae06232c9..f26572da1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean @@ -14,6 +14,11 @@ that the resulting Galois groups have the same upper filtration, after identifying their automorphisms by their common action on the target. -/ +open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming + herbrandFunction_eq_of_card_lower_eq → + herbrandFunction_eq_of_card_lower_eq + + noncomputable section namespace RamificationTheory.LocalField @@ -34,7 +39,7 @@ noncomputable def galoisGroupEquivOfBaseRingEquiv [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 + Gal(E/B) ≃* Gal(E/K) where toFun σ := { σ.toRingEquiv with commutes' := by @@ -84,7 +89,7 @@ private theorem upperRamificationGroup_map_baseChange (huniqK : RamificationTheory.DiscreteValuationField.DVF.HasUniqueValuationExtension (base := baseK) (target := target)) - (q : Gal(E / B) ≃* Gal(E/K)) + (q : Gal(E/B) ≃* Gal(E/K)) (hq : ∀ σ x, q σ x = σ x) (t : ℝ) : Subgroup.map q.toMonoidHom @@ -93,7 +98,7 @@ private theorem upperRamificationGroup_map_baseChange upperRamificationGroupOfUniqueExtension (base := baseK) (target := target) huniqK t := by have hdisplacement - (σ : Gal(E / B)) (a : target.valuationSubring) : + (σ : Gal(E/B)) (a : target.valuationSubring) : valuationSubringAutOfUniqueExtension (base := baseK) (target := target) huniqK (q σ) a - a = @@ -103,7 +108,7 @@ private theorem upperRamificationGroup_map_baseChange apply Subtype.ext change q σ (a : E) - (a : E) = σ (a : E) - (a : E) rw [hq σ (a : E)] - have hmem (s : ℝ) (σ : Gal(E / B)) : + have hmem (s : ℝ) (σ : Gal(E/B)) : σ ∈ lowerRamificationGroup (base := baseB) (target := target) huniqB s ↔ q σ ∈ lowerRamificationGroup @@ -148,7 +153,7 @@ private theorem upperRamificationGroup_map_baseChange herbrandFunctionOfUniqueExtension (base := baseK) (target := target) huniqK s := by exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq + herbrandFunction_eq_of_card_lower_eq _ _ hcard s have hinverse (u : ℝ) : inverseHerbrandFunctionOfUniqueExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index b43d5f43da..dfeb6b560b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -19,6 +19,15 @@ complete-DVF structure of a nonarchimedean local field, together with its right-limit subgroup and the intrinsic predicate for an upper jump. -/ +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 @@ -90,7 +99,7 @@ noncomputable def localLowerRamificationGroup [FiniteDimensional K L] [IsGalois K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (t : ℝ) : Subgroup Gal(L / K) := + (t : ℝ) : Subgroup Gal(L/K) := Higher.lowerRamificationGroup (base := (localCompleteDVF K).toDVF) (target := (chosenLocalExtensionCompleteDVF K L).toDVF) @@ -103,7 +112,7 @@ noncomputable def localUpperRamificationGroup [FiniteDimensional K L] [IsGalois K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (t : ℝ) : Subgroup Gal(L / K) := + (t : ℝ) : Subgroup Gal(L/K) := Higher.upperRamificationGroupOfUniqueExtension (base := (localCompleteDVF K).toDVF) (target := (chosenLocalExtensionCompleteDVF K L).toDVF) @@ -243,7 +252,7 @@ theorem localUpperRamificationGroup_map_autCongr (base := base.toDVF) (target := targetM.toDVF) huniqM s := by exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq + herbrandFunction_eq_of_card_lower_eq _ _ hcard s have hinverse (u : ℝ) : inverseHerbrandFunctionOfUniqueExtension @@ -405,11 +414,11 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr rw [← hmapIdeal s] exact Ideal.apply_mem_of_equiv_iff.symm let φ : - Gal(IntermediateField.fixedField H / K) ≃* - Gal(M / K) := + Gal(IntermediateField.fixedField H/K) ≃* + Gal(M/K) := AlgEquiv.autCongr e have hdisplacement - (σ : Gal(IntermediateField.fixedField H / K)) + (σ : Gal(IntermediateField.fixedField H/K)) (a : B) : r (fixedFieldValuationSubringAutDVF (base := base.toDVF) (target := targetL.toDVF) @@ -425,7 +434,7 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr e (a : IntermediateField.fixedField H) simp [AlgEquiv.autCongr_apply] have hmem (s : ℝ) - (σ : Gal(IntermediateField.fixedField H / K)) : + (σ : Gal(IntermediateField.fixedField H/K)) : σ ∈ fixedFieldLowerRamificationGroup (base := base.toDVF) (target := targetL.toDVF) huniqL H s ↔ @@ -486,7 +495,7 @@ private theorem fixedFieldUpperRamificationGroup_map_autCongr (base := base.toDVF) (target := targetM.toDVF) huniqM s := by exact - RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_eq_of_card_lower_eq + herbrandFunction_eq_of_card_lower_eq _ _ hcard s have hinverse (u : ℝ) : fixedFieldInverseHerbrandFunction @@ -580,7 +589,7 @@ theorem localUpperRamificationGroup_map_restrict apply Subtype.ext rfl } let : IsGalois K EF := IsGalois.of_algEquiv eEF.symm - let H : Subgroup Gal(F / K) := EF.fixingSubgroup + let H : Subgroup Gal(F/K) := EF.fixingSubgroup let : H.Normal := by dsimp only [H] infer_instance @@ -588,7 +597,7 @@ theorem localUpperRamificationGroup_map_restrict (IntermediateField.equivOfEq (IsGalois.fixedField_fixingSubgroup EF)).trans eEF let qEquiv : - (Gal(F / K) ⧸ H) ≃* Gal(E / K) := + (Gal(F/K) ⧸ H) ≃* Gal(E/K) := (IsGalois.normalAutEquivQuotient H).trans (AlgEquiv.autCongr eFixed) let base := (localCompleteDVF K).toDVF @@ -621,8 +630,13 @@ theorem localUpperRamificationGroup_map_restrict E.val (intermediateFieldRestrictNormalHom E F hEF σ x) = E.val ((qEquiv.toMonoidHom.comp (QuotientGroup.mk' H)) σ x) rw [intermediateFieldRestrictNormalHom_apply_val] - simp [qEquiv, eFixed, eEF, EF, H, AlgEquiv.autCongr_apply, - IsGalois.normalAutEquivQuotient_apply] + 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 σ @@ -685,7 +699,7 @@ def localUpperRamificationGroupAfter [FiniteDimensional K L] [IsGalois K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] - (t : ℝ) : Subgroup Gal(L / 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. -/ @@ -798,7 +812,7 @@ private theorem localInverseHerbrandFunction_eq_self_of_nonpos huniq).injective rw [herbrandFunctionOfUniqueExtension_psi] exact - (RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_of_nonpos + (herbrandFunction_of_nonpos (lowerRamificationFiltrationOfUniqueExtension (base := (localCompleteDVF K).toDVF) (target := (chosenLocalExtensionCompleteDVF K L).toDVF) @@ -912,7 +926,7 @@ theorem not_isLocalUpperRamificationJump_of_lt_neg_one rw [htgroup] apply le_antisymm · calc - (⊤ : Subgroup Gal(L / K)) = + (⊤ : Subgroup Gal(L/K)) = localUpperRamificationGroup K L (s : ℝ) := hsgroup.symm _ ≤ localUpperRamificationGroupAfter K L t := le_iSup (fun u : {u : ℝ // t < u} => diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean index 392fd6d2d4..19b0c94edd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -14,6 +14,11 @@ valuation is represented by its valuation subring, so uniqueness is literal equality of valuation subrings (equivalently, equivalence of valuations). -/ +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosureValuationSubringOfMemOrInv_hasExtension → + integralClosureValuationSubringOfMemOrInv_hasExtension + + noncomputable section namespace AlgebraicNumberTheory @@ -70,7 +75,7 @@ theorem normFormula_algebraic_extension ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv (L := L) V.valuation hval have hBext : V.valuation.HasExtension B.valuation := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_hasExtension + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) V.valuation hval have hBclosure : B.toSubring = (integralClosure V L).toSubring := by change diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean index 00ed238977..5236d312cf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -1405,7 +1405,6 @@ theorem ramificationInvariants_fundamental_inequality 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) := @@ -1440,7 +1439,6 @@ theorem ramificationInvariants_fundamental_inequality 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 ↦ @@ -1467,7 +1465,6 @@ theorem ramificationInvariants_fundamental_inequality 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean index abd7be8d96..7b0fca2873 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -41,6 +41,11 @@ local extension `L_w / K_v` is finite separable. The fundamental inequality the the result. -/ +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 @@ -245,7 +250,7 @@ theorem completionResidueMap_surjective let xV : V := ⟨x, (mem_absoluteValueExponentialSubring_iff a ha x).2 hx_le⟩ refine ⟨IsLocalRing.residue V xV, ?_⟩ rw [IsLocalRing.ResidueField.map_residue] - rw [ValuationTheory.DiscreteValuationField.ResidueField.residue_eq_residue_iff_sub_mem_maximalIdeal] + rw [residue_eq_residue_iff_sub_mem_maximalIdeal] rw [mem_absoluteValueExponentialSubring_maximalIdeal_iff aC haC] exact hclose diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean index 8daa483bb3..a8d178ad08 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean @@ -154,7 +154,7 @@ 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean index c3098c1631..6cc296f328 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean @@ -30,7 +30,6 @@ 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)] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index 92dc72661e..8d20a048b2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -9,6 +9,39 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationFi /-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension` Lean module. -/ +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 @@ -33,11 +66,11 @@ def integralClosureValuationSubringIntegerMapOfMemOrInv z ∈ (integralClosure base.valuationSubring L).toSubring ∨ z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : base.valuationSubring →+* - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval where toFun a := ⟨algebraMap K L (a : K), - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_pullback + (integralClosureValuationSubringOfMemOrInv_pullback (L := L) base.toDVF.valuation hval (a : K)).2 a.2⟩ map_zero' := by ext; simp map_one' := by ext; simp @@ -55,7 +88,7 @@ omit [FiniteDimensional K L] in (a : base.valuationSubring) : ((integralClosureValuationSubringIntegerMapOfMemOrInv (K := K) (L := L) base hval a : - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) : L) = algebraMap K L (a : K) := rfl @@ -78,7 +111,7 @@ theorem integralClosureValuationSubringIntegerMapOfMemOrInv_injective simpa using congrArg (fun x : - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval => (x : L)) hab omit [FiniteDimensional K L] in @@ -93,7 +126,7 @@ theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdea z ∈ (integralClosure base.valuationSubring L).toSubring ∨ z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) : let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let hvL_le : B ≤ vL.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -103,7 +136,7 @@ theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdea (K := K) (L := L) base hval) = base.maximalIdeal := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let hvL_le : B ≤ vL.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -139,7 +172,7 @@ theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap z⁻¹ ∈ (integralClosure base.valuationSubring L).toSubring) (P : Ideal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval)) (hP : P.IsPrime) (hcomap : @@ -149,16 +182,16 @@ theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap base.maximalIdeal) : P = IsLocalRing.maximalIdeal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_hasExtension + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) base.toDVF.valuation hval let : IsFractionRing base.valuationSubring K := base.toDVF.valuationSubring_isFractionRing @@ -171,7 +204,7 @@ theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap intro a rfl) let : IsIntegralClosure B base.valuationSubring L := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_isIntegralClosure + integralClosureValuationSubringOfMemOrInv_isIntegralClosure (L := L) base.toDVF.valuation hval let : IsDedekindDomain B := IsIntegralClosure.isDedekindDomain base.valuationSubring K L B @@ -200,42 +233,41 @@ omit [FiniteDimensional K L] 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 - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) target.toDVF.valuation.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.toDVF.valuation target.toDVF.valuation hval) = IsLocalRing.maximalIdeal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (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 - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) v'.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.toDVF.valuation v' hval) = IsLocalRing.maximalIdeal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval)) : HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval have htarget_le : B ≤ target.toDVF.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.toDVF.valuation target.toDVF.valuation hval have htarget_eq : target.toDVF.valuation.valuationSubring = B := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + 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 @@ -244,7 +276,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.toDVF.valuation v' hval have hv_eq : v'.valuationSubring = B := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + 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 := @@ -254,14 +286,13 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent omit [FiniteDimensional K L] 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -270,7 +301,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim P = IsLocalRing.maximalIdeal B) : HenselianDVF.HasUniqueValuationExtension.{u, v, w, x, y} base target := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -305,7 +336,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim /-- 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, @@ -317,7 +347,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv hval (by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -332,7 +362,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv /-- 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 := @@ -342,7 +371,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_isLocalRing /-- 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)))] : @@ -357,7 +385,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsin /-- 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), @@ -377,7 +404,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_idempo /-- 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 @@ -406,7 +432,6 @@ 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 @@ -429,7 +454,6 @@ omit [base.toDVF.valuation.HasExtension target.toDVF.valuation] in 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) @@ -440,7 +464,7 @@ theorem integralClosure_base_maximal_map_henselianRing_of_isAdicComplete let : Module.Finite base.valuationSubring (integralClosureIntegers base target) := (moduleFinite_integralClosureIntegers base target) exact - ValuationTheory.DiscreteValuationField.henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete (R := base.valuationSubring) (S := (integralClosureIntegers base target)) (I := base.maximalIdeal) @@ -453,7 +477,6 @@ 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) @@ -473,7 +496,7 @@ theorem integralClosure_base_maximal_map_henselianRing_of_base_isPrecomplete toIsPrecomplete := inferInstance } let : IsAdicComplete base.maximalIdeal base.valuationSubring := hCompleteR exact - ValuationTheory.DiscreteValuationField.henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete + henselianRing_map_algebraMap_of_moduleFinite_of_isAdicComplete (R := base.valuationSubring) (S := (integralClosureIntegers base target)) (I := base.maximalIdeal) @@ -487,7 +510,6 @@ 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] @@ -508,7 +530,6 @@ theorem integralClosure_base_maximal_map_henselianRing_of_finiteTransfer /-- 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 @@ -528,7 +549,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_base_maximal_map_henselia 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 @@ -546,7 +566,6 @@ 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 @@ -567,7 +586,6 @@ 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] @@ -601,7 +619,6 @@ base valuation ring, any two such valuation subrings coincide. This is the 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], @@ -622,17 +639,17 @@ theorem valuationSubring_eq_of_finite_separable_of_forall_isIntegral constructor · intro hz have hz_int : z ∈ integralClosure base.valuation.valuationSubring L := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := L) base.valuation B.valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + 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 := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_mem_integralClosure_of_isIntegral + valuationSubring_mem_integralClosure_of_isIntegral (L := L) base.valuation C.valuation ⟨z, hz⟩ exact - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + integralClosure_mem_valuationSubring_of_hasExtension (L := L) base.valuation B.valuation ⟨z, hz_int⟩ simpa [ValuationSubring.valuationSubring_valuation] using hsub @@ -687,13 +704,13 @@ theorem valuationSubring_eq_integralClosureValuationSubring_of_finite_separable (B : ValuationSubring L) [_root_.Valuation.HasExtension base.valuation B.valuation] : B = - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval := by let C := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let : _root_.Valuation.HasExtension base.valuation C.valuation := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_hasExtension + integralClosureValuationSubringOfMemOrInv_hasExtension (L := L) base.valuation hval exact valuationSubring_eq_of_finite_separable_of_forall_isIntegral diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index f6be3831ad..4f9f5d901b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -8,6 +8,47 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationFi /-! Provides the public declarations in the `ValuationTheory.DiscreteValuationField.FiniteExtension.Uniqueness` Lean module. -/ +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 @@ -44,7 +85,6 @@ 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'], @@ -59,7 +99,6 @@ 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'] @@ -76,7 +115,7 @@ theorem hasUniqueValuationExtension_of_forall_moduleFinite change Module.Finite base.valuationSubring target.valuationSubring infer_instance exact - ValuationTheory.DiscreteValuationField.Valuation.valuation_isEquiv_of_hasExtension_of_moduleFinite + valuation_isEquiv_of_hasExtension_of_moduleFinite (L := L) base.valuation target.valuation v' /-- Integral-closure criterion for uniqueness of valuation extensions. In a @@ -90,7 +129,6 @@ 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 : @@ -107,17 +145,17 @@ theorem hasUniqueValuationExtension_of_forall_isIntegralClosure infer_instance let : Module.Finite base.valuation.valuationSubring target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + 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 := - ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + moduleFinite_valuationSubring_of_isIntegralClosure (L := L) base.valuation v' exact - ValuationTheory.DiscreteValuationField.Valuation.valuation_isEquiv_of_hasExtension_of_moduleFinite + valuation_isEquiv_of_hasExtension_of_moduleFinite (L := L) base.valuation target.valuation v' /-- If the chosen target valuation ring and every comparison valuation ring @@ -129,7 +167,6 @@ 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 : @@ -146,24 +183,24 @@ theorem hasUniqueValuationExtension_of_forall_isIntegral base_valuationSubring_isNoetherianRing (K := K) base let : IsIntegralClosure target.valuation.valuationSubring base.valuation.valuationSubring L := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + valuationSubring_isIntegralClosure_of_isIntegral (L := L) base.valuation target.valuation let : Module.Finite base.valuation.valuationSubring target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + 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 := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_isIntegralClosure_of_isIntegral + valuationSubring_isIntegralClosure_of_isIntegral (L := L) base.valuation v' let : Module.Finite base.valuation.valuationSubring v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.moduleFinite_valuationSubring_of_isIntegralClosure + moduleFinite_valuationSubring_of_isIntegralClosure (L := L) base.valuation v' exact - ValuationTheory.DiscreteValuationField.Valuation.valuation_isEquiv_of_hasExtension_of_moduleFinite + valuation_isEquiv_of_hasExtension_of_moduleFinite (L := L) base.valuation target.valuation v' omit [FiniteDimensional K L] in @@ -179,14 +216,13 @@ 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 - ((ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + ((integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval).inclusion target.valuation.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -195,14 +231,14 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], IsLocalHom - ((ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + ((integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval).inclusion v'.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation v' hval))) : HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval have htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -211,7 +247,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca let : IsLocalHom (B.inclusion target.valuation.valuationSubring htarget_le) := htargetLocal exact - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_inclusion_isLocalHom + valuationSubring_eq_of_le_of_inclusion_isLocalHom B target.valuation.valuationSubring htarget_le intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt @@ -222,7 +258,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca let : IsLocalHom (B.inclusion v'.valuationSubring hv_le) := @hlocal Gamma' inferInstance v' hExt exact - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_inclusion_isLocalHom + 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 @@ -240,42 +276,41 @@ 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 - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval) target.valuation.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation target.valuation hval) = IsLocalRing.maximalIdeal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval)) (hcenter : ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], ValuationSubring.idealOfLE - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval) v'.valuationSubring (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation v' hval) = IsLocalRing.maximalIdeal - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval)) : HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval have htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation target.valuation hval have htarget_eq : target.valuation.valuationSubring = B := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + 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 @@ -284,7 +319,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation v' hval have hv_eq : v'.valuationSubring = B := - ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal + 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 := @@ -301,14 +336,13 @@ 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -317,7 +351,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim P = IsLocalRing.maximalIdeal B) : HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target) := by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -357,7 +391,6 @@ 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, @@ -369,7 +402,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv hval (by let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -389,7 +422,6 @@ 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] : @@ -406,7 +438,6 @@ 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] : @@ -428,7 +459,6 @@ 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) := @@ -442,7 +472,6 @@ 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) := @@ -457,7 +486,6 @@ 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 : @@ -479,7 +507,6 @@ 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)))] : @@ -500,7 +527,6 @@ 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), @@ -525,7 +551,6 @@ 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 @@ -558,7 +583,6 @@ 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 @@ -584,7 +608,6 @@ 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 @@ -608,7 +631,6 @@ 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) @@ -624,7 +646,6 @@ theorem hasUniqueValuationExtension_of_finite_separable /-- 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 := @@ -637,7 +658,6 @@ theorem henselian_hasUniqueValuationExtension_of_finite_separable 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 ∨ @@ -662,14 +682,13 @@ 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -679,7 +698,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -691,7 +710,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte base target) hval ?_ ?_ · let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -701,7 +720,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte · intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -715,14 +734,13 @@ omit [FiniteDimensional K L] in 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -732,7 +750,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -744,7 +762,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini target) hval ?_ ?_ · let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -756,7 +774,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini · intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -778,14 +796,13 @@ 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -798,7 +815,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -813,25 +830,25 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (K := K) (L := L) (base := base) (target := target) hval ?_ ?_ : HasUniqueValuationExtension.{u, v, w, x, y} (base := base) (target := target)) · let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation target.valuation hval exact - ValuationTheory.DiscreteValuationField.Valuation.idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension (L := L) base.valuation v' hval exact - ValuationTheory.DiscreteValuationField.Valuation.idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff + idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff B v'.valuationSubring hv_le (by simpa [B, hv_le] using (@hcenterMem Gamma' inferInstance v' hExt)) @@ -844,14 +861,13 @@ 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -864,7 +880,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] (v' : _root_.Valuation L Gamma') [base.valuation.HasExtension v'], let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -878,7 +894,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_center_mem_iff base target) hval ?_ ?_ · let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -897,7 +913,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent · intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt let B := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension @@ -918,7 +934,6 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent 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'] : @@ -965,7 +980,6 @@ theorem hasUniqueValuationExtension_iff_forall_mem_valuationSubring /-- 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'] : @@ -977,7 +991,6 @@ theorem valuation_isEquiv_of_finite_separable /-- 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'] : @@ -990,7 +1003,6 @@ theorem valuationSubring_eq_of_finite_separable /-- 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'] : @@ -1000,7 +1012,6 @@ theorem valuationSubring_eq_target_of_finite_separable /-- 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'] @@ -1011,7 +1022,6 @@ theorem mem_valuationSubring_iff_of_finite_separable /-- 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'] @@ -1051,7 +1061,7 @@ theorem exists_chevalley_valuationSubring_eq_target_of_hasUniqueValuationExtensi base.valuation.HasExtension B.valuation ∧ target.valuation.valuationSubring = B := by obtain ⟨B, hB, hlocal, hpullback, hExt⟩ := - ValuationTheory.DiscreteValuationField.Valuation.exists_extension_valuationSubring_with_hasExtension + exists_extension_valuationSubring_with_hasExtension (L := L) base.valuation let : base.valuation.HasExtension B.valuation := hExt refine ⟨B, hB, hlocal, hpullback, hExt, ?_⟩ @@ -1067,7 +1077,6 @@ 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, @@ -1119,7 +1128,6 @@ theorem exists_chevalley_extension_valuation_eq_target_of_hasUniqueValuationExte /-- 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 @@ -1132,21 +1140,20 @@ theorem target_valuationSubring_eq_of_finite_separable /-- 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv + integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let : base.valuation.HasExtension B.valuation := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_hasExtension + 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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_isIntegralClosure + integralClosureValuationSubringOfMemOrInv_isIntegralClosure (L := L) base.valuation hval change IsIntegralClosure target.valuation.valuationSubring base.valuationSubring L rw [htarget_eq] @@ -1155,7 +1162,6 @@ theorem target_valuationSubring_isIntegralClosure_of_finite_separable /-- 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 @@ -1167,7 +1173,6 @@ theorem moduleFinite_target_valuationSubring_of_finite_separable /-- 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 = @@ -1180,7 +1185,6 @@ theorem target_primesOver_base_maximal_eq_singleton_of_finite_separable /-- 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 @@ -1191,7 +1195,6 @@ theorem ncard_target_primesOver_base_maximal_eq_one_of_finite_separable 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 @@ -1207,7 +1210,6 @@ theorem moduleIsTorsionFree_target_valuationSubring_of_finite_separable /-- 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 * @@ -1220,7 +1222,6 @@ theorem ideal_ramificationIdx_mul_inertiaDeg_eq_finrank_of_finite_separable /-- 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 @@ -1231,7 +1232,6 @@ theorem ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable /-- 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 @@ -1243,7 +1243,6 @@ theorem isDefectless_of_finite_separable /-- 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, @@ -1264,7 +1263,6 @@ theorem exists_chevalley_valuationSubring_eq_target_of_finite_separable 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, @@ -1300,7 +1298,6 @@ theorem exists_chevalley_extension_valuation_eq_target_of_finite_separable 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] : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean index f0e2419e60..e0811543c6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean @@ -57,7 +57,7 @@ theorem idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent ⟨Ideal.Quotient.mk I ((Polynomial.X ^ 2 - Polynomial.X : Polynomial R).derivative.eval a0), ?_, ?_⟩ - · simp [pow_two] + · simp only [pow_two, Polynomial.derivative_sub, 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) = @@ -67,7 +67,7 @@ theorem idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent _ = 1 := by rw [ha0.eq] ring - · simp [pow_two] + · simp only [pow_two, Polynomial.derivative_sub, 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) = @@ -223,7 +223,7 @@ theorem exists_polynomial_lift_residue (F : HenselianDVF.{u, v} K) refine ⟨f, ?_⟩ ext n by_cases hn : n ∈ fbar.support - · simp [f, Polynomial.coeff_map] + · simp only [Polynomial.coeff_map, Polynomial.finsetSum_coeff, map_sum, f] rw [Finset.sum_eq_single n] · simp [hc] · intro b hb hbn @@ -232,7 +232,7 @@ theorem exists_polynomial_lift_residue (F : HenselianDVF.{u, v} K) exact False.elim (hnot hn) · have hcoeff : fbar.coeff n = 0 := by simpa [Polynomial.mem_support_iff] using hn - simp [f, Polynomial.coeff_map, hcoeff] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean index 1a94606125..ba983b38c2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean @@ -240,7 +240,13 @@ theorem isAdicComplete_of_moduleFinite_sameUniverse ((AdicCompletion.ofTensorProductEquivOfFiniteNoetherian I M).restrictScalars R)) have heq : (e : M →ₗ[R] AdicCompletion I M) = AdicCompletion.of I M := by ext x n - simp [e] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean index c354fe67f9..dfc07d4019 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -627,7 +627,6 @@ 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 ∨ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean index 150838dfa5..fc55dd7a86 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean @@ -15,6 +15,11 @@ field in fact splits over every extension valuation ring: its roots are integral over the base and hence belong to that ring. -/ +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + integralClosure_mem_valuationSubring_of_hasExtension → + integralClosure_mem_valuationSubring_of_hasExtension + + noncomputable section open Polynomial @@ -69,7 +74,7 @@ theorem monic_splits_in_extension_valuationSubring rw [ValuationSubring.valuationSubring_valuation] exact hαint have hz : α ∈ W.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosure_mem_valuationSubring_of_hasExtension + integralClosure_mem_valuationSubring_of_hasExtension (L := L) V.valuation W.valuation ⟨α, hαint'⟩ simpa [ValuationSubring.valuationSubring_valuation] using hz exact ⟨⟨α, hαmem⟩, rfl⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean index aff38d345d..cfff73d8e3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -12,6 +12,11 @@ Artin's monic coprime-factor lifting criterion implies the exact primitive factorization form of Hensel's lemma from the primitive factorization definition. -/ +open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming + exists_extension_valuationSubring_with_hasExtension → + exists_extension_valuationSubring_with_hasExtension + + noncomputable section open Polynomial @@ -165,7 +170,7 @@ theorem primitiveIrreducibleReductionProperty_of_monicResidualCoprimeFactorLifti exact ⟨Or.inr hbranch.1, hbranch.2⟩ · let L : Type u := (Q.map V.subtype).SplittingField obtain ⟨B, _hB, _hlocal, _hpullback, hExt⟩ := - ValuationTheory.DiscreteValuationField.Valuation.exists_extension_valuationSubring_with_hasExtension + exists_extension_valuationSubring_with_hasExtension (L := L) V.valuation let : V.valuation.HasExtension B.valuation := hExt let : Normal K L := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index 49f3ed1b15..e5049ba7f5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -69,7 +69,8 @@ theorem adicCompletion_units_coordinates_surjective · simp · intro n ext - simp [unitReduction] + 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 @@ -1018,7 +1019,7 @@ theorem dvrUnitsEquivHigherUnitQuotientInverseLimit_apply ((higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ) (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = unitReduction (uniformizerPowerIdeal π (n + 1)) u - simp [dvrUnitsEquivHigherUnitQuotientInverseLimit, + simp? [dvrUnitsEquivHigherUnitQuotientInverseLimit, adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit, unitReduction] ext @@ -1552,7 +1553,6 @@ theorem completeValuedField_uniformizer_irreducible [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 @@ -1573,7 +1573,6 @@ theorem completeValuedField_uniformizerPowerIdeal_one_eq_maximalIdeal [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 = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean index 1219c45322..d6245f6570 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean @@ -9,6 +9,15 @@ import Mathlib.RingTheory.Valuation.RamificationGroup import Mathlib.FieldTheory.Normal.Basic /-! # Unique Ring -/ + +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 /-! @@ -49,11 +58,11 @@ theorem algEquiv_smul_valuationSubring_hasExtension _ ↔ x ∈ V := by simpa only [ValuationSubring.mem_toSubring, ValuationSubring.valuationSubring_valuation] using - (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_pullback_of_hasExtension_valuation + (valuationSubring_pullback_of_hasExtension_valuation V.valuation W x) _ ↔ x ∈ V.toSubring := (V.mem_toSubring x).symm apply - ValuationTheory.DiscreteValuationField.Valuation.hasExtension_valuation_of_valuationSubring_pullback + hasExtension_valuation_of_valuationSubring_pullback intro x simpa only [ValuationSubring.mem_toSubring, ValuationSubring.valuationSubring_valuation] using hpullback x @@ -171,7 +180,7 @@ def valuationSubringMapOfHasExtension exact (algebraMap K L).restrict V.toSubring W.toSubring (by intro x hx exact - (ValuationTheory.DiscreteValuationField.Valuation.valuationSubring_pullback_of_hasExtension_valuation + (valuationSubring_pullback_of_hasExtension_valuation V.valuation W x).2 (by simpa only [ValuationSubring.valuationSubring_valuation, ValuationSubring.mem_toSubring] using hx)) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean index 47ab1abaa1..7b5cb291ba 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean @@ -9,6 +9,11 @@ import Mathlib.RingTheory.AdicCompletion.Topology import Mathlib.Topology.Algebra.Valued.ValuedField /-! # Valued Adic Complete -/ + +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 @@ -85,7 +90,7 @@ theorem rankOneDiscreteValuationSubring_isAdic convert h_preimage_open using 1 ext x exact - (ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow (val := val) (pi := pi) hpi n) · intro s hs rcases @@ -109,7 +114,7 @@ theorem rankOneDiscreteValuationSubring_isAdic change val.restrict (x : K) < gamma.1 rw [Valuation.restrict_lt_iff_lt_embedding] have hx_le := - (ValuationTheory.DiscreteValuationField.Valuation.mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow + (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 From 1e23d1b77317695a230b694831df90a0f5b13814 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 02:26:53 +0000 Subject: [PATCH 14/33] Extract class field norm calculations and Frobenius fixed-field transport --- LeanPool.lean | 2 + LeanPool/ClassFieldTheory.lean | 2 + .../FrobeniusActionRemainder.lean | 6 +- .../Construction/MainNaturality.lean | 3 +- .../Construction/MainTransfer.lean | 28 +- .../NumberField/FiniteUnramifiedTower.lean | 1 + .../NumberField/TameDifferentTrace.lean | 2 +- .../RayClass/IdealNorm.lean | 1 + .../ClassFieldAxiom/HasseNormPrinciple.lean | 42 +- .../PrimePowerKummerIndex.lean | 47 +- .../ClassFieldAxiom/SUnitLocalPowerMap.lean | 406 ++-- .../SUnitKummerNormCore.lean | 54 +- .../InfinitePlaceOverfield.lean | 10 + .../Finite/CyclotomicNorm/Unramified.lean | 84 +- .../Existence/UnramifiedNormContainment.lean | 2 +- .../EmbeddedFrobeniusTransport.lean | 1726 +---------------- .../EmbeddedFrobeniusTransport/Fields.lean | 374 ++++ .../EmbeddedFrobeniusTransport/Groups.lean | 1326 +++++++++++++ .../FiniteLevel/PrimitiveUniformizer.lean | 42 +- .../GroupTheory/Transfer/Witt.lean | 2 + .../Abstract/KummerAbelianCyclicFactors.lean | 2 +- .../Analytic/LogExpSeries/SeriesTerms.lean | 5 +- .../UniformizerGradedHom.lean | 3 +- .../Topology/AdicCompletionInverseLimit.lean | 6 +- 24 files changed, 2043 insertions(+), 2133 deletions(-) create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean diff --git a/LeanPool.lean b/LeanPool.lean index 947a86562e..290b812769 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -1394,6 +1394,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean index 9665dbeaca..f85fa6ee77 100644 --- a/LeanPool/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory.lean @@ -796,6 +796,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean index 2f5ac78584..6598cf2c06 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean @@ -332,9 +332,9 @@ theorem frobeniusActionRemainder_mul (D : DegreeData G) (D.frobeniusActionConjugate K L hLK φ σ₂ (D.frobeniusExponent K L hLK σ₁)) * D.frobeniusActionRemainder K L hLK φ σ₁ := by - simp? [frobeniusActionRemainder, frobeniusExponent_mul, - frobeniusActionConjugate_coe, frobeniusExponent_actionConjugate, - frobeniusMul_coe, pow_add, mul_assoc] + 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 σ₂ * diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index 50b9fc68d5..65f7cc9d8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -311,7 +311,8 @@ theorem finiteReciprocityNaturalityFrobeniusFixedField_le 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? [DegreeData.frobeniusClosure] + simp only [frobeniusClosure, finiteReciprocityNaturalityFrobeniusTowerLift_coe, + Set.range_const] change f (QuotientGroup.mk k') ∈ (closedSubgroupGenerated ({f σ.1} : Set _) : Subgroup _) exact hmap diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index fb5f310016..b729fb5a32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -965,12 +965,15 @@ private theorem abelianizedReciprocity_frobenius_eq_primeNormClass (Additive.ofMul (D.frobeniusRestriction (K.toFiniteResidueAbstractField D) L hLK σ)) σ rfl π hπ) -/-- An identity between the underlying values gives the corresponding subgroup sum identity. -/ -private theorem addSubgroup_eq_sum_of_coe_eq - {B : Type*} [AddCommGroup B] {H : AddSubgroup B} {ι : Type*} [Fintype ι] - (x : H) (f : ι → H) (h : (x : B) = ∑ i, (f i : B)) : x = ∑ i, f i := by - apply Subtype.ext - exact h.trans (map_sum H.subtype f Finset.univ).symm +/-- 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 @@ -1179,16 +1182,9 @@ theorem transferNormNaturality_generator_square (transferNormNaturality_normQuotientInclusion_finiteNormClass A F.base.field F.field.field L hL F.below (relativeNorm A F.base.field S hSKF π)) - have hNormSub : - fixedFieldInclusion A E.base.field E.field.field E.below - (relativeNorm A E.base.field S hSK π) = - ∑ q : Ω, - relativeNorm A E.field.field (Sβ q) (hSβK' q) (πβ q) := - addSubgroup_eq_sum_of_coe_eq _ _ hNorm - - have hNormClasses := congrArg - (finiteNormClassHom A F.field.field L hL) hNormSub - rw [map_sum] at hNormClasses + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean index 0a683fdb79..04a489f2c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean @@ -104,6 +104,7 @@ theorem trans (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean index 3566c3b522..b748886289 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean @@ -77,7 +77,7 @@ theorem not_dvd_differentIdeal_of_coprime_norm_exponent 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? at h + 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean index 2301d85c9f..79ec303f00 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -422,6 +422,7 @@ private theorem fractionalIdealNormPrimeBelow_eq_finitePlaceBelow ext rfl +omit [FiniteDimensional K L] in open scoped Classical in private theorem idealNormExponentMap_eq_public : idealNormExponentMap (K := K) (L := L) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index 5c7405aa67..c02dfae4d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -608,44 +608,10 @@ private theorem principalIdeleHerbrandH0Map_mk (Rep.ofMulDistribMulAction (L ≃ₐ[K] L) (RelativeIdeleGroup K L))).homologyπ 0 (tateH0FixedCycle aI) - have hP : - (tateH0IsoHerbrandH0 - (G := L ≃ₐ[K] L) - (A := RelativeIdeleGroup.principalSubgroup K L)).hom cP = - (Additive.ofMul (HerbrandH0.mk a) : - Additive - (HerbrandH0 (L ≃ₐ[K] L) - (RelativeIdeleGroup.principalSubgroup K L))) := by - dsimp only [cP] - exact tateH0IsoHerbrandH0_fixedCycle a - have hI : - (tateH0IsoHerbrandH0 - (G := L ≃ₐ[K] L) - (A := RelativeIdeleGroup K L)).hom cI = - (Additive.ofMul (HerbrandH0.mk aI) : - Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by - dsimp only [cI] - exact tateH0IsoHerbrandH0_fixedCycle aI - have hPe : - eP cP = - (Additive.ofMul (HerbrandH0.mk a) : - Additive - (HerbrandH0 (L ≃ₐ[K] L) - (RelativeIdeleGroup.principalSubgroup K L))) := by - change - (tateH0IsoHerbrandH0 - (G := L ≃ₐ[K] L) - (A := RelativeIdeleGroup.principalSubgroup K L)).hom cP = _ - exact hP - have hIe : - eI cI = - (Additive.ofMul (HerbrandH0.mk aI) : - Additive (HerbrandH0 (L ≃ₐ[K] L) (RelativeIdeleGroup K L))) := by - change - (tateH0IsoHerbrandH0 - (G := L ≃ₐ[K] L) - (A := RelativeIdeleGroup K L)).hom cI = _ - exact hI + 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index 5820b5fdd6..f33e07fb1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -66,6 +66,16 @@ theorem card_sUnitPrincipalQuotient_mul_card_ideleClassQuotient_eq_power_two_tot 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 @@ -133,12 +143,7 @@ theorem Module.finrank K E 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) + exact one_lt_pow₀ hp.one_lt hv.ne' have hr : r ≤ totalPlaceCard (K := K) S' := by simpa only [S'] using @@ -211,22 +216,8 @@ theorem simpa using (IsDedekindDomain.HeightOneSpectrum.valuation_lt_one_iff_dvd (K := K) w ((n : ℕ) : 𝓞 K)).2 hwDvd - have hwSupport : - w ∈ chosenUnitFiniteSupport (K := K) nUnit := by - by_contra hwNotSupport - 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 hwNotSupport - have hnValEq : - w.valuation K ((n : ℕ) : K) = 1 := by - change w.valuation K ((n : ℕ) : K) = 1 at hnUnitVal - exact hnUnitVal - exact (ne_of_lt hnValLt) hnValEq + have hwSupport := mem_chosenUnitFiniteSupport_of_valuation_ne_one + nUnit w (ne_of_lt hnValLt) exact subset_enlargeByFiniteKummerRadicalSupport (K := K) (L := E) n hmu S₀ @@ -290,16 +281,8 @@ theorem (2 * totalPlaceCard (K := K) S' - r) * (n : ℕ) ^ r := by rw [← pow_add, Nat.sub_add_cancel hr2] - have hClassCard : - Nat.card - (IdeleClassPowerLocalUnitQuotient - (K := K) n S' T) = - (n : ℕ) ^ r := by - exact - Nat.eq_of_mul_eq_mul_left - (pow_pos n.pos - (2 * totalPlaceCard (K := K) S' - r)) - (hProduct.trans hPow) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean index 35d7cb8819..dd6d5fc542 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -239,12 +239,128 @@ theorem sUnitLocalUnitPowerMap_ker rw [localUnit_toField v] exact hx v -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 +/-- 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) @@ -266,12 +382,8 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective 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 + Nat.card (sUnitLocalPowerKernel (K := K) n S' T ⧸ + sUnitLocalPowerKernelNthPowers (K := K) n S' T) = (n : ℕ) ^ r := by classical dsimp only let S' := @@ -281,21 +393,6 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective 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 := @@ -310,15 +407,6 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective let D := KummerTheory.chosenFiniteKummerRadicalDatum (K := K) (L := E) n - 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 hDeltaEq : Delta = H.subgroupOf SU := by change @@ -387,8 +475,7 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective (H.subgroupOf SU) := QuotientGroup.equivQuotientSubgroupOfOfEq hP rfl - let eH : - H.subgroupOf SU ≃* H := + let eH := Subgroup.subgroupOfEquivOfLe hHle have hmap : ((Npow.subgroupOf SU).subgroupOf @@ -396,16 +483,9 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective Npow.subgroupOf H := by rw [Subgroup.map_equiv_eq_comap_symm] rfl - let eInside : - H.subgroupOf SU ⧸ - (Npow.subgroupOf SU).subgroupOf - (H.subgroupOf SU) ≃* - H ⧸ Npow.subgroupOf H := + let eInside := QuotientGroup.congr _ _ eH hmap - let eSecond : - H ⧸ Npow.subgroupOf H ≃* - (H ⊔ Npow : Subgroup Kˣ) ⧸ - Npow.subgroupOf (H ⊔ Npow) := + let eSecond := QuotientGroup.quotientInfEquivProdNormalQuotient H Npow let eRadicalCarrier : @@ -418,9 +498,7 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective Npow.subgroupOf D.carrier = D.ambientNthPowersSubgroup := by rfl - let eNamedRadical : - D.carrier ⧸ Npow.subgroupOf D.carrier ≃* - D.RadicalQuotient := + let eNamedRadical := (QuotientGroup.quotientMulEquivOfEq hden).trans D.radicalQuotientMulEquiv.symm let : CommGroup Gal(E/K) := by @@ -434,23 +512,15 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective (K := K) (L := E) n := KummerTheory.nthRootsOfUnityInBase_of_primitiveRoots (K := K) (L := E) n hmu - let eKummer : - D.RadicalQuotient ≃* - (Gal(E/K) →* - KummerTheory.nthRootsSubgroup E (n : ℕ)) := + let eKummer := KummerTheory.finiteKummerCharacterEquiv n hbase - let eDual : - (Gal(E/K) →* - KummerTheory.nthRootsSubgroup E (n : ℕ)) ≃* - Gal(E/K) := + let eDual := Classical.choice <| KummerTheory.finiteNthRootsCharacterDuality (G := Gal(E/K)) (K := K) (L := E) n hmu hexponentE - let eQuotient : - Delta ⧸ P.subgroupOf Delta ≃* - Gal(E/K) := + let eQuotient := eDelta.trans (ePower.trans (eInside.trans @@ -474,6 +544,82 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective _ = (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 @@ -544,139 +690,15 @@ theorem sUnitLocalUnitPowerMap_sUnitKummerPrimeSet_surjective rw [← Subgroup.index_ker (G := SUnitGroup (K := K) S') (G' := LocalPowerTarget) f, hfker] exact hDeltaIndex - have hLocalCard - (w : T) : - Nat.card - ((w.1.adicCompletionIntegers K)ˣ ⧸ - (powMonoidHom (n : ℕ) : - (w.1.adicCompletionIntegers K)ˣ →* - (w.1.adicCompletionIntegers K)ˣ).range) = - (n : ℕ) := by - let F := - LocalFieldTheory.DiscreteValuationField.LocalField.ofWithZeroValuation - (Valued.v : - Valuation (w.1.adicCompletion K) - (WithZero (Multiplicative ℤ))) - let : NeZero (n : ℕ) := ⟨n.ne_zero⟩ - have hnu : Function.Surjective - (Valued.v : - Valuation (w.1.adicCompletion K) - (WithZero (Multiplicative ℤ))) := - w.1.valuedAdicCompletion_surjective K - have hw : - w.1 ∈ - sUnitKummerPrimeSet - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S := - w.2 + 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 - have hnGlobal : - w.1.valuation K ((n : ℕ) : K) = 1 := by - 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 hnatCast : - (((n : ℕ) : K) : w.1.adicCompletion K) = - ((n : ℕ) : w.1.adicCompletion K) := by - change - algebraMap K (w.1.adicCompletion K) ((n : ℕ) : K) = - ((n : ℕ) : w.1.adicCompletion K) - rw [map_natCast] - have hnuN : - Valued.v ((n : ℕ) : w.1.adicCompletion K) = 1 := by - rw [← hnatCast, - HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] - exact hnGlobal - have hnuNF : - F.valuation ((n : ℕ) : w.1.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.1.adicCompletionIntegers K)ˣ := by - exact MulEquiv.refl ((w.1.adicCompletionIntegers K)ˣ) - have hindexPackaged : - Nat.card - (F.valuationSubringˣ ⧸ - (powMonoidHom (n : ℕ) : - F.valuationSubringˣ →* F.valuationSubringˣ).range) = - Nat.card - ((powMonoidHom (n : ℕ) : - (w.1.adicCompletion K)ˣ →* - (w.1.adicCompletion K)ˣ).ker) := by - simpa only [F] using - LocalFieldTheory.DiscreteValuationField.LocalField.mixed_unitIndex_of_coprime - (Valued.v : - Valuation (w.1.adicCompletion K) - (WithZero (Multiplicative ℤ))) - hnu (n := (n : ℕ)) - have hindex : - Nat.card - ((w.1.adicCompletionIntegers K)ˣ ⧸ - (powMonoidHom (n : ℕ) : - (w.1.adicCompletionIntegers K)ˣ →* - (w.1.adicCompletionIntegers K)ˣ).range) = - Nat.card - ((powMonoidHom (n : ℕ) : - (w.1.adicCompletion K)ˣ →* - (w.1.adicCompletion K)ˣ).ker) := by - calc - Nat.card - ((w.1.adicCompletionIntegers K)ˣ ⧸ - (powMonoidHom (n : ℕ) : - (w.1.adicCompletionIntegers K)ˣ →* - (w.1.adicCompletionIntegers K)ˣ).range) = - Nat.card - (F.valuationSubringˣ ⧸ - (powMonoidHom (n : ℕ) : - F.valuationSubringˣ →* F.valuationSubringˣ).range) := by - exact Nat.card_congr - (LocalFieldTheory.nthPowerQuotientEquivOfMulEquiv - (w.1.adicCompletionIntegers K)ˣ - F.valuationSubringˣ - (n : ℕ) - eValuationSubringUnits.symm).toEquiv - _ = Nat.card - ((powMonoidHom (n : ℕ) : - (w.1.adicCompletion K)ˣ →* - (w.1.adicCompletion K)ˣ).ker) := - hindexPackaged - have hroots : - Nat.card - ((powMonoidHom (n : ℕ) : - (w.1.adicCompletion K)ˣ →* - (w.1.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.1.adicCompletion K)).injective).card_rootsOfUnity - simpa only [hroots] using hindex + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index 33221a8c92..392f1bcdbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -170,6 +170,24 @@ theorem supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top (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 /-- On the chosen Kummer norm support, the principal part of the local power subgroup consists exactly of powers of `S`-units. -/ @@ -189,14 +207,8 @@ theorem change principalIdelePowerLocalUnitSubgroup (K := K) n S' ∅ = sUnitNthPowersInField (K := K) n S' - 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 hLarge := supportedAt_sUnitKummerNormSupport_sup_principalSubgroup_eq_top + (K := K) n S apply le_antisymm · intro b hb have hbData := @@ -373,30 +385,8 @@ theorem Units.map (algebraMap K M).toMonoidHom b := by simpa only [M, beta] using KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK b - 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 - have hbPower : - b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by - 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean index 301347cf6f..2454f0fc48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -254,6 +254,16 @@ noncomputable def 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean index c5ccceb3b5..93eb861ef8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean @@ -49,6 +49,16 @@ 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¹`. @@ -231,70 +241,18 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one have hramCanonical : Ideal.ramificationIdx' (IsLocalRing.maximalIdeal base.valuationSubring) - (IsLocalRing.maximalIdeal target.valuationSubring) = 1 := by - have h := - AlgebraicNumberTheory.Valuations.padicCyclotomic_ramificationIndex_eq_one_prime_pow_sub_one - p f hf hζ hζgen target - change Ideal.ramificationIdx' - (IsLocalRing.maximalIdeal base.valuationSubring) - (IsLocalRing.maximalIdeal target.valuationSubring) = 1 at h - exact h - have hiCanonical : Function.Injective iCanonical := by - intro x y hxy - apply Subtype.ext - exact (algebraMap ℚ_[p] L).injective (congrArg Subtype.val hxy) - have hiCanonicalAlg : - Function.Injective - (algebraMap base.valuationSubring target.valuationSubring) := by - simpa only [iCanonical] using hiCanonical + (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 : - Ideal.map (algebraMap base.valuationSubring target.valuationSubring) - (IsLocalRing.maximalIdeal base.valuationSubring) = - IsLocalRing.maximalIdeal target.valuationSubring ^ - Ideal.ramificationIdx' - (IsLocalRing.maximalIdeal base.valuationSubring) - (IsLocalRing.maximalIdeal target.valuationSubring) := by - exact map_maximalIdeal_eq_pow_ramificationIdx hiCanonicalAlg - rw [hramCanonical, pow_one] at hmap - simpa only [iCanonical] using hmap - have hmapBase : - Ideal.map eBase (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = - IsLocalRing.maximalIdeal base.valuationSubring := - ringEquiv_map_maximalIdeal eBase - have hmapTarget : - Ideal.map eTarget (IsLocalRing.maximalIdeal target.valuationSubring) = - IsLocalRing.maximalIdeal 𝒪[L] := - ringEquiv_map_maximalIdeal eTarget - have hcommute : - eTarget.toRingHom.comp (iCanonical.comp eBase.toRingHom) = iLocal := by - ext x - rfl - have hmapLocal : - Ideal.map iLocal (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = - IsLocalRing.maximalIdeal 𝒪[L] := by - calc - Ideal.map iLocal (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = - Ideal.map (eTarget.toRingHom.comp (iCanonical.comp eBase.toRingHom)) - (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) := by rw [hcommute] - _ = Ideal.map eTarget - (Ideal.map (iCanonical.comp eBase.toRingHom) - (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]])) := - (Ideal.map_map (iCanonical.comp eBase.toRingHom) eTarget.toRingHom).symm - _ = Ideal.map eTarget - (Ideal.map iCanonical - (Ideal.map eBase (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]))) := by - congr 1 - exact (Ideal.map_map eBase.toRingHom iCanonical).symm - _ = IsLocalRing.maximalIdeal 𝒪[L] := by - rw [hmapBase, hmapCanonical, hmapTarget] - have hmapLocalAlg : - Ideal.map (algebraMap 𝒪[ℚ_[p]] 𝒪[L]) - (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) = - IsLocalRing.maximalIdeal 𝒪[L] := by - simpa only [iLocal] using hmapLocal + 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]]) ≠ ⊥ := @@ -303,8 +261,8 @@ theorem normSubgroup_eq_unramifiedNormSubgroup_padic_prime_pow_sub_one (IsLocalRing.maximalIdeal 𝒪[ℚ_[p]]) (IsLocalRing.maximalIdeal 𝒪[L]) hp] apply Ideal.ramificationIdx'_spec - · rw [hmapLocalAlg, pow_one] - · rw [hmapLocalAlg] + · rw [hmapLocal, pow_one] + · rw [hmapLocal] simpa using not_le_of_gt (Ideal.pow_succ_lt_pow (IsDiscreteValuationRing.not_a_field 𝒪[L]) 1)⟩ calc diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean index a7510bda20..dee21bfb50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean @@ -63,7 +63,7 @@ private theorem valuationAt_baseField_coe v.toAddMonoidHom x := by have hdivided := v.residueDegree_nsmul_dividedAt (FiniteAbstractField.base G) x - simp? at hdivided + 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 ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index 702603d113..d77c2f4707 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -4,1730 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields + /-! # Embedded Frobenius transport -This module transports inertia, Frobenius elements, and fixed fields across an explicit - equivalence of separable closures. +This facade preserves the import path for the subgroup transports and fixed-field equivalences. -/ - -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 := 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 := - 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 : 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) - 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 - -/-- 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 - constructor - · intro hx - rw [IntermediateField.mem_fixedField_iff] - intro rho hrho - let rhoH : H₀.toSubgroup := ⟨rho, hSHH hrho⟩ - have hrhoExtension : - rhoH ∈ extensionSubgroup RH.field SH hSHH := by - exact hrho - have hrhoInternal : - rhoH ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin - RH J₀ hJH sigmaH := by - rw [← (localResidueDatum K).extensionSubgroup_frobeniusFixedField - RH J₀ hJH sigmaH] - exact hrhoExtension - let tau : - (intrinsicAbstractBase F).toSubgroup := - psi.symm rhoH - have htauInternal : - tau ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin - RF EI.field EI.below sigma := - (intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField - K F E j e sigma tau).2 (by - have hpsiApply : - intrinsicBaseEquivAmbientEmbeddedField K F i e tau = - rhoH := - psi.apply_symm_apply rhoH - rw [hpsiApply] - simpa only [ - i, jF, jI, EI, H₀, J₀, hJH, RF, hHabsolute, H, RH, - sigmaH] using hrhoInternal) - have htauExtension : - tau ∈ extensionSubgroup - RF.field SF hSFB := by - rw [(localResidueDatum F).extensionSubgroup_frobeniusFixedField - RF EI.field EI.below sigma] - exact htauInternal - have hxfix : tau.1 x = x := - (IntermediateField.mem_fixedField_iff SF.toSubgroup x).1 - hx tau.1 htauExtension - have hpsi : psi tau = rhoH := - psi.apply_symm_apply rhoH - have hrhoeq : (psi tau).1 = rho := - congrArg Subtype.val hpsi - calc - rho (e x) = (psi tau).1.1 (e x) := by - exact congrArg - (fun g : Gal(SeparableClosure K/K) => g (e x)) - hrhoeq.symm - _ = e (tau.1 x) := by - rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, - e.symm_apply_apply] - _ = e x := congrArg e hxfix - · intro hx - rw [IntermediateField.mem_fixedField_iff] - intro tau₀ htau₀ - let tau : - (intrinsicAbstractBase F).toSubgroup := - ⟨tau₀, by - rw [intrinsicAbstractBase, - closedFixingSubgroup_bot_eq_baseField] - exact Subgroup.mem_top _⟩ - have htauExtension : - tau ∈ extensionSubgroup - RF.field SF hSFB := by - exact htau₀ - have htauInternal : - tau ∈ (localResidueDatum F).frobeniusFixedSubgroupWithin - RF EI.field EI.below sigma := by - rw [← (localResidueDatum F).extensionSubgroup_frobeniusFixedField - RF EI.field EI.below sigma] - exact htauExtension - have hrhoInternal : - psi tau ∈ (localResidueDatum K).frobeniusFixedSubgroupWithin - RH J₀ hJH sigmaH := - (intrinsicFrobeniusFixedSubgroup_iff_ambientEmbeddedField - K F E j e sigma tau).1 htauInternal - have hrhoExtension : - psi tau ∈ extensionSubgroup RH.field SH hSHH := by - rw [(localResidueDatum K).extensionSubgroup_frobeniusFixedField - RH J₀ hJH sigmaH] - exact hrhoInternal - have hxfix : (psi tau).1.1 (e x) = e x := - (IntermediateField.mem_fixedField_iff SH.toSubgroup (e x)).1 - hx (psi tau).1 hrhoExtension - apply e.injective - calc - e (tau₀ x) = e (tau.1 x) := rfl - _ = (psi tau).1.1 (e x) := by - rw [intrinsicBaseEquivAmbientEmbeddedField_apply_val, - e.symm_apply_apply] - _ = e x := hxfix - 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/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean new file mode 100644 index 0000000000..d22ca5bd50 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.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 +-/ + +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups + +/-! +# Embedded Frobenius fixed fields + +The transported Frobenius subgroups determine equivalent fixed fields. +-/ + +noncomputable section + +namespace LocalClassFieldTheory + +open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory +open ClassFormation +open scoped ValuativeRel + +/-- 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..d61cd999ef --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean @@ -0,0 +1,1326 @@ +/- +Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: n-yamaguchi-0729 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence +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. +-/ + +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/LubinTate/FiniteLevel/PrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean index e2f4892a3d..4c8602fb97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean @@ -519,6 +519,21 @@ theorem standardLubinTatePrimitivePointInteger_aeval 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} @@ -643,10 +658,9 @@ private theorem rw [Polynomial.coeff_sub, standardLubinTatePrimitivePolynomial_coeff_zero] simp only [Polynomial.coeff_X_pow, ite_eq_right hdne.symm, sub_zero] - have hpiIrreducible : Irreducible π := by - exact - (IsDiscreteValuationRing.irreducible_iff_uniformizer π).2 - (base.maximalIdeal_eq_span_uniformizer hπ) + 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 @@ -722,25 +736,7 @@ private theorem (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge lambda 1).1 (by simpa only [pow_one] using hlambdaMem) - have hdcoe : (d : ℕ∞) ≠ 0 := by - exact_mod_cast hdne - have hmul_le : - (d : ℕ∞) * - IsDiscreteValuationRing.addVal target.valuationSubring lambda ≤ - (d : ℕ∞) * 1 := by - rw [hmul] - 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 hlambdaVal : - IsDiscreteValuationRing.addVal target.valuationSubring lambda = 1 := - le_antisymm hvle honele - have hed : e = d := by - rw [hlambdaVal, mul_one] at hmul - exact_mod_cast hmul.symm + obtain ⟨hlambdaVal, hed⟩ := enat_eq_one_of_mul_eq_nat hdne hele honele hmul have heramDegree : ramificationIndex F.toCompleteDVF.toDVF (standardLubinTateLevelCompleteDVF hπ n).toDVF = diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 47070f6d39..5834e3829f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -653,6 +653,7 @@ noncomputable def foxCoefficient (i j : X) : ((exists_rightFoxExpansion φ (relationWord φ hφ j)).choose i) +omit [DecidableEq X] in theorem foxExpansion_relation (j : X) : ∑ i : X, groupRingDelta (φ (FreeGroup.of i)) * @@ -668,6 +669,7 @@ theorem foxExpansion_relation (j : X) : 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 := diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean index 909e0d9c2b..0ad3ff8cd2 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -223,7 +223,7 @@ theorem extensionSubgroup_closedCyclicFactorSubgroup_eq (closedCyclicFactorSubgroup_le_base K L hLK f) = cyclicFactorSubgroup (extensionSubgroup (G := G) K L hLK) f := by ext x - simp? [extensionSubgroup, closedCyclicFactorSubgroup] + simp only [extensionSubgroup, closedCyclicFactorSubgroup] rw [Subgroup.mem_subgroupOf] constructor · rintro ⟨y, hy, hxy⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean index 7f3617ee9e..c7eced033a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -396,8 +396,7 @@ theorem logOnePlusSeriesField_eq_logOnePlusSeries_mk0 logOnePlusSeriesFieldOfWithZeroValuation v x hnK = logOnePlusSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - simp? [logOnePlusSeriesFieldOfWithZeroValuation, - logOnePlusSeriesOfWithZeroValuation] + simp only [logOnePlusSeriesFieldOfWithZeroValuation, logOnePlusSeriesOfWithZeroValuation] apply tsum_congr intro n exact signedLogSeriesTermField_eq_signedLogSeriesTerm_mk0 hx hnK n @@ -421,7 +420,7 @@ theorem expSeriesField_eq_expSeries_mk0 expSeriesFieldOfWithZeroValuation v x hnK = expSeriesOfWithZeroValuation v (Units.mk0 x hx) hnK := by let : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v - simp? [expSeriesFieldOfWithZeroValuation, expSeriesOfWithZeroValuation] + simp only [expSeriesFieldOfWithZeroValuation, expSeriesOfWithZeroValuation] apply tsum_congr intro n exact expSeriesTermField_eq_expSeriesTerm_mk0 hx hnK n diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean index d597a87dcd..3c62a9e0f6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -419,7 +419,8 @@ theorem dvfValuationSubringUnitAut_div_mem_succ (base := base) (target := target) huniq sigma (a : target.valuationSubring) - (a : target.valuationSubring)) := by - simp? [div_eq_mul_inv] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index e5049ba7f5..fa7503366b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -1019,9 +1019,9 @@ theorem dvrUnitsEquivHigherUnitQuotientInverseLimit_apply ((higherUnitQuotientInverseLimitEquivPowerIdealUnitInverseLimit hπ) (dvrUnitsEquivHigherUnitQuotientInverseLimit hπ u)) = unitReduction (uniformizerPowerIdeal π (n + 1)) u - simp? [dvrUnitsEquivHigherUnitQuotientInverseLimit, - adicPositiveUnitInverseLimitEquivDVRPowerIdealUnitInverseLimit, - unitReduction] + 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))) From f4bc899af6cb444bd49fb18f8e8bf37d8b14532c Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Tue, 22 Sep 2026 02:47:22 +0000 Subject: [PATCH 15/33] Split class field norm transports and primitive valuation calculations --- .../PrincipalIdealTransfer.lean | 107 +++---- .../Reciprocity/CyclotomicZHatBaseChange.lean | 60 ++-- .../CrossLocalRestriction.lean | 56 +--- .../FinitePlaceArtin/NormRestriction.lean | 4 + .../IdeleClassDirectLimitExtensionNorm.lean | 38 +++ .../AmbientPrimeWitnessComparison.lean | 280 +++--------------- .../EmbeddedFrobeniusTransport/Fields.lean | 14 + .../NormRestriction.lean | 116 ++------ .../Padic/CompletedPrimitiveUniformizer.lean | 275 +++++++---------- 9 files changed, 321 insertions(+), 629 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean index 51692cd5ad..ef23fb423a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -524,61 +524,66 @@ 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 noncomputable def smallHilbertClassFieldExplicitNormMembershipData_proof : SmallHilbertClassFieldExplicitNormMembershipData K where - membership := 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 + membership := smallHilbertClassFieldExplicitNormMembershipStatement_proof K open scoped Classical in /-- The named proposition underlying the fixed-field-base form of the diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 047084bdc9..94b7b09898 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -996,6 +996,16 @@ theorem · 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 : @@ -1080,13 +1090,7 @@ noncomputable instance @IsGalois.of_algEquiv ℚ E _ _ B _ _ _ hE eE let : FiniteDimensional ℚ B := hfiniteB let : IsGalois ℚ B := hB - 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 _ _ + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ let : IsGalois A C := @IsGalois.sup_right ℚ _ C _ _ B A hB hfiniteB hsup refine @@ -1136,13 +1140,7 @@ noncomputable instance (IsAbelianGalois.tower_bot ℚ E rationalCyclotomicZHatField) let : FiniteDimensional ℚ B := hfiniteB let : IsAbelianGalois ℚ B := hB - 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 _ _ + 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 : @@ -1311,6 +1309,11 @@ noncomputable def numberFieldCyclotomicZHatCompositumEmbedding : 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 : @@ -1391,10 +1394,6 @@ noncomputable instance @IntermediateField.isGalois_extendScalars_sup_of_forall_finiteGalois ℚ (SeparableClosure ℚ) _ _ _ A rationalCyclotomicZHatField rationalCyclotomicZHatFieldIsGalois hG - have hfull_eq : full = - IntermediateField.extendScalars (F := A) - (E := A ⊔ rationalCyclotomicZHatField) le_sup_left := by - dsimp only [full, hAC, C, numberFieldCyclotomicZHatCompositum] have hfull : IsGalois A full := by change IsGalois A (IntermediateField.extendScalars (F := A) @@ -1450,13 +1449,7 @@ noncomputable instance _ _ _ _ _ eT.symm.toAlgHom rationalCyclotomicZHatField_isAbelianGalois let : IsAbelianGalois ℚ B := hB - 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 _ _ + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ have heK (x : K) : algebraMap K C x = algebraMap A C (eK x) := by @@ -1532,6 +1525,15 @@ noncomputable def (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 @@ -1715,13 +1717,7 @@ theorem numberFieldCyclotomicZHatCompositumRestriction_injective : _ _ _ _ _ eT.symm.toAlgHom rationalCyclotomicZHatField_isAbelianGalois let : IsAbelianGalois ℚ B := hB - 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 _ _ + have hsup : B ⊔ A = ⊤ := sup_restrict_sup_eq_top _ _ let rB : (C ≃ₐ[A] C) →* (B ≃ₐ[ℚ] B) := IntermediateField.restrictRestrictAlgEquivMapHom ℚ B A C diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean index 32f433a895..967be19b81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -504,10 +504,7 @@ private theorem finitePlaceArtinLocalizedCompletion_globalEmbedding 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 + simpa only [U, U', finitePlaceExtensionEquivAbove_coe] using hcentres let eE : E ≃+* U.1.adicCompletion L := (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion @@ -525,52 +522,17 @@ private theorem finitePlaceArtinLocalizedCompletion_globalEmbedding (AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 x) = FinitePlace.embedding U.1 x := by - change - finitePlaceExtensionAdicCompletionRingEquiv - (K := K) (L := L) v w - (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion - vK hvK w - (AbsoluteValue.toAlgebraicLocalization - vK w.1 w.2 x)) = - FinitePlace.embedding U.1 x - rw [ - AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe] - change - finitePlaceExtensionAdicCompletionRingEquiv - (K := K) (L := L) v w - (AbsoluteValue.toCompletion w.1 x) = - FinitePlace.embedding - (finitePlaceExtensionCentre - (K := K) (L := L) v w) x - exact - finitePlaceExtensionAdicCompletionRingEquiv_toCompletion - (K := K) (L := L) v w x + 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 - change - finitePlaceExtensionAdicCompletionRingEquiv - (K := K') (L := L') W w' - (AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion - vK' hvK' w' - (AbsoluteValue.toAlgebraicLocalization - vK' w'.1 w'.2 (algebraMap L L' x))) = - FinitePlace.embedding U'.1 (algebraMap L L' x) - rw [ - AlgebraicNumberTheory.Valuations.localizedCompletionEquivCompletion_coe] - change - finitePlaceExtensionAdicCompletionRingEquiv - (K := K') (L := L') W w' - (AbsoluteValue.toCompletion w'.1 (algebraMap L L' x)) = - FinitePlace.embedding - (finitePlaceExtensionCentre - (K := K') (L := L') W w') - (algebraMap L L' x) - exact - finitePlaceExtensionAdicCompletionRingEquiv_toCompletion - (K := K') (L := L') W w' (algebraMap L L' x) + exact (congrArg (finitePlaceExtensionAdicCompletionRingEquiv W w') + (localizedCompletionEquivCompletion_coe vK' hvK' w' _)).trans + (finitePlaceExtensionAdicCompletionRingEquiv_toCompletion W w' (algebraMap L L' x)) apply eE'.injective change eE' @@ -589,9 +551,7 @@ private theorem finitePlaceArtinLocalizedCompletion_globalEmbedding 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean index 7fc9d6597f..5054899368 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -565,6 +565,10 @@ local instance finitePlaceNormLowerValued : 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean index feea1bb9ba..811b40a737 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean @@ -218,6 +218,44 @@ private noncomputable def rationalRelativeNormComparison 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 ℚ)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean index d6cd56fd30..b461ae0a55 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -69,28 +69,11 @@ theorem 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 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 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⟩ @@ -100,14 +83,7 @@ theorem let RF := (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField (localResidueDatum F) - let _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 _hRFFinite := hSourceFinite let RH := H.toFiniteResidueAbstractField (localResidueDatum K) let zF : Abelianization EI.extensionQuotient := @@ -215,10 +191,7 @@ theorem LH.val.restrictScalars K let : 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) + IsScalarTower.of_algebraMap_eq' iH.comp_algebraMap.symm exact Algebra.isSeparable_tower_bot_of_isSeparable K LH (SeparableClosure K) @@ -231,28 +204,11 @@ theorem let : Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation LH) := finiteExtensionSpectralValuation_hasExtension K LH - have hsourceRing : - (localSeparableValuationSubring F).comap LF.val.toRingHom = - (ValuativeRel.valuation LF).valuationSubring := - localSeparableValuationSubring_comap_embedding F LF LF.val - have htargetRing : - (localSeparableValuationSubring K).comap iH.toRingHom = - (ValuativeRel.valuation LH).valuationSubring := - localSeparableValuationSubring_comap_embedding K LH iH have hmem (x : LF) : x ∈ (ValuativeRel.valuation LF).valuationSubring ↔ - phi x ∈ (ValuativeRel.valuation LH).valuationSubring := by - rw [← hsourceRing, ← htargetRing] - change - (x : SeparableClosure F) ∈ localSeparableValuationSubring F ↔ - ((phi x : LH) : SeparableClosure K) ∈ - localSeparableValuationSubring K - rw [hphi x] - have hvaluation := - localSeparableValuationSubring_eq_comap_finiteExtensionEquiv - K F i e - rw [hvaluation] - rfl + 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 := @@ -277,47 +233,16 @@ theorem exact relativeNorm_intrinsicAbstractBase_abstractFixedFieldUnit F SF hSFB pF - have hconcretePrime : - concreteNormResidueSymbolOfEmbedding - F E jI - (localResidueDatum F) - (localHenselianValuation F) - (separableClosureUnits_isClassFormation F) xPrime = - Abelianization.of (qF q) := by - have hprime := - 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) - exact hprime - 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 hconcretePrimeZ : - concreteNormResidueSymbolOfEmbedding - F E jI - (localResidueDatum F) - (localHenselianValuation F) - (separableClosureUnits_isClassFormation F) xPrime = z := by - rw [hconcretePrime, ← hqz] - exact (abelianizationCongr_of qF q).symm - have hxWitness : - ambientEmbeddedPrimeWitness K F E j e z = xPrime := by - rfl + 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 - hconcretePrimeZ + 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. -/ @@ -362,28 +287,11 @@ theorem 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 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 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⟩ @@ -399,20 +307,10 @@ theorem let qF := finiteGaloisAbstractQuotientEquivGaloisGroupOfEmbedding F E jI - let q₀ := - abstractExtensionQuotientEquivGaloisGroup - K (SeparableClosure K) H₀ J₀ hJH hTargetNormal let RF := (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField (localResidueDatum F) - let _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 _hRFFinite := hSourceFinite let RH := H.toFiniteResidueAbstractField (localResidueDatum K) let zF : Abelianization EI.extensionQuotient := @@ -426,9 +324,6 @@ theorem let sigmaH := intrinsicFrobeniusElementToAmbientEmbeddedField K F E j e sigma - let qAmbient := - (localResidueDatum K).frobeniusRestriction - RH J₀ hJH sigmaH let SF := (localResidueDatum F).frobeniusFixedField RF EI.field EI.below sigma @@ -446,13 +341,7 @@ theorem let hSHfinite := (localResidueDatum K).frobeniusFixedField_finite RH J₀ hJH sigmaH - let _hSHFinite : Finite - (H₀.toSubgroup ⧸ - extensionSubgroup H₀ SH hSHH) := by - change Finite - (RH.field.toSubgroup ⧸ - extensionSubgroup RH.field SH hSHH) - exact hSHfinite + let _hSHFinite := hSHfinite let hSHabsolute := (localResidueDatum K).frobeniusFixedField_absoluteFinite H J₀ hJH sigmaH @@ -477,10 +366,8 @@ theorem 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 + 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 @@ -526,10 +413,7 @@ theorem LH.val.restrictScalars K let : 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) + IsScalarTower.of_algebraMap_eq' iH.comp_algebraMap.symm exact Algebra.isSeparable_tower_bot_of_isSeparable K LH (SeparableClosure K) @@ -544,23 +428,11 @@ theorem 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 + 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 - let xPrime : Fˣ := - normUnits F LF pF - let xPrime0 : F₀ˣ := - Units.mapEquiv phiF.toMulEquiv xPrime - have hxWitness : - ambientEmbeddedPrimeWitness K F E j e z = xPrime := by - rfl have hpHvalue := chosenValuationOneUnitOfRingEquiv_target LF LH phi hmem let pH : LHˣ := @@ -581,55 +453,11 @@ theorem exact localHenselianValuation_isPrimeElement_abstractFixedField K SigmaH pH hpHvalue - have hambientPrime : - abstractFixedFieldNormResidueSymbol - K (SeparableClosure K) - (localResidueDatum K) - (localHenselianValuation K) - (separableClosureUnits_isClassFormation K) - H₀ J₀ hJH (Additive.ofMul xPrime0) = - Additive.ofMul - (q₀.abelianizationCongr - (Abelianization.of qAmbient)) := by - 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 - have hxPrime0 : - Units.mapEquiv phiF.toMulEquiv - (ambientEmbeddedPrimeWitness K F E j e z) = - xPrime0 := by - exact congrArg - (Units.mapEquiv phiF.toMulEquiv) hxWitness - have hsymbolWitness : - 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)) := by - exact - (congrArg - (fun y : F₀ˣ => - abstractFixedFieldNormResidueSymbol - K (SeparableClosure K) - (localResidueDatum K) - (localHenselianValuation K) - (separableClosureUnits_isClassFormation K) - H₀ J₀ hJH (Additive.ofMul y)) - hxPrime0).trans hambientPrime unfold ambientEmbeddedPrimeSymbolProperty - exact hsymbolWitness + 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. -/ @@ -701,28 +529,11 @@ theorem 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 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 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⟩ @@ -735,14 +546,7 @@ theorem let RF := (intrinsicFiniteAbstractBase F).toFiniteResidueAbstractField (localResidueDatum F) - let _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 _hRFFinite := hSourceFinite let RH := H.toFiniteResidueAbstractField (localResidueDatum K) let zF : Abelianization EI.extensionQuotient := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean index d22ca5bd50..0bfd060f95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean @@ -20,6 +20,20 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index 8c2526f4eb..347acd19c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -459,12 +459,8 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction exact (AlgHom.fieldRange iLower).fixingSubgroup_le hRangeHH - have hRangeJJ : - AlgHom.fieldRange jLower ≤ - AlgHom.fieldRange j := by - intro x hx - rcases hx with ⟨y, rfl⟩ - exact ⟨algebraMap L L' y, rfl⟩ + 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] @@ -476,32 +472,12 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction hRangeJJ let hJH : J.toSubgroup ≤ H.toSubgroup := lower.extension.below let hJ'H' : J'.toSubgroup ≤ H'.toSubgroup := upper.extension.below - let hJnormal : - (extensionSubgroup H J hJH).Normal := - lower.extension.normal - let hJfinite : Finite - (H.toSubgroup ⧸ extensionSubgroup H J hJH) := - lower.extension.finite - let hJ'normal : - (extensionSubgroup H' J' hJ'H').Normal := - upper.extension.normal - let hJ'finite : Finite - (H'.toSubgroup ⧸ extensionSubgroup H' J' hJ'H') := - upper.extension.finite - let hHabsolute : Finite - ((baseField - Gal(SeparableClosure K/K)).toSubgroup ⧸ - extensionSubgroup - (baseField Gal(SeparableClosure K/K)) - H (le_baseField H)) := - lower.base.finite - let hH'absolute : Finite - ((baseField - Gal(SeparableClosure K/K)).toSubgroup ⧸ - extensionSubgroup - (baseField Gal(SeparableClosure K/K)) - H' (le_baseField H')) := - upper.base.finite + 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 := @@ -510,12 +486,10 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction exact Finite.of_injective inclusion inclusion.injective let FLower := abstractFixedField K (SeparableClosure K) H - let phiLower : K ≃ₐ[K] FLower := - lower.baseEquiv + let phiLower := lower.baseEquiv let FUpper := abstractFixedField K (SeparableClosure K) H' - let phiUpper : K' ≃ₐ[K] FUpper := - upper.baseEquiv + let phiUpper := upper.baseEquiv let restrictActual : Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp @@ -527,14 +501,10 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction exact congrArg j (AlgEquiv.restrictNormal_commutes ((AlgEquiv.restrictScalarsHom K) τ) L x) - have hbase : ∀ x : L, - j (algebraMap L L' x) = jLower x := by - intro x - rfl + have hbase : ∀ x : L, j (algebraMap L L' x) = jLower x := fun _ => rfl let aUpper : FUpperˣ := Units.mapEquiv phiUpper.toMulEquiv a - let aNorm : Kˣ := - normUnits K K' a + let aNorm := normUnits K K' a let aLower : FLowerˣ := Units.mapEquiv phiLower.toMulEquiv aNorm let symbolUpper := @@ -604,39 +574,20 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction (upper.extension.extensionQuotientMulEquiv.abelianizationCongr upperQuotientValue)) = lowerQuotientValue := by - refine - lower.extension.extensionQuotientMulEquiv.abelianizationCongr.symm_apply_eq.mpr ?_ - calc - normResidueNaturalityAbelianizedRestriction - H H' J J' hJH hJ'H' hH'H hJ'J - (upper.extension.extensionQuotientMulEquiv.abelianizationCongr - upperQuotientValue) = - normResidueNaturalityAbelianizedRestriction - H H' J J' hJH hJ'H' hH'H hJ'J - ((upper.extension.extensionQuotientMulEquiv.symm.trans - upper.fixedFieldQuotientEquiv).abelianizationCongr.symm - upperSymbolValue) := by - simp only [← abelianizationCongr_trans, - ← abelianizationCongr_symm, MulEquiv.symm_trans_apply, - MulEquiv.symm_symm, upperQuotientValue] - _ = (lower.extension.extensionQuotientMulEquiv.symm.trans - lower.fixedFieldQuotientEquiv).abelianizationCongr.symm - lowerSymbolValue := hraw - _ = lower.extension.extensionQuotientMulEquiv.abelianizationCongr - lowerQuotientValue := by - simp only [← abelianizationCongr_trans, - ← abelianizationCongr_symm, MulEquiv.symm_trans_apply, - MulEquiv.symm_symm, lowerQuotientValue] + 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 := by - exact upper.normResidueAbelianElement_apply a + upperQuotientValue := + upper.normResidueAbelianElement_apply a have hlowerEval : lower.normResidueAbelianElement aNorm = lower.quotientEquiv.abelianizationCongr - lowerQuotientValue := by - exact lower.normResidueAbelianElement_apply aNorm + lowerQuotientValue := + lower.normResidueAbelianElement_apply aNorm let ambientUpper : Gal(L'/K') := ambientEmbeddedNormResidueElement K K' L' j eUpper a let ambientLower : Gal(L/K) := @@ -653,27 +604,9 @@ theorem ambientEmbeddedNormResidueElement_norm_restriction (Abelianization.equivOfComm (H := Gal(L/K))).symm (lower.normResidueAbelianElement aNorm) rw [hupperEval, hlowerEval] - calc - restrictActual - ((Abelianization.equivOfComm (H := Gal(L'/K'))).symm - (upper.quotientEquiv.abelianizationCongr - upperQuotientValue)) = - (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 - upperQuotientValue)))) := - htarget upperQuotientValue - _ = (Abelianization.equivOfComm (H := Gal(L/K))).symm - (lower.quotientEquiv.abelianizationCongr - lowerQuotientValue) := - congrArg - (fun z => - (Abelianization.equivOfComm (H := Gal(L/K))).symm - (lower.quotientEquiv.abelianizationCongr z)) - hambient + 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 @@ -746,8 +679,7 @@ theorem abelianLocalArtinMonoidHom_norm_restriction Gal(L'/K') →* Gal(L/K) := (AlgEquiv.restrictNormalHom L).comp (AlgEquiv.restrictScalarsHom K) - let aNorm : Kˣ := - normUnits K K' a + let aNorm := normUnits K K' a let ambientUpper : Gal(L'/K') := ambientEmbeddedNormResidueElement K K' L' j eUpper a let ambientLower : Gal(L/K) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean index bd0c57fa01..8a63b6eaad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean @@ -63,6 +63,105 @@ private theorem completedPolynomial_eval₂_mem_ideal_of_coeff_mem 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 : ℕ) : @@ -145,30 +244,8 @@ private theorem 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 ∈ 𝔭 := by - rcases lt_trichotomy i d with hi | hi | hi - · have hQi : Q.coeff i ∈ 𝔭 := by - apply hQeisenstein.mem - rwa [hQnatDegree] - change (Q - Polynomial.X ^ d).coeff 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 ∈ 𝔭 - rw [Polynomial.coeff_sub, hQd, Polynomial.coeff_X_pow, - ite_eq_left rfl, sub_self] - exact 𝔭.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 ∈ 𝔭 - rw [Polynomial.coeff_sub, hQi, Polynomial.coeff_X_pow, - ite_eq_right (ne_of_gt hi), sub_zero] - exact 𝔭.zero_mem + 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 @@ -239,66 +316,8 @@ private theorem addVal_integerMap_eq_ramificationIndex_nsmul base target πA, IsDiscreteValuationRing.addVal_uniformizer hπAIrreducible] simp only [e, nsmul_eq_mul, mul_one] - have hR_eval : - R.eval₂ j root = j (R.coeff 0) + root * tail := by - have h := - congrArg (Polynomial.eval₂ j root) - (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 root = root * tail + j (R.coeff 0) := by - simpa only [tail] using h.symm - _ = j (R.coeff 0) + root * tail := add_comm _ _ - have htailVal : - ((e + 1 : ℕ) : ℕ∞) ≤ - IsDiscreteValuationRing.addVal target.valuationSubring - (root * tail) := - (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge - (root * tail) (e + 1)).1 hrootTailMem - have heCastLt : - (e : ℕ∞) < - IsDiscreteValuationRing.addVal target.valuationSubring - (root * 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 - (root * tail) := by - rw [hconst] - exact ne_of_lt heCastLt - have hRval : - IsDiscreteValuationRing.addVal target.valuationSubring - (R.eval₂ j root) = (e : ℕ∞) := by - rw [hR_eval, - (IsDiscreteValuationRing.addVal - target.valuationSubring).map_add_of_distinct_val hdistinct, - hconst, min_eq_left] - exact heCastLt.le - have hpowEq : root ^ d = -(R.eval₂ j root) := - eq_neg_of_add_eq_zero_left hrootDecomp - have hmul : - (d : ℕ∞) * - IsDiscreteValuationRing.addVal target.valuationSubring root = - (e : ℕ∞) := by - calc - (d : ℕ∞) * - IsDiscreteValuationRing.addVal target.valuationSubring root = - d • IsDiscreteValuationRing.addVal - target.valuationSubring root := by rw [nsmul_eq_mul] - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (root ^ d) := by - symm - exact IsDiscreteValuationRing.addVal_pow root d - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (-(R.eval₂ j root)) := by rw [hpowEq] - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (R.eval₂ j root) := - (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg _ - _ = (e : ℕ∞) := hRval + 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 @@ -464,30 +483,8 @@ private theorem 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 ∈ 𝔭 := by - rcases lt_trichotomy i d with hi | hi | hi - · have hQi : Q.coeff i ∈ 𝔭 := by - apply hQeisenstein.mem - rwa [hQnatDegree] - change (Q - Polynomial.X ^ d).coeff 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 ∈ 𝔭 - rw [Polynomial.coeff_sub, hQd, Polynomial.coeff_X_pow, - ite_eq_left rfl, sub_self] - exact 𝔭.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 ∈ 𝔭 - rw [Polynomial.coeff_sub, hQi, Polynomial.coeff_X_pow, - ite_eq_right (ne_of_gt hi), sub_zero] - exact 𝔭.zero_mem + 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 @@ -579,66 +576,8 @@ private theorem addVal_integerMap_eq_ramificationIndex_nsmul base target πuA, IsDiscreteValuationRing.addVal_uniformizer hπuAIrreducible] simp only [e, nsmul_eq_mul, mul_one] - have hR_eval : - R.eval₂ j θ = j (R.coeff 0) + θ * tail := by - have h := - congrArg (Polynomial.eval₂ j θ) - (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 θ = θ * tail + j (R.coeff 0) := by - simpa only [tail] using h.symm - _ = j (R.coeff 0) + θ * tail := add_comm _ _ - have htailVal : - ((e + 1 : ℕ) : ℕ∞) ≤ - IsDiscreteValuationRing.addVal target.valuationSubring - (θ * tail) := - (IsDiscreteValuationRing.mem_maximalIdeal_pow_iff_addVal_ge - (θ * tail) (e + 1)).1 hθtail_mem - have heCastLt : - (e : ℕ∞) < - IsDiscreteValuationRing.addVal target.valuationSubring - (θ * 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 - (θ * tail) := by - rw [hconst] - exact ne_of_lt heCastLt - have hRval : - IsDiscreteValuationRing.addVal target.valuationSubring - (R.eval₂ j θ) = (e : ℕ∞) := by - rw [hR_eval, - (IsDiscreteValuationRing.addVal - target.valuationSubring).map_add_of_distinct_val hdistinct, - hconst, min_eq_left] - exact heCastLt.le - have hpowEq : θ ^ d = -(R.eval₂ j θ) := - eq_neg_of_add_eq_zero_left hrootDecomp - have hmul : - (d : ℕ∞) * - IsDiscreteValuationRing.addVal target.valuationSubring θ = - (e : ℕ∞) := by - calc - (d : ℕ∞) * - IsDiscreteValuationRing.addVal target.valuationSubring θ = - d • IsDiscreteValuationRing.addVal - target.valuationSubring θ := by rw [nsmul_eq_mul] - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (θ ^ d) := by - symm - exact IsDiscreteValuationRing.addVal_pow θ d - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (-(R.eval₂ j θ)) := by rw [hpowEq] - _ = IsDiscreteValuationRing.addVal target.valuationSubring - (R.eval₂ j θ) := - (IsDiscreteValuationRing.addVal target.valuationSubring).map_neg _ - _ = (e : ℕ∞) := hRval + 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 From 92c31417fde0f2d9c4d40f964e5e6e15b6b6179b Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Thu, 24 Sep 2026 15:12:10 +0000 Subject: [PATCH 16/33] Restore project registration lost during automatic main merge --- LeanPool/projects.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/LeanPool/projects.yml b/LeanPool/projects.yml index 10e85b5b7d..4991cb5d7b 100644 --- a/LeanPool/projects.yml +++ b/LeanPool/projects.yml @@ -10169,3 +10169,37 @@ projects: - 35B65 - 42B20 - 28A78 + + - 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 From 2d9fff9d1904084aa4c3ce987052bbdbdf722192 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 08:06:41 +0000 Subject: [PATCH 17/33] Extract class field norm and reciprocity proof boundaries --- LeanPool/ClassFieldTheory.lean | 1 + .../Construction/CoreFrobeniusNorm.lean | 2 +- .../Reciprocity/Construction/Universal.lean | 666 +++++++++--------- .../TotallyRamifiedCase/FixedSource.lean | 442 ++++++------ .../Completion/Comparison.lean | 3 +- .../Completion/ExtensionIndex.lean | 3 +- .../Galois/CyclicPrimeDegreeSubextension.lean | 3 +- .../Idele/ClassGroup/AlgEquiv.lean | 3 +- .../Idele/ClassGroup/BaseChange.lean | 3 +- .../Idele/ClassGroup/Tower.lean | 3 +- .../OutsideIntegralInduced/ChosenPlace.lean | 4 +- .../ChosenPlaceAction.lean | 20 +- .../Idele/Extension/BaseChange.lean | 12 +- .../Idele/LocallyCompact.lean | 5 +- .../Ramification/Splitting/FinitePlace.lean | 3 +- .../Splitting/FinitePlaceIdeal.lean | 9 +- .../Ramification/Splitting/NormalClosure.lean | 3 +- .../Splitting/PrimeOrderFixedField.lean | 9 +- .../RayClass/Approximation.lean | 3 +- .../AlgebraicNumberTheory/RayClass/Ideal.lean | 3 +- .../RayClass/Narrow.lean | 3 +- .../RayClass/Rational.lean | 3 +- .../SUnit/LogLattice.lean | 6 +- .../CyclicIdeleClassNormIndex.lean | 12 +- .../ClassFieldAxiom/HasseNormPrinciple.lean | 1 - .../PrimePowerKummerIndex.lean | 5 +- .../IdelePowerLocalUnitNormContainment.lean | 538 +++++++------- .../SUnitKummerPrimeSelection/Conclusion.lean | 319 ++++----- .../CofinitelySplitFiniteExtension.lean | 3 +- .../CyclicPrimePowerFullDecomposition.lean | 3 +- .../AbelianConductorExactness.lean | 10 +- .../AbelianLocalConductorComparison.lean | 11 +- .../BigHilbertClassFieldMathlibArtin.lean | 20 +- .../GlobalClassFields/ConductorFrobenius.lean | 2 +- .../CyclicConductorUniqueness.lean | 10 +- .../CyclicRayClassMaximality.lean | 4 +- .../FiniteAbelianClassFieldContainment.lean | 1 - .../MathlibFrobeniusHilbertComparison.lean | 45 +- .../MathlibGlobalReciprocity.lean | 10 +- .../NormRayClassMaximality.lean | 8 +- .../PublicIdealNormArtinKernel.lean | 1 - .../PublicIdealNormQuotientComparison.lean | 1 - .../PublicRayClassComparison.lean | 27 +- .../SmallHilbertClassFieldMathlibArtin.lean | 15 +- .../ArithmeticIdealDecompositionLaw.lean | 5 +- .../IdealNormArtinExactness.lean | 5 +- .../PrincipalIdealTransfer.lean | 4 +- .../ZeroTransport.lean | 8 +- .../AbstractFixedFieldGlobalNormResidue.lean | 57 +- .../InfinitePlaceCompatibility.lean | 9 +- .../OverextensionArtin.lean | 9 +- .../RamifiedOverextension.lean | 12 +- .../RationalComplexification.lean | 10 +- .../CyclotomicAbstractFixedFieldArtin.lean | 194 ++--- ...lotomicUnramifiedGeometricRestriction.lean | 15 +- .../CyclotomicUnramifiedRestriction.lean | 11 +- .../UnramifiedNormalization.lean | 4 +- ...GlobalArtinFiniteSupportApproximation.lean | 5 +- .../Reciprocity/GlobalNormResidue.lean | 5 +- .../GlobalNormResidueNaturality.lean | 61 +- .../FinitePadicAuxiliaryField.lean | 3 +- .../Reciprocity/PowerResidueReciprocity.lean | 5 +- .../RationalCyclotomicFinitePlaceArtin.lean | 131 ++-- ...ationalCyclotomicPrincipalAwayProduct.lean | 3 +- .../RationalCyclotomicRayNorm.lean | 5 +- .../RationalPrincipalLocalUnit.lean | 3 +- ...tionalCyclotomicArithmeticReciprocity.lean | 6 +- .../RationalRayClassFieldCyclotomic.lean | 14 +- .../Concrete/CyclotomicPrimeBaseChange.lean | 9 +- .../Concrete/FinitePlaceDecomposition.lean | 3 +- .../Concrete/SUnitKummerUnramified.lean | 3 +- .../EnlargedSUnitRestriction.lean | 3 +- .../LocalBlocks/TensorNorm.lean | 7 +- .../Finite/CyclotomicNorm/PrincipalUnits.lean | 5 +- .../FiniteSubgroupResidueDegree.lean | 8 +- .../FixedFieldContinuousNaturality.lean | 3 +- .../FixedFieldIntrinsicReciprocity/All.lean | 1 + .../AmbientPrimeTarget.lean | 168 +++++ .../AmbientPrimeWitness.lean | 149 +--- .../LocalReciprocity/FixedFieldLocalData.lean | 12 +- .../LocalReciprocity/LocalResidueDatum.lean | 4 +- .../ResidueAbsoluteDegree.lean | 3 +- .../ResidueAlgebraicClosureDegree.lean | 7 +- .../SeparableNormProduct.lean | 4 +- .../Infinite/AbsoluteFiniteQuotients.lean | 3 +- .../LubinTateTransport.lean | 10 +- .../PadicMultiplicativeArtinComparison.lean | 10 +- .../CompletedLevel/ChangedCompletedLevel.lean | 4 +- .../CompletedLevel/CompletedLevel.lean | 4 +- .../DirectThetaAtCompletedLevel.lean | 2 +- .../Existence/LaurentModel.lean | 24 +- .../FiniteLevel/FreeRankOne.lean | 8 +- .../FormalModule/AmbientBracketAction.lean | 5 +- .../FormalModule/LubinTateEndomorphism.lean | 5 +- .../Ramification/PrimitivePoint.lean | 3 +- .../FiniteLevel/PrimitiveDisplacement.lean | 2 +- .../FormalModule/StandardFormalGroup.lean | 4 +- .../CompletedStandardLevelTransport.lean | 15 +- .../AbelianConductorFiniteNormCriterion.lean | 5 +- .../AbelianConductorFiniteUnramified.lean | 5 +- .../AbelianConductorRealRamification.lean | 5 +- .../AbelianConductorTameCriterion.lean | 7 +- .../RayClassIdealNormImageEqArtinKer.lean | 5 +- .../SmallHilbertClassFieldArtinEquiv.lean | 10 +- .../SmallHilbertClassFieldPrimeSplitting.lean | 5 +- .../FinitePlaceCompletionLocalArtin.lean | 5 +- .../FinitePlaceLocalGlobalNormKernel.lean | 5 +- .../FinitePlaceRayArtinDecomposition.lean | 10 +- .../FinitePlaceRayArtinLocalValue.lean | 112 +-- .../FinitePlaceRayArtinNormKernel.lean | 5 +- .../HerbrandLowDegree/Cardinality.lean | 6 +- .../Cyclic/Herbrand/Induced.lean | 3 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 3 +- .../GroupTheory/Transfer/Witt.lean | 2 + .../Analytic/ContinuousFieldUnitLog.lean | 35 +- .../Analytic/FieldUnitLogExtension.lean | 12 +- .../Analytic/LogExpComposition.lean | 2 +- .../FieldUnitStructure.lean | 15 +- .../IntegralLattice.lean | 10 +- .../DiscreteValuationField/PadicField.lean | 10 +- .../RangeRestrictedTopology.lean | 5 +- .../Dedekind/FixedFieldTower.lean | 16 +- .../Dedekind/TowerInvariants.lean | 2 +- .../NormFormulaAbsoluteValue.lean | 6 +- .../NormFormulaExtension.lean | 12 +- .../FiniteExtension/Core.lean | 25 +- .../FiniteExtension/Uniqueness.lean | 78 +- .../DiscreteValuationField/Henselian.lean | 8 +- .../AlgebraicExtensionUniqueness.lean | 5 +- .../Henselian/MonicFactorization.lean | 5 +- .../Henselian/NonmonicReduction.lean | 5 +- .../Henselian/UniqueAlgebraicExtensions.lean | 5 +- .../Henselian/UniqueExtensionPrimitive.lean | 5 +- .../ValuationExtensionCriterion.lean | 5 +- .../Topology/CompatibleInverseLimit.lean | 12 +- 135 files changed, 2023 insertions(+), 1778 deletions(-) create mode 100644 LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean index f85fa6ee77..dfa5dfced2 100644 --- a/LeanPool/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory.lean @@ -787,6 +787,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean index f6bf94ae20..4bf30b97df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean @@ -949,7 +949,7 @@ private theorem frobeniusQuotientAction_relativeNorm (D : DegreeData G) (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] - [hInertiaFintype : Fintype + [hInertiaFintype : Finite ((D.maximalUnramifiedField K.field).toSubgroup ⧸ extensionSubgroup (D.maximalUnramifiedField K.field) (D.maximalUnramifiedField L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean index 57e7c515c0..02ec1cdee9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean @@ -74,6 +74,313 @@ theorem universalNormDescent_endpoint_descent 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. -/ @@ -208,66 +515,16 @@ theorem universalNormDescent_mem_finiteUnitNormRange fieldAbsoluteFinite := hTabsolute relativeFinite := hTSfinite } let fixedTower := powerTower.toFrobeniusFixedFieldTower - let finiteFixedTower := - powerTower.toFiniteAmbientFrobeniusFixedFieldTower let SF := fixedTower.base let TF := fixedTower.field - let hSMu : S.toSubgroup ≤ Mu.field.toSubgroup := hSP.trans hPMu - let hSMufinite : Finite - (Mu.field.toSubgroup ⧸ extensionSubgroup Mu.field S hSMu) := - FiniteIntermediateField.finite_extension_of_le hSK Mu.below hSMu - let : Finite - ((Mu.toFiniteAbstractField K).field.toSubgroup ⧸ - extensionSubgroup (Mu.toFiniteAbstractField K).field S hSMu) := by - change Finite - (Mu.field.toSubgroup ⧸ extensionSubgroup Mu.field S hSMu) - exact hSMufinite - let ESMu : FiniteAbstractFieldExtension G := - FiniteAbstractFieldExtension.ofInclusion - S (Mu.toFiniteAbstractField K) hSMu - have hESMuField : ESMu.field = SF := - FiniteAbstractField.eq_of_field_eq _ _ rfl - let uS : v.unitAddSubgroup SF := - hESMuField ▸ v.finiteUnitInclusion ESMu uMu - let hSMi (j : ιs) : S.toSubgroup ≤ (Mi j).field.toSubgroup := - hSP.trans (hPMi j) - let hSMifinite (j : ιs) : Finite - ((Mi j).field.toSubgroup ⧸ extensionSubgroup (Mi j).field S (hSMi j)) := - FiniteIntermediateField.finite_extension_of_le hSK (Mi j).below (hSMi j) - let hSMifiniteBundled (j : ιs) : Finite - (((Mi j).toFiniteAbstractField K).field.toSubgroup ⧸ - extensionSubgroup ((Mi j).toFiniteAbstractField K).field S (hSMi j)) := by - change Finite - ((Mi j).field.toSubgroup ⧸ - extensionSubgroup (Mi j).field S (hSMi j)) - exact hSMifinite j - let ESMi (j : ιs) : FiniteAbstractFieldExtension G := - FiniteAbstractFieldExtension.ofInclusion - S ((Mi j).toFiniteAbstractField K) (hSMi j) - have hESMiField (j : ιs) : (ESMi j).field = SF := - FiniteAbstractField.eq_of_field_eq _ _ rfl - let uᵢS (j : ιs) : v.unitAddSubgroup SF := - hESMiField j ▸ v.finiteUnitInclusion (ESMi j) (uMi j) - have huSval : uS.1.1 = u.1.1 := by - have huMuVal := congrArg Subtype.val huMu - change uMu.1.1 = u.1.1 at huMuVal - have huStransport : uS.1.1 = uMu.1.1 := by - dsimp only [uS] - cases hESMuField - rfl - calc - uS.1.1 = uMu.1.1 := huStransport - _ = u.1.1 := huMuVal - have huᵢSval (j : ιs) : (uᵢS j).1.1 = (uᵢ j.1).1.1 := by - have huMiVal := congrArg Subtype.val (huMi j) - change (uMi j).1.1 = (uᵢ j.1).1.1 at huMiVal - have huᵢStransport : (uᵢS j).1.1 = (uMi j).1.1 := by - dsimp only [uᵢS] - cases hESMiField j - rfl - calc - (uᵢS j).1.1 = (uMi j).1.1 := huᵢStransport - _ = (uᵢ j.1).1.1 := huMiVal + 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, @@ -296,8 +553,6 @@ theorem universalNormDescent_mem_finiteUnitNormRange let τs : ιs → (D.extensionNormalizedDegreeContinuous KR L hLK).toMonoidHom.ker := fun j => τ j.1 - have hφσ : φ.1 * σ.1 = σ.1 * φ.1 := - powerTower.frobenius_commute_base have hφσn : φ.1 * σn.1 = σn.1 * φ.1 := powerTower.frobenius_commute_field have hτσ (j : ιs) : (τs j).1 * (φ.1 ^ n) = @@ -321,26 +576,10 @@ theorem universalNormDescent_mem_finiteUnitNormRange 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 := by - let MT := D.frobeniusFixedIntermediateField KR L hLK σn - have hTFMT : TF = MT.toFiniteAbstractField K := - FiniteAbstractField.eq_of_field_eq _ _ rfl - let uBarMT : v.unitAddSubgroup (MT.toFiniteAbstractField K) := - hTFMT ▸ uBar - refine ⟨MT, uBarMT, ?_⟩ - apply Subtype.ext - change uBarMT.1.1 = uBar.1.1 - dsimp only [uBarMT] - have hyBarEmem : yBarE ∈ v.infiniteUnitAddSubgroup E K hEK := by - let MT := D.frobeniusFixedIntermediateField KR L hLK σn - have hTFMT : TF = MT.toFiniteAbstractField K := - FiniteAbstractField.eq_of_field_eq _ _ rfl - let yBarMT : v.unitAddSubgroup (MT.toFiniteAbstractField K) := - hTFMT ▸ yBar - refine ⟨MT, yBarMT, ?_⟩ - apply Subtype.ext - change yBarMT.1.1 = yBar.1.1 - dsimp only [yBarMT] + 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 := @@ -349,177 +588,9 @@ theorem universalNormDescent_mem_finiteUnitNormRange (Finset.univ : Finset ιs) φ.1 τs w uBarᵢE hstarW obtain ⟨zK, hzK⟩ := v.descend_maximalUnramifiedNorm_unit K L hLK φ hφ w hwMem hfixedZ - 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 hsumUnit (f : Fin n → v.unitAddSubgroup TF) : - ((∑ i, f i).1.1 : A.V) = ∑ i, (f i).1.1 := by - calc - ((∑ i, f i).1.1 : A.V) = - (ambientFixedAddSubgroup A TF.field).subtype - (∑ i, (v.unitAddSubgroup TF).subtype (f i)) := by - exact congrArg (ambientFixedAddSubgroup A TF.field).subtype - (map_sum (v.unitAddSubgroup TF).subtype f Finset.univ) - _ = _ := - map_sum (ambientFixedAddSubgroup A TF.field).subtype - (fun i => (v.unitAddSubgroup TF).subtype (f i)) Finset.univ - have hsumAmbient (f : Fin n → ambientFixedAddSubgroup A T) : - ((∑ i, f i).1 : A.V) = ∑ i, (f i).1 := - map_sum (ambientFixedAddSubgroup A T).subtype f Finset.univ - have hpowerTUnit : powerTUnit.1 = powerT := by - apply Subtype.ext - calc - (powerTUnit.1.1 : A.V) = - ∑ i : Fin n, (v.frobeniusFixedFieldUnitAction KR L hLK σn - (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar).1.1 := - hsumUnit (fun i : Fin n => - v.frobeniusFixedFieldUnitAction KR L hLK σn - (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar) - _ = ∑ i : Fin n, - (D.frobeniusFixedFieldAction A KR L hLK σn - (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar.1).1 := rfl - _ = powerT.1 := - (hsumAmbient (fun i : Fin n => - D.frobeniusFixedFieldAction A KR L hLK σn - (φ.1 ^ i.1) (Commute.pow_left hφσn i.1) yBar.1)).symm - 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.1, by - intro g - have hg : g.1 ∈ SF.field := by - change g.1 ∈ D.frobeniusFixedField KR L hLK σ - exact g.2 - exact uS.1.2 ⟨g.1, hg⟩⟩ - let ySraw : ambientFixedAddSubgroup A S := - ⟨yS.1.1, by - intro g - have hg : g.1 ∈ SF.field := by - change g.1 ∈ D.frobeniusFixedField KR L hLK σ - exact g.2 - exact yS.1.2 ⟨g.1, hg⟩⟩ - let uBarraw : ambientFixedAddSubgroup A T := - ⟨uBar.1.1, by - intro g - have hg : g.1 ∈ - (D.frobeniusFixedAbstractField KR L hLK σn).field := by - change g.1 ∈ D.frobeniusFixedField KR L hLK σn - exact g.2 - exact uBar.1.2 ⟨g.1, hg⟩⟩ - let wBarraw : ambientFixedAddSubgroup A T := - ⟨wBar.1.1, by - intro g - have hg : g.1 ∈ TF.field := by - change g.1 ∈ D.frobeniusFixedField KR L hLK σn - exact g.2 - exact wBar.1.2 ⟨g.1, hg⟩⟩ - 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 := by - apply Subtype.ext - have h := congrArg Subtype.val huBar - change - (relativeNorm A S T hTS uBar.1).1 = uS.1.1 at h - change - (relativeNorm A S T hTS uBarraw).1 = uSraw.1 - exact h - have hySraw : relativeNorm A S T hTS yBar.1 = ySraw := by - apply Subtype.ext - rfl - have hpowerNormRaw : relativeNorm A S T hTS powerT = powerS := by - simpa [powerT, powerS, S, T, σ, σn, hySraw] using 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 K.field L hLK σ.1 n - (J (N (fixedFieldInclusion A T E hTE wBarraw))) := by - change - J (N (fixedFieldInclusion A S E hSE - (relativeNorm A S T hTS wBar.1))) = - D.frobeniusPowerSum A K.field L hLK σ.1 n - (J (N (fixedFieldInclusion A T E hTE wBar.1))) at hnormW - exact hnormW - have hσfixedZ : D.frobeniusQuotientAction A K.field L hLK σ.1 (J (N w)) = - J (N w) := by - let B := D.frobeniusQuotientRepresentation A K.field L hLK - have hpow := rep_action_pow_fixed - B φ.1 (J (N w)) hfixedZ n - change D.frobeniusQuotientAction A K.field L hLK - (φ.1 ^ n) (J (N w)) = J (N w) at hpow - simpa only [σ, D.frobeniusPowerOfDegreeOne_coe] using hpow - have hpowerZ : D.frobeniusPowerSum A K.field L hLK σ.1 n (J (N w)) = - n • J (N w) := - D.frobeniusPowerSum_eq_nsmul_of_fixed A K.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.1 := by - apply Subtype.ext - change uSraw.1 = u.1.1 - exact huSval - have hnormRelationE : - J (N u.1) = - J (N (D.frobeniusPowerSum A K.field L hLK φ.1 n - (fixedFieldInclusion A S E hSE ySraw))) + n • J (N w) := by - have h := hnormW' - simp only [map_sub] at h - rw [huSIncl, hpowerSIncl] at h - calc - J (N u.1) = n • J (N w) + - J (N (D.frobeniusPowerSum A K.field L hLK φ.1 n - (fixedFieldInclusion A S E hSE ySraw))) := - sub_eq_iff_eq_add.mp h - _ = _ := add_comm _ _ + 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 @@ -527,20 +598,8 @@ theorem universalNormDescent_mem_finiteUnitNormRange have haKval := congrArg Subtype.val haK have hzKval := congrArg Subtype.val hzK have hrelVal := congrArg Subtype.val hnormRelationE - have h53 := hlemma53 - have h53' : - (N (D.frobeniusPowerSum A K.field L hLK φ.1 n - (fixedFieldInclusion A S E hSE ySraw))).1 = - (relativeNorm A K.field S hSK ySraw).1 := by - have h53' := h53.symm - have hσexp : D.frobeniusExponent KR L hLK σ = n := - D.frobeniusExponent_powerOfDegreeOne KR L hLK φ hφ n hn - rw [hσexp] at h53' - change - (N (D.frobeniusPowerSum A K.field L hLK φ.1 n - (fixedFieldInclusion A S E hSE ySraw))).1 = - (relativeNorm A K.field S hSK ySraw).1 at h53' - exact h53' + 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 @@ -549,77 +608,12 @@ theorem universalNormDescent_mem_finiteUnitNormRange (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] - rw [h53'] - let hPSfinite : Finite - (P.field.toSubgroup ⧸ extensionSubgroup P.field S hSP) := - FiniteIntermediateField.finite_extension_of_le hSK P.below hSP - let : Finite - ((P.toFiniteAbstractField K).field.toSubgroup ⧸ - extensionSubgroup (P.toFiniteAbstractField K).field S hSP) := by - change Finite - (P.field.toSubgroup ⧸ extensionSubgroup P.field S hSP) - exact hPSfinite - let EPS : FiniteAbstractFieldExtension G := - FiniteAbstractFieldExtension.ofInclusion - S (P.toFiniteAbstractField K) hSP - let yP : v.unitAddSubgroup (P.toFiniteAbstractField K) := by - simpa [SF, EPS, FiniteAbstractFieldExtension.ofInclusion, - DegreeData.frobeniusFixedAbstractField] 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 := S - middle := P.field - base := K.field - top_le_middle := hSP - middle_le_base := P.below - finiteTopQuotient := hPSfinite - finiteBaseQuotient := P.finite } - have hnDegree : (EP.degree : ℕ) = n := by - change (EP.toFiniteAbstractExtension.degree : ℕ) = n - rw [EP.toFiniteAbstractExtension.degree_coe] - change - Nat.card - (K.field.toSubgroup ⧸ extensionSubgroup K.field P.field P.below) = n - 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 S 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean index 500da16829..5036df284d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean @@ -121,6 +121,171 @@ variable {D : DegreeData G} {A : Rep ℤ G} 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 @@ -147,12 +312,7 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource 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 + (le_baseField KR.field)) := K.finite let LG := E.toFiniteGaloisSubextension letI : Finite (KR.field.toSubgroup ⧸ @@ -196,28 +356,12 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource 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 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)) := by - change Finite - ((baseField G).toSubgroup ⧸ - extensionSubgroup (baseField G) K.field - (le_baseField K.field)) - exact K.finite + 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 σ @@ -228,10 +372,7 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource 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 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) @@ -250,16 +391,13 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource 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 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 + (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) @@ -269,11 +407,6 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource base := M₀F below := hMM₀ finiteQuotient := hNfinite } - let EM : FiniteAbstractFieldExtension G := - { field := MF - base := K - below := M.below - finiteQuotient := M.finite } let EML : FiniteAbstractFieldExtension G := { field := MF base := L @@ -300,61 +433,16 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource 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) := by - apply Subtype.ext - rfl + bM = fixedFieldInclusion A E.field M.field hML (k • piL + w.1) := rfl have hcM : - cM = fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma) := by - apply Subtype.ext - rfl - have hNormL : - relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) = - fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field E.field E.below (k • piL + w.1)) := by - have h := - D.abstractReciprocity_totallyRamified_relativeNorm_L - A KR LG hLGTot q (k • piL + w.1) - change - relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) = - fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field E.field E.below (k • piL + w.1)) at h - exact h - have hNormSigma : - relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) = - fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) := by - have h := - D.abstractReciprocity_totallyRamified_relativeNorm_sigma - A KR LG hLGTot q (k • piSigma) - change - relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) = - fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) at h - exact h + 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 := by - calc - relativeNorm A M₀ M.field hMM₀ bM = - relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A E.field M.field hML - (k • piL + w.1)) := congrArg _ hbM - _ = - fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field E.field E.below (k • piL + w.1)) := - hNormL - _ = fixedFieldInclusion A K.field M₀ hM₀K - (relativeNorm A K.field Sigma hSigmaK (k • piSigma)) := by - exact congrArg - (fixedFieldInclusion A K.field M₀ hM₀K) hnorm - _ = relativeNorm A M₀ M.field hMM₀ - (fixedFieldInclusion A Sigma M.field hMSigma (k • piSigma)) := - hNormSigma.symm - _ = relativeNorm A M₀ M.field hMM₀ cM := - congrArg _ hcM.symm + 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 ⊢ @@ -367,15 +455,8 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource D.abstractReciprocityTotallyRamifiedLowerGenerator_generates KR LG hLGTot q hq let hNFintype : Fintype N.extensionQuotient := Fintype.ofFinite _ - let hNCyclic : IsCyclic N.extensionQuotient := by - rw [isCyclic_iff_exists_zpowers_eq_top] - refine ⟨g, ?_⟩ - ext x - constructor - · intro _ - exact Subgroup.mem_top x - · intro _ - exact hg x + 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 @@ -391,155 +472,28 @@ theorem abstractReciprocity_cyclicTotallyRamified_fixedSource let aB : B.V := eB.symm (eB₀ aN) let bB : B.V := eB.symm bM let cB : B.V := eB.symm cM - have haNLocal : - B₀.ρ g aN - aN = eB₀.symm (wM - uM) := by - have h := haN - change B₀.ρ g aN - aN = eB₀.symm (wM - uM) at h - exact h - 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 (wM - uM) := 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 (wM - uM)) := - congrArg eB₀ haNLocal - _ = wM - uM := eB₀.apply_symm_apply _ - _ = eB (eB.symm (wM - uM)) := - (eB.apply_symm_apply _).symm - have hbc : bB - cB = B.ρ gB aB - aB := by - rw [hprimitiveB] - apply eB.injective - dsimp only [bB, cB] - simp only [map_sub, AddEquiv.apply_symm_apply] - dsimp only [bM, cM, uM] - abel - have htc : B.ρ tB cB = cB := by - apply eB.injective - apply Subtype.ext - calc - (eB (B.ρ tB cB)).1 = - relativeCosetAction A K.field M.field M.below cM tB := - extensionFixedRepresentation_action_coe - A K.field M.field M.below M.normal tB cB - _ = cM.1 := by - dsimp only [cM] - have hActionNsmul : - relativeCosetAction A K.field M.field M.below - (k • piSigmaM) tB = - k • relativeCosetAction A K.field M.field M.below - piSigmaM tB := by - refine Quotient.inductionOn' tB ?_ - intro t - simp only [relativeCosetAction_mk] - exact map_nsmul (A.ρ t.1) k piSigmaM.1 - rw [hActionNsmul] - congr 1 - have h := - D.abstractReciprocityTotallyRamified_frobenius_fixes_sigma - A KR LG hLGTot q piSigma - change - relativeCosetAction A K.field M.field M.below - (fixedFieldInclusion A Sigma M.field hMSigma piSigma) tB = - (fixedFieldInclusion A Sigma M.field hMSigma piSigma).1 at h - simpa [piSigmaM] using h - _ = (eB cB).1 := rfl + 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 eB.injective - apply Subtype.ext - calc - (eB (B.ρ gB bB)).1 = - relativeCosetAction A K.field M.field M.below bM gB := - extensionFixedRepresentation_action_coe - A K.field M.field M.below M.normal gB bB - _ = relativeCosetAction A K.field M.field M.below bM tB := by - have h := - D.abstractReciprocityTotallyRamified_actions_agree_on_L - A KR LG hLGTot q (k • piL + w.1) - change - relativeCosetAction A K.field M.field M.below - (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) gB = - relativeCosetAction A K.field M.field M.below - (fixedFieldInclusion A E.field M.field hML (k • piL + w.1)) tB at h - rw [hbM] - exact h - _ = (eB (B.ρ tB bB)).1 := by - exact (extensionFixedRepresentation_action_coe - A K.field M.field M.below M.normal tB bB).symm + 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 - 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 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 - 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] + have hvalb : v.valuationAt MF bM = k • v.oneValue := by dsimp only [bM] - rw [map_sub, map_add, map_add, map_nsmul, hpiLM, - wUnitM.2, 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean index 4a39597232..8bac17842f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean @@ -20,7 +20,8 @@ absolute-value completion and mathlib's concrete adic completion gives the local factor comparison used in the adelic restricted-product bridge. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean index a1114b0699..0946d20753 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean @@ -25,7 +25,8 @@ For a finite place `W` of `L`, `finitePlaceBelow W` is its contraction to closure shows that the centres are precisely the finite places above `v`. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean index 563d5e5fd2..4f54101a65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean @@ -229,8 +229,7 @@ noncomputable instance cyclicPrimeDegreeIntermediate_base_isCyclic noncomputable instance cyclicPrimeDegreeIntermediate_top_isCyclic (hdegree : 1 < Module.finrank K L) : IsCyclic - (L ≃ₐ[ - cyclicPrimeDegreeIntermediate + (L ≃ₐ[cyclicPrimeDegreeIntermediate (K := K) (L := L) hdegree] L) := by let P := cyclicPrimeDegreeSubgroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index bc60b10264..714092dd5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -48,8 +48,7 @@ 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 L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] RelativeAdeleRing K M := Algebra.TensorProduct.congr AlgEquiv.refl e diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean index d474b61e55..6e8b75eae1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean @@ -76,8 +76,7 @@ is canonically the scalar extension `(𝔸_K ⊗[K] M) ⊗[K] L`. -/ def pushoutTowerAdeleEquiv : - TowerRelativeAdeleRing K M N ≃ₐ[ - RelativeAdeleRing K M] + TowerRelativeAdeleRing K M N ≃ₐ[RelativeAdeleRing K M] BaseChangedRelativeAdeleRing K M L := by letI : Algebra N (TowerRelativeAdeleRing K M N) := Algebra.TensorProduct.rightAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean index 1e8474f5cb..e7657b741a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean @@ -259,8 +259,7 @@ theorem towerRelativeAdeleUnflatten_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] + TowerRelativeAdeleRing K M L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] RelativeAdeleRing K L := { towerRelativeAdeleRingEquiv K M L with commutes' := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean index c08fd19baa..07901c22d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean @@ -49,8 +49,8 @@ private noncomputable def chosenFinitePlaceLocalizedIntegerUnitsGaloisActionProvider (w₀ : HeightOneSpectrum (𝓞 K)) : MulDistribMulAction - (Gal( - ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) + (Gal(ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) + w₀/ChosenFinitePlaceBaseCompletion (K := K) w₀)) 𝒪[ChosenFinitePlaceLocalizedCompletion (K := K) (L := L) w₀]ˣ := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean index aa4ddc5369..f96f73a2a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean @@ -188,29 +188,29 @@ 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₀), + (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₀)) + (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₀)) + (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₀)) + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean index 129fc864ed..1ff5f257c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -179,8 +179,7 @@ theorem norm_principalIdele (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 ≃ₐ[NumberField.AdeleRing (𝓞 K) K] RelativeAdeleRing K L := Algebra.TensorProduct.congr AlgEquiv.refl σ @@ -216,8 +215,7 @@ theorem conjugation_one change Algebra.TensorProduct.congr (AlgEquiv.refl : - NumberField.AdeleRing (𝓞 K) K ≃ₐ[ - NumberField.AdeleRing (𝓞 K) K] + NumberField.AdeleRing (𝓞 K) K ≃ₐ[NumberField.AdeleRing (𝓞 K) K] NumberField.AdeleRing (𝓞 K) K) (AlgEquiv.refl : L ≃ₐ[K] L) a = a @@ -231,8 +229,7 @@ theorem conjugation_mul 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 ≃ₐ[NumberField.AdeleRing (𝓞 K) K] NumberField.AdeleRing (𝓞 K) K := AlgEquiv.refl have he : e.trans e = e := by @@ -247,8 +244,7 @@ theorem conjugation_mul (Algebra.TensorProduct.congr e τ a) exact congrArg (fun f : - RelativeAdeleRing K L ≃ₐ[ - NumberField.AdeleRing (𝓞 K) K] + RelativeAdeleRing K L ≃ₐ[NumberField.AdeleRing (𝓞 K) K] RelativeAdeleRing K L ↦ f a) h /-- The natural Galois action on relative ideles. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean index cce7303d56..46498743fa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean @@ -248,13 +248,16 @@ theorem finite_adicCompletion_residueField (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 - Valued.integer.properSpace_iff_completeSpace_and_isDiscreteValuationRing_integer_and_finite_residueField.mpr + properSpace_iff_complete_discrete_finite_residue.mpr refine ⟨inferInstance, ?_, finite_adicCompletion_residueField K v⟩ change IsDiscreteValuationRing (v.adicCompletionIntegers K) infer_instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean index f07f094f4d..584b594ee9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean @@ -23,7 +23,8 @@ complete splitting is equivalent both to cardinality one and to local degree one. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean index e7bd7041cd..5498fb8b09 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -17,7 +17,8 @@ These are the place-theoretic ingredients used in the cyclic prime-power and normal-closure splitting reductions. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section @@ -157,9 +158,9 @@ theorem finite_finitePlaceBelow_fibre · 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⟩⟩ + · rintro I ⟨W, hW, rfl⟩ + exact + ⟨W.isPrime, ⟨(congrArg HeightOneSpectrum.asIdeal hW).symm⟩⟩ · intro W₁ _ W₂ _ h apply HeightOneSpectrum.ext exact h diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean index 482033fde4..c920201296 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -30,7 +30,8 @@ the `K`-conjugates of `L`, then `H` has trivial normal core. completely already in `M`. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean index f49d1d18b2..18f99462d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean @@ -22,7 +22,8 @@ and a finite place of `K'` lies above it, then the latter splits completely in `L / K'`. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section @@ -149,8 +150,7 @@ generating subgroup through the finite Galois correspondence. -/ noncomputable instance primeOrderFixedField_isCyclic (hdegree : 1 < Module.finrank K L) : IsCyclic - (L ≃ₐ[ - primeOrderFixedField + (L ≃ₐ[primeOrderFixedField (K := K) (L := L) hdegree] L) := by let P := primeOrderSubgroup @@ -172,8 +172,7 @@ input expected by the cyclic prime-power splitting criterion. -/ theorem primeOrderFixedField_card_aut (hdegree : 1 < Module.finrank K L) : Nat.card - (L ≃ₐ[ - primeOrderFixedField + (L ≃ₐ[primeOrderFixedField (K := K) (L := L) hdegree] L) = fixedFieldPrime (K := K) (L := L) hdegree := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean index 3a96cfb632..de81edfc73 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -14,7 +14,8 @@ 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. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean index a20ebd4b1d..7d32ab2538 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -19,7 +19,8 @@ connects it with the corresponding finite-idele higher-unit conditions, and develops the approximation maps used in ray-class ideal constructions. -/ -open scoped NumberField WithZero open NumberField IsDedekindDomain +open scoped NumberField WithZero +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean index 8a799a3f59..abebdbd8ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean @@ -12,7 +12,8 @@ This file proves the exact sequence from global unit signs through the narrow and ordinary class groups. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean index 1666bdfc37..b6a28d6cbc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -21,7 +21,8 @@ positive generator of an ideal prime to this modulus gives the explicit isomorphism with `(ZMod m)ˣ`. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean index c10980cb8e..c7dae550ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -217,12 +217,10 @@ theorem reducedLog_eq_zero_iff exact hux.symm rw [hxadd] apply Prod.ext - · - simpa using + · simpa using (NumberField.Units.dirichletUnitTheorem.logEmbedding_eq_zero_iff.mpr hu) - · - exact reducedLog_snd_fromNumberFieldUnits + · exact reducedLog_snd_fromNumberFieldUnits (K := K) S u open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean index 472f5aed88..4e0dae0755 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -415,7 +415,6 @@ theorem ideleClassNormQuotient_card_le_actual_tower_mul [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) ≤ @@ -638,7 +637,6 @@ theorem relativeIdeleClassNormQuotient_finite_of_actual_tower [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 @@ -848,6 +846,12 @@ theorem ideleClassNormQuotient_card_le_finrank_abelian (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 @@ -877,14 +881,14 @@ theorem ideleClass_lowDegree_card_eq_finrank_cyclic let : IsCyclic (L ≃ₐ[K] L) := ⟨⟨sigma, hsigma⟩⟩ obtain ⟨hC, hCvalue⟩ := - _root_.GlobalClassFieldTheory.Cohomology.ideleClass_herbrandQuotient_eq_card_of_supported_local_calculation + 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)) - (_root_.GlobalClassFieldTheory.Cohomology.chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + (chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport (K := K) (L := L)) let : Finite diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index c02dfae4d5..f886fbbd84 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -895,7 +895,6 @@ noncomputable def baseFieldUnitAsFixedUnit (K L : Type) [Field K] [Field L] [Algebra K L] - (x : Kˣ) : letI := LocalClassFieldTheory.galoisGroupFieldUnitsMulDistribMulAction K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index f33e07fb1b..07a2254830 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -297,6 +297,9 @@ theorem 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 @@ -372,7 +375,7 @@ theorem (K := K) (L := E) w := by intro w hwAway apply - _root_.GlobalClassFieldTheory.Cohomology.chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport + chosenFinitePlaceIsUnramified_of_notMem_ideleClassHerbrandSupport intro hwSupport have hwS : w ∈ S := by simpa only [S] using hwSupport diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index 4a73e8d49a..ffda2e08ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -205,6 +205,284 @@ theorem relativeIdeleNorm_range_le_allFinitePlaceLocalNormCondition _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 /-- Equality between the power/local-unit subgroup and the everywhere-local norm condition for the Kummer-selected prime set. Starting from an arbitrary @@ -398,236 +676,15 @@ theorem 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 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 - 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 - · have hle : - (powMonoidHom (n : ℕ) : - (w.adicCompletion K)ˣ →* - (w.adicCompletion K)ˣ).range ≤ - _root_.chosenFinitePlaceLocalNormSubgroup - (K := K) (L := M) w := by - simpa only [M] using - chosenSimpleKummerNthPowerSubgroup_le_chosenFinitePlaceLocalNormSubgroup - (K := K) n hnK hmu b w - exact hle (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 - have hsOne : - QuotientGroup.mk' - (IdeleGroup.principalSubgroup K) - (IdeleGroup.principalIdele K (s : Kˣ)) = - 1 := - (QuotientGroup.eq_one_iff - (IdeleGroup.principalIdele K (s : Kˣ))).mpr - ⟨(s : Kˣ), rfl⟩ - change - QuotientGroup.mk' - (IdeleGroup.principalSubgroup K) - (u * (IdeleGroup.principalIdele K (s : Kˣ))⁻¹) = - QuotientGroup.mk' - (IdeleGroup.principalSubgroup K) a - rw [← huq, map_mul, map_inv, hsOne, map_mul, hqOne] - simp + 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 - 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 : @@ -635,34 +692,7 @@ theorem Units.map (algebraMap K M).toMonoidHom b := by simpa only [M, beta] using KummerTheory.chosenSimpleKummerRootUnit_pow K n hnK b - 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 - have hbPower : - b ∈ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range := by - 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean index 3a1cfe52c1..ecb20a65e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -27,6 +27,105 @@ 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 @@ -126,127 +225,21 @@ theorem sUnitKummerCoordinateFixedField (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S i := by - let wi := - sUnitKummerChosenBasePlaces - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i - have hwiT : wi ∈ T := by - change - wi ∈ - Finset.univ.image - (sUnitKummerChosenBasePlaces - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S) - exact - Finset.mem_image.mpr - ⟨i, Finset.mem_univ i, rfl⟩ - let wT : T := ⟨wi, hwiT⟩ - have hlocal : - Units.map - (algebraMap K (wi.adicCompletion K)).toMonoidHom - (x : Kˣ) ∈ - (powMonoidHom (n : ℕ) : - (wi.adicCompletion K)ˣ →* - (wi.adicCompletion K)ˣ).range := by - simpa [wT, wi] using hxLocal wT - have hfixed : - (beta : N) ∈ - IntermediateField.fixedField - (HilbertRamification.absoluteValueDecompositionGroup K - (_root_.chosenFinitePlaceExtension - (L := N) wi).1) := - (KummerTheory.finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField - (K := K) (L := N) wi n hmu (x : Kˣ) beta hbeta).mp - hlocal - rw [ - ← sUnitKummerChosenDecompositionField_eq_coordinateFixedField - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i] - simpa only [_root_.finitePlaceDecompositionGroup] using hfixed + 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 - let Fix : Subgroup R := - MulAction.stabilizer R (beta : N) - have hgeneratorFix - (i : Fin - (sUnitKummerPrimeCount - (K := K) E n hmu r S)) : - sUnitKummerKernelGenerator - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i ∈ - Fix := by - have hbi := hbetaCoordinate i - change - (beta : N) ∈ - IntermediateField.fixedField - (Subgroup.zpowers - ((sUnitKummerKernelGenerator - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i : - R).1)) at hbi - rw [IntermediateField.mem_fixedField_iff] at hbi - have hfix := - hbi - ((sUnitKummerKernelGenerator - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i : - R).1) - (Subgroup.mem_zpowers - ((sUnitKummerKernelGenerator - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i : - R).1)) - rw [show Fix = MulAction.stabilizer R (beta : N) from rfl, - MulAction.mem_stabilizer_iff] - simpa only [ - MulAction.subgroup_smul_def, - AlgEquiv.smul_def] using hfix - have hspan : - (⨆ 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)) ≤ - Fix := by - refine iSup_le ?_ - intro i - exact Subgroup.zpowers_le.mpr (hgeneratorFix i) - have hFixTop : Fix = ⊤ := by - apply top_unique - rw [ - ← iSup_zpowers_sUnitKummerKernelGenerator_eq_top - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S] - exact hspan - have hbetaKernel : - (beta : N) ∈ - IntermediateField.fixedField - (enlargedSUnitKummerRestrictionHom - (K := K) (Omega := Omega) E n hmu - (galois_pow_eq_one_of_equiv_pi_zmod - (K := K) E n r eG) S).ker := by - rw [IntermediateField.mem_fixedField_iff] - intro sigma hsigma - let sigmaR : R := ⟨sigma, hsigma⟩ - have hsigmaFix : sigmaR ∈ Fix := by - rw [hFixTop] - exact Subgroup.mem_top sigmaR - have hfix : - sigmaR • (beta : N) = (beta : N) := by - exact - MulAction.mem_stabilizer_iff.mp - (show - sigmaR ∈ MulAction.stabilizer R (beta : N) by - simpa only [Fix] using hsigmaFix) - simpa only [ - MulAction.subgroup_smul_def, - AlgEquiv.smul_def] using hfix + 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 @@ -262,39 +255,10 @@ theorem change (beta : N) ∈ Set.range (algebraMap E N) at hbetaEmbedded - obtain ⟨gamma, hgamma⟩ := hbetaEmbedded - have hgamma_ne : gamma ≠ 0 := by - intro hgammaZero - apply beta.ne_zero - calc - (beta : N) = algebraMap E N gamma := hgamma.symm - _ = 0 := by rw [hgammaZero, map_zero] - let gammaUnit : Eˣ := - Units.mk0 gamma hgamma_ne - change - (x : Kˣ) ∈ - sUnitFiniteKummerRadical - (K := K) (L := E) n S' - apply - (mem_sUnitFiniteKummerRadical_iff - (K := K) (L := E) n S' (x : Kˣ)).mpr - refine ⟨x.property, gammaUnit, ?_⟩ - apply Units.ext - apply (algebraMap E N).injective - change - algebraMap E N (gamma ^ (n : ℕ)) = - algebraMap E N - (algebraMap K E ((x : Kˣ) : K)) - calc - algebraMap E N (gamma ^ (n : ℕ)) = - (beta : N) ^ (n : ℕ) := by - rw [map_pow, hgamma] - _ = algebraMap K N ((x : Kˣ) : K) := by - simpa using congrArg Units.val hbeta - _ = - algebraMap E N - (algebraMap K E ((x : Kˣ) : K)) := by - rw [IsScalarTower.algebraMap_apply K E N] + 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ˣ) ∈ @@ -305,27 +269,9 @@ theorem (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ˣ) := by - calc - betaN ^ (n : ℕ) = - Units.map (algebraMap E N).toMonoidHom - (betaE ^ (n : ℕ)) := by - rw [map_pow] - _ = - Units.map (algebraMap E N).toMonoidHom - (Units.map (algebraMap K E).toMonoidHom - (x : Kˣ)) := by - rw [hbetaE] - _ = - Units.map (algebraMap K N).toMonoidHom - (x : Kˣ) := by - apply Units.ext - exact - (IsScalarTower.algebraMap_apply - K E N ((x : Kˣ) : K)).symm + 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 @@ -361,37 +307,8 @@ theorem (K := K) (Omega := Omega) E n hmu p v hp hv hn r eG S i) hbetaEmbedded - have hbetaFixed : - (betaN : N) ∈ - IntermediateField.fixedField - (HilbertRamification.absoluteValueDecompositionGroup K - (_root_.chosenFinitePlaceExtension - (L := N) - (sUnitKummerChosenBasePlaces - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i)).1) := by - have hdecomp : - (betaN : 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)) := by - rw [ - sUnitKummerChosenDecompositionField_eq_coordinateFixedField - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i] - exact hbetaCoordinate - simpa only [_root_.finitePlaceDecompositionGroup] using hdecomp - have hlocal := - (KummerTheory.finitePlaceKummerRadicand_mem_nthPowerSubgroup_iff_root_mem_decompositionFixedField - (K := K) (L := N) - (sUnitKummerChosenBasePlaces - (K := K) (Omega := Omega) E n hmu - p v hp hv hn r eG S i) - n hmu (x : Kˣ) betaN hbetaN).mpr - hbetaFixed + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean index dd3b03da22..e6e7615e3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean @@ -19,7 +19,8 @@ modules; this file contains only the global class-field-theoretic conclusion. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean index 4801eb817a..cf9e711d58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean @@ -23,7 +23,8 @@ finite places outside a finite set split completely, then the idele class norm is surjective. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean index 729ce03989..5cc173a992 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -543,6 +543,12 @@ theorem abelianFullConductor_finiteExponent_eq_localConductorExponent (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 @@ -553,10 +559,10 @@ theorem abelianFullConductor_finiteExponent_eq_zero_iff_unramified (K := K) (L := L) v := by rw [abelianFullConductor_finiteExponent_eq_localConductorExponent] rw [← - GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent (K := K) (L := L) v] exact - GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_zero_iff_chosenFinitePlaceIsUnramified + localHigherUnitExponent_eq_zero_iff_unramified (K := K) (L := L) v open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean index 17567063bb..31455dc0aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean @@ -121,6 +121,9 @@ theorem finitePlaceFieldPrincipalUnits_map_eq_localHigherUnitGroup _ = 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 @@ -134,7 +137,7 @@ theorem finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup letI : ValuativeRel vK.Completion := _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v letI : IsNonarchimedeanLocalField vK.Completion := - _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v IsNonarchimedeanLocalField.valuationMap vK.Completion (Additive.ofMul ((_root_.finitePlaceCompletionUnitsContinuousMulEquiv v).symm x)) = @@ -143,7 +146,7 @@ theorem finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup let : ValuativeRel vK.Completion := _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionValuativeRel v let : IsNonarchimedeanLocalField vK.Completion := - _root_.GlobalClassFieldTheory.Reciprocity.finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v + finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v have hxMap : x ∈ (LocalFieldTheory.fieldPrincipalUnits vK.Completion n).map @@ -183,7 +186,7 @@ open scoped Classical in 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_chosenFinitePlaceLocalNormSubgroup_iff_fieldPrincipalUnits_le_localNormSubgroup + localHigherUnitGroup_le_normSubgroup_iff_fieldPrincipalUnits_le_normSubgroup (v : HeightOneSpectrum (𝓞 K)) (n : ℕ) : let vK := HeightOneSpectrum.adicAbv K v let hvK : vK.IsNontrivial := @@ -403,7 +406,7 @@ theorem ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent LocalFieldTheory.localNormSubgroup vK.Completion E := by simpa [vK, hvK, hvKna, w, E] using - (localHigherUnitGroup_le_chosenFinitePlaceLocalNormSubgroup_iff_fieldPrincipalUnits_le_localNormSubgroup + (localHigherUnitGroup_le_normSubgroup_iff_fieldPrincipalUnits_le_normSubgroup (K := K) (L := L) v n) apply le_antisymm · apply diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean index e9de640a6e..4678cfe043 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -36,6 +36,9 @@ local instance bigHilbertArtinIdeleClassGroupIsMulCommutative : 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 @@ -43,7 +46,7 @@ noncomputable def bigHilbertClassFieldEquivOfIsBig E ≃ₐ[K] GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K := by let H := GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K let f := Classical.choice - (GlobalClassFieldTheory.GlobalClassFields.finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + (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 @@ -55,6 +58,9 @@ noncomputable def bigHilbertClassFieldEquivOfIsBig 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 @@ -68,7 +74,7 @@ theorem bigHilbertClassField_ideleClassNorm_range_of_isBig (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := ordinaryIdeleClassNorm_range_algEquiv e _ = _ := - GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_ideleClassNorm_range_over_original + bigHilbertClassField_ideleClassNorm_range_over_original (K := K) open scoped Classical in @@ -97,6 +103,9 @@ noncomputable def arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroupOfIsB 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 @@ -120,7 +129,7 @@ theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResi (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K E c))) = _ have hReciprocity := - GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue (K := K) (L := E) c calc _ = GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassFieldQuotientEquivNarrowClassGroup @@ -138,6 +147,9 @@ theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_globalNormResi _ = _ := 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 @@ -158,7 +170,7 @@ theorem arithmeticBigHilbertClassFieldGaloisEquivNarrowClassGroup_prime K E c := by rw [GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin] exact (DFunLike.congr_fun - (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin (K := K) (L := E)) (IdeleGroup.finitePrimeIdele v)).symm rw [hArtin] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean index 10b2ed8517..4d1664ddc0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -490,7 +490,7 @@ theorem finite conductor ray prime class is equivalent to membership of the prime ideal in the ideal Artin kernel. -/ theorem - narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel_of_card_eq_extensionDegree + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel_of_card_eq_extensionDegree (hcard : Nat.card (RayClass.RayClassGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean index 2e83129b1f..90049b70a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean @@ -44,7 +44,7 @@ variable /-- Maximal cyclic extensions with the same exact narrow finite conductor have the same actual idèle-class norm subgroup. -/ theorem - cyclicIdeleClassNorm_ranges_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees (hconductor : ideleClassNormNarrowFiniteConductor (K := K) (L := L) = ideleClassNormNarrowFiniteConductor (K := K) (L := M)) @@ -67,7 +67,7 @@ theorem RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := - (ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree + (ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree (K := K) (L := L)).2 hLcard _ = RayClass.Modulus.congruenceSubgroup @@ -78,7 +78,7 @@ theorem (RayClass.Modulus.narrowOfFinite f)) hconductor _ = (_root_.ideleClassNorm K M).range := - ((ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree + ((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 @@ -104,7 +104,7 @@ def cyclicNormQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqExten (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K M).range) := QuotientGroup.quotientMulEquivOfEq - (cyclicIdeleClassNorm_ranges_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + (cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees (K := K) (L := L) (M := M) hconductor hLcard hMcard) @@ -165,7 +165,7 @@ theorem have hnorm : (_root_.ideleClassNorm K L).range = (_root_.ideleClassNorm K M).range := - cyclicIdeleClassNorm_ranges_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_extensionDegrees + cyclicIdeleClassNorm_ranges_eq_of_conductors_eq_of_rayClassGroup_cards_eq_extensionDegrees (K := K) (L := L) (M := M) hconductor hLcard hMcard have hdegree : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean index b7b15b42b4..3bf8d39301 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean @@ -47,7 +47,7 @@ variable the congruence subgroup at its exact narrow finite conductor precisely when the corresponding ray class number equals the extension degree. -/ theorem - ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree : + ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_extensionDegree : (_root_.ideleClassNorm K L).range = RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite @@ -60,7 +60,7 @@ theorem simpa only [ ← Subgroup.index_eq_card, ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using - (ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean index 2c0fc53e24..8093860257 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -705,7 +705,6 @@ theorem ideleClassNorm_range_le_of_algHom [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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean index 2254f5c793..d9d8c70ac0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean @@ -178,6 +178,12 @@ theorem arithmeticPrimeArtin_stabilizes_prime (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. -/ @@ -193,16 +199,19 @@ theorem orderOf_arithmeticPrimeArtin_eq_inertiaDegree (GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin (K := K) (L := L) v) = _root_.finitePlaceLocalDegree (K := K) (L := L) v := - GlobalClassFieldTheory.GlobalClassFields.orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + 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) := - GlobalClassFieldTheory.IdealClassFieldTheory.finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified + 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. -/ @@ -214,7 +223,7 @@ theorem arithmeticPrimeArtin_eq_one_iff_splitsCompletely 1 ↔ _root_.FinitePlaceSplitsCompletely (K := K) (L := L) v := - GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + primeArtin_eq_one_iff_splitsCompletely_of_unramified (K := K) (L := L) v (chosenFinitePlaceIsUnramified_of_isUnramifiedIn (K := K) (L := L) v hunram) @@ -314,6 +323,9 @@ theorem arithmeticFrobeniusAt_eq_of_liesOver 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. -/ @@ -434,7 +446,7 @@ theorem arithmeticPrimeArtin_eq_arithmeticFrobeniusAt (K := K) (L := L) v = GlobalClassFieldTheory.GlobalClassFields.chosenFinitePlaceArithmeticFrobenius (K := K) (L := L) v hChosen := - GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius + arithmeticFinitePlacePrimeArtin_eq_chosenFinitePlaceArithmeticFrobenius (K := K) (L := L) v hChosen _ = (δ : G) := hδ.symm _ = arithmeticFrobeniusAt (K := K) W := hδEq @@ -547,22 +559,28 @@ private noncomputable def smallHilbertClassFieldEquiv : 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) := - GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField_finrank_over_original_eq_narrowClassGroup_card + 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 := - GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_finrank_over_original_eq_classNumber + smallHilbertClassField_finrank_over_original_eq_classNumber K /-- The selected big Hilbert class field is unramified at every finite @@ -573,6 +591,9 @@ theorem bigHilbertClassField_unramifiedAtFinitePlaces : 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 @@ -581,7 +602,7 @@ private theorem nonempty_algHom_to_selectedBigHilbertClassField Nonempty (F →ₐ[K] GlobalClassFieldTheory.GlobalClassFields.bigHilbertClassField K) := by obtain ⟨f⟩ := - GlobalClassFieldTheory.GlobalClassFields.finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField + finiteUnramifiedAbelianExtension_nonempty_algHom_bigHilbertClassField K F ((isUnramifiedAtFinitePlaces_iff_original K F).mp hF) exact ⟨f⟩ @@ -638,6 +659,9 @@ theorem smallHilbertClassField_everywhereUnramified : 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 @@ -656,7 +680,7 @@ private theorem nonempty_algHom_to_selectedSmallHilbertClassField (K := K) (L := F) v).1 hv exact hP (hFinite P) exact - @GlobalClassFieldTheory.GlobalClassFields.finiteAbelianExtension_nonempty_algHom_to_smallHilbertClassField_of_everywhereUnramified + @nonempty_algHom_smallHilbertClassField_of_unramified K F inferInstance inferInstance inferInstance inferInstance inferInstance inferInstance inferInstance hF.2 hRamifiedEmpty @@ -723,6 +747,9 @@ noncomputable def smallHilbertClassFieldEquivOfIsSmall (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 @@ -733,7 +760,7 @@ theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal v ↔ FractionalIdealGroup.prime v ∈ (toPrincipalIdeal (𝓞 K) K).range := - GlobalClassFieldTheory.IdealClassFieldTheory.finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal + finitePlaceSplitsCompletelyInSmallHilbertClassField_iff_principal (K := K) v /-- The complete-splitting criterion transfers from the selected small diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean index 980218db7d..b2ea24c537 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -117,6 +117,9 @@ theorem normConductorRayClassModulus_original · 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 @@ -127,7 +130,7 @@ theorem normConductorRayClassModulus_unramifiedOutside IsUnramifiedOutsideModulus K L (normConductorRayClassModulus K L) := by classical have hs := - GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + ideleClassNorm_conductor_support_eq_ramifiedPlaces (K := K) (L := L) constructor · intro v hv Q hQ hlie @@ -218,6 +221,9 @@ theorem normConductorArtin_surjective (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 @@ -247,7 +253,7 @@ theorem normConductorArtin_prime (K := K) (L := L) m' hm (RayClass.primeToModulusIdeal m' v hv') = _ exact - GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean index 1ff3bcb4dd..8861c85afa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -42,7 +42,7 @@ variable 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_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card : + ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card : (_root_.ideleClassNorm K L).range = RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite @@ -148,7 +148,7 @@ def normQuotientEquivNarrowFiniteConductorRayClassGroup (RayClass.Modulus.narrowOfFinite (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := QuotientGroup.quotientMulEquivOfEq - ((ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + ((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 @@ -187,7 +187,7 @@ theorem RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite (ideleClassNormNarrowFiniteConductor (K := K) (L := L))) := - (ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + (ideleClassNorm_range_eq_congruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card (K := K) (L := L)).2 hLcard _ = RayClass.Modulus.congruenceSubgroup @@ -198,7 +198,7 @@ theorem (RayClass.Modulus.narrowOfFinite f)) hconductor _ = (_root_.ideleClassNorm K M).range := - ((ideleClassNorm_range_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_normQuotient_card + ((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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean index e697e67e39..2f09ef8250 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean @@ -29,7 +29,6 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean index cb5cc270b2..7acae2de1e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean @@ -27,7 +27,6 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean index f7b77c3da7..a02bc889f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -275,6 +275,9 @@ noncomputable def rayClassGroupEquivOriginalIdele (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 @@ -291,7 +294,7 @@ theorem rayClassGroupEquivOriginalIdele_prime have hv' : v ∉ m'.finitePart.support := hv let a : RayClass.idelePrimeToModulusSubgroup m' := ⟨IdeleGroup.finitePrimeIdele v, - GlobalClassFieldTheory.GlobalClassFields.finitePrimeIdele_mem_idelePrimeToModulusSubgroup + finitePrimeIdele_mem_idelePrimeToModulusSubgroup m' v hv'⟩ let e := RayClass.rayClassGroupEquivIdealRayClassGroup m' apply e.injective @@ -311,7 +314,7 @@ theorem rayClassGroupEquivOriginalIdele_prime (RayClass.primeToModulusIdeal m' v hv') = RayClass.idealRayProjection m' ⟨IdeleGroup.finitePrimeIdele v, - GlobalClassFieldTheory.GlobalClassFields.finitePrimeIdele_mem_idelePrimeToModulusSubgroup + finitePrimeIdele_mem_idelePrimeToModulusSubgroup m' v hv'⟩ exact (GlobalClassFieldTheory.GlobalClassFields.idealRayProjection_finitePrimeIdele m' v hv').symm @@ -349,6 +352,12 @@ theorem rayClassField_normSubgroup 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 @@ -371,10 +380,10 @@ theorem unramifiedOutsideModulus_of_definingModulus have hfinite := H.narrowFiniteConductor_le hDefining have hinfinite := H.fullConductorInfinitePart_subset_of_isDefiningModulus hDefining have hfiniteSupport := - GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + ideleClassNorm_conductor_support_eq_ramifiedPlaces (K := K) (L := E) have hinfiniteSupport := - GlobalClassFieldTheory.GlobalClassFields.ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus + ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus (K := K) (L := E) constructor · intro v hv Q hQ hlie @@ -524,6 +533,12 @@ 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. -/ @@ -552,7 +567,7 @@ theorem normFullConductor_isAbelianConductor let e : RayClass.RayClassGroup m' ≃* (E ≃ₐ[K] E) := (GlobalClassFieldComparison.rayClassGroupEquivOriginalIdele K m).symm.trans r apply - GlobalClassFieldTheory.GlobalClassFields.rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv + rayModulus_normSubgroup_eq_of_arithmeticPrimeArtinEquiv m' e intro v hv have hvm : v ∉ m.finitePart.support := hv @@ -621,7 +636,7 @@ theorem normFullConductor_isAbelianConductor rw [hR] exact hdef exact ⟨R, - GlobalClassFieldTheory.GlobalClassFields.finiteAbelianExtension_nonempty_algHom_of_normRange_le + finiteAbelianExtension_nonempty_algHom_of_normRange_le (K := K) L R.extension hnormLE⟩ end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index 348f23b0a0..2224d405eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -38,6 +38,9 @@ local instance smallHilbertArtinIdeleClassGroupIsMulCommutative : 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 @@ -51,7 +54,7 @@ theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall (_root_.ideleClassNorm K E).range = (_root_.ideleClassNorm K H).range := ordinaryIdeleClassNorm_range_algEquiv e _ = _ := - GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField_ideleClassNorm_range_over_original + smallHilbertClassField_ideleClassNorm_range_over_original (K := K) open scoped Classical in @@ -86,6 +89,9 @@ noncomputable def arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall (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 @@ -109,7 +115,7 @@ theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K E c))) = _ have hReciprocity := - GlobalClassFieldTheory.Reciprocity.arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue + arithmeticGlobalReciprocityContinuousMulEquiv_globalNormResidue (K := K) (L := E) c calc _ = GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassFieldQuotientEquivClassGroup @@ -127,6 +133,9 @@ theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_globalNormResidue _ = _ := 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 @@ -146,7 +155,7 @@ theorem arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime K E c := by rw [GlobalClassFieldTheory.GlobalClassFields.arithmeticFinitePlacePrimeArtin] exact (DFunLike.congr_fun - (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin + (arithmeticGlobalNormResidueMonoidHom_comp_ideleClassQuotient_eq_globalArtin (K := K) (L := E)) (IdeleGroup.finitePrimeIdele v)).symm rw [hArtin] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean index cdd329f200..408d9bff96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean @@ -31,6 +31,9 @@ variable [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. -/ @@ -52,7 +55,7 @@ theorem Ideal.inertiaDegIn v.asIdeal (𝓞 L) := by rw [ arithmeticIdealArtinGaloisMap_primeIdeal_eq_arithmeticFinitePlacePrimeArtin, - GlobalClassFields.orderOf_arithmeticFinitePlacePrimeArtin_eq_finitePlaceLocalDegree_of_chosenUnramified + orderOf_primeArtin_eq_localDegree_of_unramified (K := K) (L := L) v hunram] exact finitePlaceLocalDegree_eq_inertiaDegree_of_chosenUnramified diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean index e8c50967b4..3ad36c947a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -430,6 +430,9 @@ theorem unramifiedPrime_idealNormDecompositionLaw (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 @@ -454,7 +457,7 @@ theorem GlobalClassFields.arithmeticFinitePlacePrimeArtin (K := K) (L := L) v = 1 := - (GlobalClassFields.arithmeticFinitePlacePrimeArtin_eq_one_iff_splitsCompletely_of_chosenUnramified + (primeArtin_eq_one_iff_splitsCompletely_of_unramified (K := K) (L := L) v hunram).symm _ ↔ arithmeticIdealArtinGaloisMap diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean index ef23fb423a..00d0574b97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -580,7 +580,7 @@ private theorem smallHilbertClassFieldExplicitNormMembershipStatement_proof : K₀.field H N.field hHK hMH hHKnormal hMHnormal c hmembership open scoped Classical in -private noncomputable def +private theorem smallHilbertClassFieldExplicitNormMembershipData_proof : SmallHilbertClassFieldExplicitNormMembershipData K where membership := smallHilbertClassFieldExplicitNormMembershipStatement_proof K @@ -643,7 +643,7 @@ private structure SmallHilbertClassFieldSecondNormRangeContainmentData containment : smallHilbertClassFieldSecondNormRangeContainment K open scoped Classical in -private noncomputable def +private theorem smallHilbertClassFieldSecondNormRangeContainmentData_proof : SmallHilbertClassFieldSecondNormRangeContainmentData K where containment := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean index e7ecc49fdf..6cc439b9d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -40,7 +40,7 @@ local instance RationalFiniteNormTransferInternal.ideleClassSubgroupNormal N /-- Internal finite-norm-class-zero to quotient-zero step. -/ -private noncomputable def +private theorem rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_finiteNormRepresentativeQuotientZero (K H L : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -116,7 +116,7 @@ private noncomputable def simpa only [b] using hincludeCanonical.symm /-- Internal evaluation of the quotient equivalence at zero. -/ -private noncomputable def +private theorem rationalFiniteNormTransferFiniteNormRepresentativeQuotientZero_implies_targetZero (K H L : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -181,7 +181,7 @@ private noncomputable def exact htransportZero.trans e.map_zero /-- Internal quotient-target zero to absolute norm-membership step. -/ -private noncomputable def +private theorem rationalFiniteNormTransferFiniteNormRepresentativeTargetZero_implies_membership (K H L : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) @@ -266,7 +266,7 @@ private noncomputable def /-- Internal replacement of the absolute finite-norm representative by the canonical ordinary extension representative. -/ -private noncomputable def +private theorem rationalFiniteNormTransferFiniteNormRepresentativeMembership_implies_canonicalAbsoluteMembership (K H L : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 34b4021613..8974fa61f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -344,6 +344,13 @@ noncomputable abbrev numberFieldEmbeddedFiniteGaloisSubextension 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 @@ -478,7 +485,7 @@ noncomputable def [FiniteDimensional K L] [IsGalois K L] (j : L →ₐ[ℚ] SeparableClosure ℚ) : (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient ≃* - Gal(L/K) := by + Gal(L / K) := by let i := numberFieldEmbeddedLowerEmbedding K L j letI hAlgebra : Algebra K (SeparableClosure ℚ) := numberFieldEmbeddedSeparableClosureAlgebra K L j @@ -500,7 +507,7 @@ noncomputable def change (H₀.toSubgroup ⧸ CyclicCohomology.extensionSubgroup H₀ J₀ hJH) ≃* - Gal(L/K) + Gal(L / K) exact ambientEmbeddedExtensionQuotientEquivGaloisGroup ℚ K L j e /-- The original lower field is canonically equivalent to the fixed @@ -837,13 +844,13 @@ noncomputable def Additive (Abelianization (numberFieldEmbeddedFiniteGaloisSubextension K L j).extensionQuotient) ≃+ - Additive Gal(L/K) := + Additive Gal(L / K) := MulEquiv.toAdditive ((MulEquiv.abelianizationCongr (numberFieldEmbeddedExtensionQuotientEquivGaloisGroup K L j)).trans (Abelianization.equivOfComm : - Gal(L/K) ≃* - Abelianization Gal(L/K)).symm) + 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 @@ -853,7 +860,7 @@ noncomputable def globalNormResidueEquivOfEmbedding Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive Gal(L/K) := by + Additive Gal(L / K) := by let eNorm : FiniteNormQuotient rationalIdeleClassRepresentation (numberFieldEmbeddedBaseSubgroup K L j) @@ -899,11 +906,11 @@ theorem globalNormResidueEquivOfEmbedding_finiteNormClass compatible embedding. -/ noncomputable def globalNormResidueMonoidHomOfEmbedding (j : L →ₐ[ℚ] SeparableClosure ℚ) : - IdeleClassGroup K →* Gal(L/K) := by + IdeleClassGroup K →* Gal(L / K) := by let e : (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃* - Gal(L/K) := + Gal(L / K) := AddEquiv.toMultiplicative (globalNormResidueEquivOfEmbedding K L j) exact @@ -1092,7 +1099,7 @@ theorem globalNormResidueMonoidHom_eq_ofEmbedding_standard : Additive (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K L).range) ≃+ - Additive (Gal(L/K)) => + Additive (Gal(L / K)) => e (Additive.ofMul (QuotientGroup.mk' (_root_.ideleClassNorm K L).range c))) (globalNormResidueEquiv_eq_ofEmbedding_standard K L) @@ -1285,7 +1292,7 @@ noncomputable def (Abelianization (FiniteGaloisSubextension.extensionQuotient L.toFiniteGaloisExtension)) ≃+ - Additive (Gal(E/F)) := by + Additive (Gal(E / F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1294,7 +1301,7 @@ noncomputable def ℚ (SeparableClosure ℚ) L.below let e : L.extensionQuotient ≃* - Gal(E/F) := + Gal(E / F) := L.extensionQuotientMulEquiv.trans (abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) @@ -1320,7 +1327,7 @@ noncomputable def abstractFixedFieldGlobalNormResidueEquiv : Additive (IdeleClassGroup F ⧸ (_root_.ideleClassNorm F E).range) ≃+ - Additive (Gal(E/F)) := by + Additive (Gal(E / F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1350,9 +1357,9 @@ private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : FiniteNormQuotient rationalIdeleClassRepresentation K.field L.field L.below ≃+ Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below)/(abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := by + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) / + (abstractFixedField ℚ (SeparableClosure ℚ) K.field))) := by letI : AddCommGroup (FiniteNormQuotient rationalIdeleClassRepresentation K.field L.field L.below) := @@ -1366,9 +1373,9 @@ private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : (Abelianization L.toFiniteGaloisExtension.extensionQuotient)) (Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) L.below)/(abstractFixedField ℚ (SeparableClosure ℚ) K.field)))) + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) L.below) / + (abstractFixedField ℚ (SeparableClosure ℚ) K.field)))) inferInstance inferInstance inferInstance (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation @@ -1378,6 +1385,16 @@ private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : (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 @@ -1390,7 +1407,7 @@ noncomputable def ambientFixedGlobalNormResidueAddMonoidHom : ℚ (SeparableClosure ℚ) L.below ambientFixedAddSubgroup rationalIdeleClassRepresentation K.field →+ - Additive (Gal(E/F)) := by + Additive (Gal(E / F)) := by dsimp only let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field @@ -1423,7 +1440,7 @@ noncomputable def abstractFixedFieldGlobalNormResidueMonoidHom : let E := abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below - IdeleClassGroup F →* Gal(E/F) := + IdeleClassGroup F →* Gal(E / F) := (ambientFixedGlobalNormResidueAddMonoidHom K L).toMultiplicative.comp (abstractFixedFieldIdeleClassToAmbientFixedMonoidHom K) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean index 48beeb65d3..77703357b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -274,8 +274,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionRestriction (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) →* Gal(L/K) := @@ -427,8 +426,7 @@ theorem (K := K) (L := L) v hRamified) (infinitePlaceComplexificationOverfield (K := K) (L := L) v)).range) ≃* - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := AddEquiv.toMultiplicative @@ -643,8 +641,7 @@ noncomputable def (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := globalNormResidueMonoidHomOfEmbedding diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean index 02f44cb141..2a4eac8864 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -198,8 +198,7 @@ noncomputable def IdeleClassGroup (ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified) →* - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := QuotientGroup.lift @@ -314,8 +313,7 @@ private noncomputable def (ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) (B := - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))) (_root_.ideleClassNorm @@ -441,8 +439,7 @@ theorem (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) {σ τ : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))} (hσ : σ ≠ 1) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean index 689869eeed..95ebae3882 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -344,8 +344,7 @@ noncomputable instance IntermediateField.subgroupEquivAlgEquiv H let : IsCyclic - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := e.isCyclic.mp @@ -361,8 +360,7 @@ noncomputable def ramifiedInfinitePlaceOverextensionConjugation (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) := IntermediateField.subgroupEquivAlgEquiv @@ -402,8 +400,7 @@ theorem ramifiedInfinitePlaceOverextension_eq_one_or_conjugation (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) (σ : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified))) : σ = 1 ∨ @@ -469,8 +466,7 @@ noncomputable def (v : InfinitePlace K) (hRamified : (chosenInfinitePlaceAbove (L := L) v).IsRamified K) : - Gal( - (infinitePlaceComplexificationOverfield + Gal((infinitePlaceComplexificationOverfield (K := K) (L := L) v)/(ramifiedInfinitePlaceRealFixedField (K := K) (L := L) v hRamified)) →* Gal(rationalComplexificationCyclotomicField/ℚ) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean index 019fb28a48..667a2854ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean @@ -185,11 +185,11 @@ theorem complexFourthRootField_map_complexConjugation : 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 + · 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index a609ab7d3b..4c42e818de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -81,8 +81,7 @@ noncomputable def abstractFixedFieldCyclotomicGalEquivZHat (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : let hI := rationalCyclotomicFieldInertia_le H.field - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) ≃* Multiplicative ZHat := by @@ -99,8 +98,7 @@ noncomputable def abstractFixedFieldCyclotomicGalEquivZHat CyclicCohomology.extensionSubgroup H.field (rationalCyclotomicDegreeData.fieldInertia H.field) hI ≃* - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup @@ -356,8 +354,7 @@ noncomputable def abstractFixedFieldCyclotomicRestriction (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : let hI := rationalCyclotomicFieldInertia_le H.field - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) →* Gal(rationalCyclotomicZHatField/ℚ) := by @@ -374,11 +371,12 @@ noncomputable def abstractFixedFieldCyclotomicRestriction /-- On a quotient representative, cyclotomic restriction of the actual relative automorphism is ordinary restriction of the same ambient absolute-Galois automorphism. -/ -noncomputable local instance - cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal : +theorem cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal : Normal ℚ rationalCyclotomicZHatField := rationalCyclotomicZHatField_isNormal +attribute [local instance] cyclotomicAbstractFixedFieldArtin_cyclotomicZHatFieldNormal + @[simp] theorem abstractFixedFieldCyclotomicRestriction_extensionClass (H : FiniteAbstractField @@ -516,8 +514,7 @@ theorem (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (τ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : @@ -564,8 +561,9 @@ def abstractFixedFieldCyclotomicFiniteCompositum ℚ (SeparableClosure ℚ) H.field ⊔ IntermediateField.lift E.toIntermediateField -noncomputable instance - abstractFixedFieldCyclotomicFiniteCompositum_finiteDimensional +/-- The compositum of the fixed base with a finite cyclotomic layer has finite rational degree. +-/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_finiteDimensional (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -586,8 +584,10 @@ noncomputable instance exact IntermediateField.finiteDimensional_sup F (IntermediateField.lift E.toIntermediateField) -noncomputable instance - abstractFixedFieldCyclotomicFiniteCompositum_numberField +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 : @@ -598,6 +598,8 @@ noncomputable instance NumberField.of_module_finite ℚ (abstractFixedFieldCyclotomicFiniteCompositum H E) +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_numberField + /-- The lower abstract fixed field embedded into its finite cyclotomic compositum. -/ noncomputable def @@ -620,8 +622,7 @@ noncomputable def /-- 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. -/ -noncomputable local instance - abstractFixedFieldCyclotomic_numberField +theorem abstractFixedFieldCyclotomic_numberField (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : NumberField @@ -637,6 +638,8 @@ noncomputable local instance (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 @@ -698,8 +701,8 @@ noncomputable instance (self := abstractFixedFieldCyclotomicFiniteCompositumLayerAlgebra H E) -instance - abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower +/-- The compositum's rational scalars factor through the fixed base embedding. -/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -713,8 +716,10 @@ instance (AlgHom.comp_algebraMap (abstractFixedFieldCyclotomicFiniteCompositumBaseEmbedding H E)).symm -instance - abstractFixedFieldCyclotomicFiniteCompositum_layerScalarTower +attribute [instance] abstractFixedFieldCyclotomicFiniteCompositum_baseScalarTower + +/-- The compositum's rational scalars factor through its finite cyclotomic layer embedding. -/ +theorem abstractFixedFieldCyclotomicFiniteCompositum_layerScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -726,6 +731,8 @@ instance (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 @@ -864,8 +871,7 @@ noncomputable def (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - abstractFixedFieldCyclotomicFiniteCompositum H E ≃ₐ[ - LocalClassFieldTheory.abstractFixedField + abstractFixedFieldCyclotomicFiniteCompositum H E ≃ₐ[LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field] abstractFixedFieldCyclotomicFiniteLayer H E := AlgEquiv.ofRingEquiv @@ -875,8 +881,8 @@ noncomputable def H E)).toRingEquiv) (fun _ => rfl) -noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional +/-- The image of the finite cyclotomic compositum has finite degree over the fixed base. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -889,8 +895,10 @@ noncomputable instance (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer H E).toLinearEquiv.finiteDimensional -noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_numberField +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_finiteDimensional + +/-- The finite layer inside the relative fixed field is a number field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_numberField (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -903,8 +911,10 @@ noncomputable instance ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E) -noncomputable instance - abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois +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 : @@ -931,8 +941,10 @@ noncomputable instance (abstractFixedFieldCyclotomicFiniteCompositumEquivFiniteLayer H E)))) -instance - abstractFixedFieldCyclotomicFiniteLayer_baseScalarTower +attribute [instance] abstractFixedFieldCyclotomicFiniteLayer_isAbelianGalois + +/-- Rational scalars on the finite layer factor through its fixed base field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_baseScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -967,6 +979,8 @@ instance (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 @@ -1012,8 +1026,8 @@ noncomputable instance Algebra.toSMul (self := abstractFixedFieldCyclotomicFiniteLayerLayerAlgebra H E) -instance - abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower +/-- Rational scalars on the finite layer factor through its chosen cyclotomic field. -/ +theorem abstractFixedFieldCyclotomicFiniteLayer_layerScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1025,6 +1039,8 @@ instance (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] @@ -1065,8 +1081,7 @@ theorem abstractFixedFieldCyclotomicFiniteLayer_baseAlgebra_eq_algebra' /-- The finite Galois layer uses its canonical inclusion into the full relative fixed field for the upper scalar action. -/ -instance - abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower +theorem abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1096,6 +1111,8 @@ instance 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 @@ -1141,8 +1158,7 @@ private theorem ℚ rationalCyclotomicZHatField) [Normal ℚ E] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1163,8 +1179,7 @@ private theorem (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1197,8 +1212,7 @@ private theorem ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E)] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1235,8 +1249,7 @@ private theorem ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E)] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1277,8 +1290,7 @@ private theorem ℚ rationalCyclotomicZHatField) [Normal ℚ E] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1328,8 +1340,7 @@ private theorem ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E)] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1389,8 +1400,7 @@ private theorem ℚ (SeparableClosure ℚ) H.field) (abstractFixedFieldCyclotomicFiniteLayer H E)] (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) @@ -1424,8 +1434,7 @@ theorem FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) (σ : - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : @@ -1515,8 +1524,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateBase H) := (cyclotomicAbstractFixedFieldArtinCoordinateBase H).algebra' -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional +/-- The fixed base field of an Artin coordinate has finite degree over the rationals. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : FiniteDimensional ℚ @@ -1524,8 +1533,10 @@ noncomputable local instance LocalClassFieldTheory.abstractFixedField_finiteDimensional ℚ (SeparableClosure ℚ) H.field H.finite -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateBaseFiniteDimensional + +/-- The fixed base field of an Artin coordinate is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateBaseNumberField (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : NumberField @@ -1533,6 +1544,8 @@ noncomputable local instance 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 @@ -1554,8 +1567,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := (cyclotomicAbstractFixedFieldArtinCoordinateRelative H).algebra' -local instance - cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower +/-- Rational scalars act on the relative coordinate field through its fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : IsScalarTower ℚ @@ -1563,8 +1576,10 @@ local instance (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := abstractFixedFieldCyclotomicCompositum_baseScalarTower H -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateRelativeScalarTower + +/-- The relative cyclotomic coordinate field is abelian Galois over its fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) : IsAbelianGalois @@ -1572,6 +1587,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := abstractFixedFieldCyclotomic_isAbelianGalois H +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateRelativeIsAbelianGalois + /-- A finite Galois cyclotomic coordinate carries its intermediate-field rational algebra structure. -/ noncomputable local instance @@ -1582,30 +1599,36 @@ noncomputable local instance Algebra ℚ E := E.toIntermediateField.algebra' -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateNumberField +/-- Each finite rational cyclotomic coordinate is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateNumberField (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : NumberField E := NumberField.of_module_finite ℚ E -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateIsAbelianGalois +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 -local instance - cyclotomicAbstractFixedFieldArtinCoordinateNormal +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 @@ -1631,8 +1654,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := DivisionRing.toRatAlgebra -local instance - cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower +/-- Rational scalars act on a finite coordinate layer through the fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1665,8 +1688,10 @@ local instance (LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) hI) x -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerBaseScalarTower + +/-- The finite Galois coordinate layer over the fixed base is a number field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerNumberField (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1676,6 +1701,8 @@ noncomputable local instance (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 @@ -1700,8 +1727,8 @@ noncomputable local instance (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) := abstractFixedFieldCyclotomicFiniteLayerLayerSMul H E -local instance - cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower +/-- Rational scalars act on a coordinate layer through its finite cyclotomic field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1711,6 +1738,8 @@ local instance (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 @@ -1725,8 +1754,9 @@ noncomputable local instance IntermediateField.toAlgebra (cyclotomicAbstractFixedFieldArtinCoordinateLayer H E) -local instance - cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower +/-- The fixed base acts on the relative coordinate field through each finite coordinate layer. +-/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1738,8 +1768,10 @@ local instance (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := abstractFixedFieldCyclotomicFiniteGaloisLayer_scalarTower H E -noncomputable local instance - cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois +attribute [local instance] cyclotomicAbstractFixedFieldArtinCoordinateLayerRelativeScalarTower + +/-- Each finite coordinate layer is abelian Galois over the fixed base field. -/ +theorem cyclotomicAbstractFixedFieldArtinCoordinateLayerIsAbelianGalois (H : FiniteAbstractField (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (E : @@ -1750,6 +1782,8 @@ noncomputable local instance (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 @@ -1785,7 +1819,8 @@ private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMapData (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - {f : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* + {f : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* Gal(E/ℚ) // f.comp (@globalArtinMonoidHomOfNumberField @@ -1853,7 +1888,8 @@ private noncomputable def cyclotomicAbstractFixedFieldArtinCoordinateMap (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) : - Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* + Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H) →* Gal(E/ℚ) := (cyclotomicAbstractFixedFieldArtinCoordinateMapData H E).1 @@ -1882,7 +1918,8 @@ private theorem cyclotomicAbstractFixedFieldArtinCoordinateMap_apply (E : FiniteGaloisIntermediateField ℚ rationalCyclotomicZHatField) - (σ : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H E/cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : + (σ : Gal(abstractFixedFieldCyclotomicFiniteGaloisLayer H + E/cyclotomicAbstractFixedFieldArtinCoordinateBase H)) : cyclotomicAbstractFixedFieldArtinCoordinateMap H E σ = @IntermediateField.restrictRestrictAlgEquivMapHom ℚ E @@ -2368,8 +2405,7 @@ noncomputable def abstractFixedFieldCyclotomicIdeleClassArtinMonoidHom IdeleClassGroup (LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) →* - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean index 0a31470689..0cfd62f832 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -336,10 +336,10 @@ private noncomputable abbrev CyclicCohomology.extensionSubgroup H.field (rationalCyclotomicDegreeData.fieldInertia H.field) (rationalCyclotomicFieldInertia_le H.field) ≃* - Gal( - abstractRelativeFixedField + Gal(abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) H.field) := + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure + ℚ) H.field) := LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup ℚ (SeparableClosure ℚ) H.field (rationalCyclotomicDegreeData.fieldInertia H.field) @@ -378,8 +378,7 @@ private noncomputable abbrev (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (L : FiniteAbelianSubextension H.field) : L.toFiniteGaloisExtension.extensionQuotient ≃* - Gal( - abstractRelativeFixedField + Gal(abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below/abstractFixedField ℚ (SeparableClosure ℚ) H.field) := L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans (LocalClassFieldTheory.abstractExtensionQuotientEquivGaloisGroup @@ -393,9 +392,9 @@ private theorem cyclotomicUnramifiedGeometricRestriction_apply (L : FiniteAbelianSubextension H.field) (hUnramified : L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) - (σ : Gal( - abstractRelativeFixedField ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : + (σ : Gal(abstractRelativeFixedField ℚ (SeparableClosure ℚ) + (rationalCyclotomicFieldInertia_le H.field)/abstractFixedField ℚ (SeparableClosure ℚ) + H.field)) : abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom H L hUnramified σ = (L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean index cd3b32dc6a..ed027e51d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean @@ -114,8 +114,7 @@ noncomputable def abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom dsimp only let qFinite : L.toFiniteGaloisExtension.extensionQuotient ≃* - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) L.below/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field) := L.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans @@ -145,8 +144,7 @@ theorem abstractFixedFieldCyclotomicFiniteRestrictionMonoidHom_apply (hUnramified : L.toFiniteGaloisExtension.IsUnramified rationalCyclotomicDegreeData) - (σ : Gal( - LocalClassFieldTheory.abstractRelativeFixedField + (σ : Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) (rationalCyclotomicFieldInertia_le H.field)/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) H.field)) : @@ -265,6 +263,9 @@ theorem 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. -/ @@ -330,7 +331,7 @@ theorem Additive.toMul (abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H L z)) - (ClassFormation.ValuationData.normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction + (normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction rationalCyclotomicIdeleClassValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom H L.toFiniteGaloisExtension hUnramified a) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean index 1ee987f2b9..41f7f293f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean @@ -34,8 +34,8 @@ open scoped Classical in 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 ≃ₐ[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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean index efa12526ed..67c91eba1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean @@ -214,6 +214,9 @@ theorem artinFiniteSupportApproximation_finiteComponent_of_notMem 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 @@ -223,7 +226,7 @@ theorem (K := K) (L := L) a)⁻¹ ∈ (RelativeIdeleGroup.norm K L).range := by rw [ - _root_.GlobalClassFieldTheory.ClassFieldAxiom.relativeIdeleNorm_range_eq_allPlaceLocalNormCondition] + relativeIdeleNorm_range_eq_allPlaceLocalNormCondition] constructor · rw [_root_.GlobalClassFieldTheory.ClassFieldAxiom.allFinitePlaceLocalNormCondition] apply Subgroup.mem_iInf.mpr diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index 2da1b44928..52d96d3406 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -338,6 +338,9 @@ theorem globalNormResidueMonoidHom_apply (_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 @@ -412,7 +415,7 @@ theorem globalNormResidueMonoidHom_eq_maximalUnramifiedRestriction Additive.toMul (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L z)) - (ClassFormation.ValuationData.normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction + (normResidueSymbol_finiteNormClass_eq_maximalUnramifiedRestriction rationalCyclotomicIdeleClassValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom H E hUnramified a) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index 2478cbebb1..e52ab8e013 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -939,8 +939,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) : P.toFiniteGaloisExtension.extensionQuotient ≃* - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -979,8 +978,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) : P.toFiniteGaloisExtension.extensionQuotient ≃* - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by exact P.toFiniteGaloisExtension.extensionQuotientMulEquiv.trans @@ -995,8 +993,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) (q : P.toFiniteGaloisExtension.extensionQuotient) : - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionEmbeddedExtensionQuotientEquiv H P q @@ -1007,8 +1004,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) (q : P.toFiniteGaloisExtension.extensionQuotient) : - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionCanonicalExtensionQuotientEquiv H P q @@ -1044,8 +1040,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) (σ : H.field.toSubgroup) : - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1335,8 +1330,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) : P.toFiniteGaloisExtension.extensionQuotient ≃* - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field @@ -1373,8 +1367,7 @@ private noncomputable def (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (P : FiniteAbelianSubextension H.field) (q : P.toFiniteGaloisExtension.extensionQuotient) : - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) := abstractFixedFieldInclusionTransportedExtensionQuotientEquiv H P q @@ -1484,9 +1477,9 @@ private noncomputable def (Abelianization P.toFiniteGaloisExtension.extensionQuotient) ≃+ Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) + H.field))) := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1528,12 +1521,11 @@ private noncomputable def (Abelianization P.toFiniteGaloisExtension.extensionQuotient) ≃+ Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) + H.field))) := by let Q := - Gal( - (abstractRelativeFixedField + Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field)) exact MulEquiv.toAdditive @@ -1550,8 +1542,7 @@ private noncomputable def (z : Additive (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : Additive - (Gal( - (abstractRelativeFixedField + (Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldInclusionTransportedAbelianizedEquiv H P z @@ -1565,8 +1556,7 @@ private noncomputable def (z : Additive (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : Additive - (Gal( - (abstractRelativeFixedField + (Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldInclusionTransportedCanonicalAbelianizedEquiv H P z @@ -1580,8 +1570,7 @@ private noncomputable def (z : Additive (Abelianization P.toFiniteGaloisExtension.extensionQuotient)) : Additive - (Gal( - (abstractRelativeFixedField + (Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := abstractFixedFieldAbelianizedExtensionQuotientEquivGaloisGroup H P z @@ -1751,9 +1740,9 @@ private noncomputable def (IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) + := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1783,9 +1772,9 @@ private noncomputable def (IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : Additive - (Gal( - (abstractRelativeFixedField - ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := by + (Gal((abstractRelativeFixedField + ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) + := by let F := abstractFixedField ℚ (SeparableClosure ℚ) H.field let E := @@ -1827,8 +1816,7 @@ private noncomputable def (IdeleClassGroup (abstractFixedField ℚ (SeparableClosure ℚ) H.field))) : Additive - (Gal( - (abstractRelativeFixedField + (Gal((abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below)/(abstractFixedField ℚ (SeparableClosure ℚ) H.field))) := rationalFiniteNormResidueValue H P.toFiniteGaloisExtension (rationalAbstractFixedFieldIdeleClassEquivFixed H.field) @@ -2266,7 +2254,6 @@ noncomputable local instance local instance numberFieldEmbeddedBaseChangeRelativeFixedFieldScalarTower - (j : L' →ₐ[ℚ] SeparableClosure ℚ) : IsScalarTower ℚ (abstractFixedField ℚ (SeparableClosure ℚ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index 68e296d43c..8f7f136ed0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -453,8 +453,7 @@ noncomputable def numberFieldTowerFinitePadicAuxiliaryAutomorphism let S := numberFieldTowerFinitePadicCyclicFixedSubgroup (K := K) (L := L) p τ - Gal( - LocalClassFieldTheory.abstractRelativeFixedField + Gal(LocalClassFieldTheory.abstractRelativeFixedField ℚ (SeparableClosure ℚ) P.below/LocalClassFieldTheory.abstractFixedField ℚ (SeparableClosure ℚ) S) := by dsimp only diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index ba9ddeeefd..734a1b20eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -723,6 +723,9 @@ private noncomputable def finitePlacePrimeIdealPowerResidueFactorResidueValue 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. -/ @@ -759,7 +762,7 @@ private theorem finitePlaceLocalTamePowerResidueSymbol_residueValue_eq rw [finitePlace_localNthRootsReduction_integralRoots] rw [← AlgebraicNumberTheory.PowerResidueSymbols.rootsOfUnityReductionEquiv_apply K v n hmu hcoprime, - AlgebraicNumberTheory.PowerResidueSymbols.rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol + rootsOfUnityReductionEquiv_primeIdealPowerResidueSymbol K v n hmu hcoprime a ha] rw [finitePlace_integerUnitsToResidueUnits_integralUnit] exact congrArg (fun u : 𝓀[C]ˣ => (u : 𝓀[C])) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 3dc3b107ce..5fb529f5a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -104,21 +104,21 @@ private theorem mappedAbelianLocalArtin_eq_frobenius_zpow open scoped Classical in /-- The prime subtype supplies the primality instance used at this local factor. -/ -local instance rationalCyclotomicFinitePlaceArtinPrimeFact (q : Nat.Primes) : Fact q.1.Prime := +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. -/ -local instance rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := +theorem rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero (m : ℕ+) : NeZero (m : ℕ) := ⟨m.ne_zero⟩ attribute [local instance] rationalCyclotomicFinitePlaceArtinPositiveLevelNeZero open scoped Classical in -noncomputable local instance - rationalCyclotomicLevelFiniteDimensional +/-- A finite rational cyclotomic level has finite degree over the rationals. -/ +theorem rationalCyclotomicLevelFiniteDimensional (m : ℕ+) : FiniteDimensional ℚ (KummerTheory.rationalCyclotomicLevel m) := @@ -128,8 +128,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicLevelFiniteDimensional open scoped Classical in -noncomputable local instance - rationalCyclotomicLevelIsAbelianGalois +/-- A rational cyclotomic level is an abelian Galois extension of the rationals. -/ +theorem rationalCyclotomicLevelIsAbelianGalois (m : ℕ+) : IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel m) := by @@ -164,7 +164,8 @@ noncomputable local instance rationalFinitePlaceBaseNontriviallyNormedField attribute [local instance] rationalFinitePlaceBaseNontriviallyNormedField open scoped Classical in -noncomputable local instance rationalFinitePlaceBaseLocallyCompactSpace +/-- The completion of the rationals at a finite prime is locally compact. -/ +theorem rationalFinitePlaceBaseLocallyCompactSpace (q : Nat.Primes) : LocallyCompactSpace (HeightOneSpectrum.adicAbv ℚ @@ -176,7 +177,8 @@ noncomputable local instance rationalFinitePlaceBaseLocallyCompactSpace attribute [local instance] rationalFinitePlaceBaseLocallyCompactSpace open scoped Classical in -noncomputable local instance rationalFinitePlaceBaseIsUltrametricDist +/-- The metric on the rational prime completion satisfies the ultrametric inequality. -/ +theorem rationalFinitePlaceBaseIsUltrametricDist (q : Nat.Primes) : IsUltrametricDist (HeightOneSpectrum.adicAbv ℚ @@ -249,8 +251,8 @@ noncomputable local instance rationalFinitePlaceBaseValuationCompatible attribute [local instance] rationalFinitePlaceBaseValuationCompatible open scoped Classical in -noncomputable local instance - rationalFinitePlaceBaseValuativeRelIsNontrivial +/-- The valuation relation on the rational prime completion is nontrivial. -/ +theorem rationalFinitePlaceBaseValuativeRelIsNontrivial (q : Nat.Primes) : ValuativeRel.IsNontrivial (HeightOneSpectrum.adicAbv ℚ @@ -265,7 +267,8 @@ noncomputable local instance attribute [local instance] rationalFinitePlaceBaseValuativeRelIsNontrivial open scoped Classical in -noncomputable local instance rationalFinitePlaceBaseIsValuativeTopology +/-- The topology of the rational prime completion is induced by its valuation relation. -/ +theorem rationalFinitePlaceBaseIsValuativeTopology (q : Nat.Primes) : IsValuativeTopology (HeightOneSpectrum.adicAbv ℚ @@ -277,8 +280,8 @@ noncomputable local instance rationalFinitePlaceBaseIsValuativeTopology attribute [local instance] rationalFinitePlaceBaseIsValuativeTopology open scoped Classical in -noncomputable local instance - rationalFinitePlaceBaseIsNonarchimedeanLocalField +/-- The rational prime completion is a nonarchimedean local field. -/ +theorem rationalFinitePlaceBaseIsNonarchimedeanLocalField (q : Nat.Primes) : IsNonarchimedeanLocalField (HeightOneSpectrum.adicAbv ℚ @@ -286,6 +289,8 @@ noncomputable local instance 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. -/ @@ -1125,8 +1130,9 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedGlobalSMul open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedScalarTower +/-- Rational scalar multiplication factors through the base prime completion on the localized +cyclotomic field. -/ +theorem rationalCyclotomicArtinLocalizedScalarTower (m : ℕ+) (q : Nat.Primes) : IsScalarTower ℚ (rationalCyclotomicArtinBaseAbv q).Completion @@ -1139,8 +1145,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedScalarTower open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedFiniteDimensional +/-- The localized cyclotomic field is finite dimensional over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedFiniteDimensional (m : ℕ+) (q : Nat.Primes) : FiniteDimensional (rationalCyclotomicArtinBaseAbv q).Completion @@ -1153,8 +1159,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedFiniteDimensional open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsAbelianGalois +/-- The localized cyclotomic field is abelian Galois over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedIsAbelianGalois (m : ℕ+) (q : Nat.Primes) : IsAbelianGalois (rationalCyclotomicArtinBaseAbv q).Completion @@ -1169,8 +1175,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIsAbelianGalois open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsSeparable +/-- The localized cyclotomic extension is separable over the base prime completion. -/ +theorem rationalCyclotomicArtinLocalizedIsSeparable (m : ℕ+) (q : Nat.Primes) : Algebra.IsSeparable (rationalCyclotomicArtinBaseAbv q).Completion @@ -1180,8 +1186,9 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIsSeparable open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsCyclotomic +/-- 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 @@ -1192,8 +1199,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIsCyclotomic open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinExtensionFiniteDimensional +/-- The completed cyclotomic extension is finite dimensional over the base prime completion. -/ +theorem rationalCyclotomicArtinExtensionFiniteDimensional (m : ℕ+) (q : Nat.Primes) : FiniteDimensional (rationalCyclotomicArtinBaseAbv q).Completion @@ -1207,8 +1214,9 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinExtensionFiniteDimensional open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinExtensionContinuousSMul +/-- Scalar multiplication by the base prime completion is continuous on the completed extension. +-/ +theorem rationalCyclotomicArtinExtensionContinuousSMul (m : ℕ+) (q : Nat.Primes) : ContinuousSMul (rationalCyclotomicArtinBaseAbv q).Completion @@ -1222,8 +1230,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinExtensionContinuousSMul open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinExtensionLocallyCompact +/-- The completion of the chosen cyclotomic prime extension is locally compact. -/ +theorem rationalCyclotomicArtinExtensionLocallyCompact (m : ℕ+) (q : Nat.Primes) : LocallyCompactSpace (rationalCyclotomicArtinExtension m q).1.Completion := @@ -1249,8 +1257,8 @@ private noncomputable def Isometry.of_dist_eq fun _ _ => rfl } open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedLocallyCompact +/-- The localized cyclotomic field is locally compact. -/ +theorem rationalCyclotomicArtinLocalizedLocallyCompact (m : ℕ+) (q : Nat.Primes) : LocallyCompactSpace (rationalCyclotomicArtinLocalizedField m q) := @@ -1260,8 +1268,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedLocallyCompact open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsUltrametricDist +/-- The metric on the localized cyclotomic field satisfies the ultrametric inequality. -/ +theorem rationalCyclotomicArtinLocalizedIsUltrametricDist (m : ℕ+) (q : Nat.Primes) : IsUltrametricDist (rationalCyclotomicArtinLocalizedField m q) := @@ -1345,8 +1353,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedValuationIsNontrivial open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial +/-- The valuation relation on the localized cyclotomic field is nontrivial. -/ +theorem rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial (m : ℕ+) (q : Nat.Primes) : ValuativeRel.IsNontrivial (rationalCyclotomicArtinLocalizedField m q) := @@ -1357,8 +1365,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedValuativeRelIsNontrivial open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsValuativeTopology +/-- The localized cyclotomic topology is induced by its valuation relation. -/ +theorem rationalCyclotomicArtinLocalizedIsValuativeTopology (m : ℕ+) (q : Nat.Primes) : IsValuativeTopology (rationalCyclotomicArtinLocalizedField m q) := @@ -1368,8 +1376,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIsValuativeTopology open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField +/-- The localized cyclotomic field is a nonarchimedean local field. -/ +theorem rationalCyclotomicArtinLocalizedIsNonarchimedeanLocalField (m : ℕ+) (q : Nat.Primes) : IsNonarchimedeanLocalField (rationalCyclotomicArtinLocalizedField m q) := @@ -1394,8 +1402,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIntegerAlgebra open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIsIntegralClosure +/-- 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] @@ -1412,8 +1420,8 @@ noncomputable local instance attribute [local instance] rationalCyclotomicArtinLocalizedIsIntegralClosure open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedIntegerModuleFinite +/-- 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] @@ -1432,8 +1440,9 @@ This section reuses the canonical finite-place Artin tower above. In particular, it introduces no parallel completion/localization instance tower. -/ open scoped Classical in -noncomputable local instance - rationalCyclotomicPrincipalPrimeLevelIsCyclotomicExtension +/-- 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 @@ -1502,8 +1511,9 @@ private noncomputable def rationalFinitePlaceCompletionAlgEquivPadic (rationalFinitePlaceCompletionRingEquivPadic_algebraMap p) open scoped Classical in -noncomputable local instance - rationalCyclotomicArtinLocalizedPadicScalarTower +/-- 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 @@ -1626,8 +1636,9 @@ attribute [local instance] rationalCyclotomicPrincipalPrimePadicLevelFiniteDimensional open scoped Classical in -noncomputable local instance - rationalCyclotomicPrincipalPrimePadicLevelIsAbelianGalois +/-- 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) := @@ -1800,8 +1811,7 @@ open scoped Classical in private theorem rationalCyclotomicPrincipalPrime_galEquivZMod_eq_of_action (p : Nat.Primes) (n : ℕ) - (sigma : Gal( - rationalCyclotomicPrincipalPrimeLevel + (sigma : Gal(rationalCyclotomicPrincipalPrimeLevel (rationalCyclotomicPrincipalPrimeModulus p n)/ℚ)) (a : (ZMod (p.1 ^ (n + 1)))ˣ) (haction : @@ -2601,8 +2611,7 @@ private noncomputable def rationalCyclotomicArtinLocalFrobeniusOf IsNonarchimedeanLocalField.IsUnramifiedValuedExtension (rationalCyclotomicArtinBaseAbv q).Completion (rationalCyclotomicArtinLocalizedField m q)) : - rationalCyclotomicArtinLocalizedField m q ≃ₐ[ - (rationalCyclotomicArtinBaseAbv q).Completion] + rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] rationalCyclotomicArtinLocalizedField m q := by letI := hUnramified exact arithmeticFrobeniusOfUnramifiedValuation @@ -2613,8 +2622,7 @@ 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 ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] rationalCyclotomicArtinLocalizedField m q := rationalCyclotomicArtinLocalFrobeniusOf m q (rationalCyclotomicArtinUnramified m q hq) @@ -2624,8 +2632,7 @@ private noncomputable def rationalCyclotomicArtinDecompositionEquiv (m : ℕ+) (q : Nat.Primes) : absoluteValueDecompositionGroup ℚ (rationalCyclotomicArtinExtension m q).1 ≃* - (rationalCyclotomicArtinLocalizedField m q ≃ₐ[ - (rationalCyclotomicArtinBaseAbv q).Completion] + (rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] rationalCyclotomicArtinLocalizedField m q) := decompositionGroupEquivAlgebraicLocalizationAut (rationalCyclotomicArtinBaseAbv q) @@ -2636,8 +2643,7 @@ private noncomputable def rationalCyclotomicArtinDecompositionEquiv open scoped Classical in private noncomputable def rationalCyclotomicArtinLocalToGlobalMonoidHom (m : ℕ+) (q : Nat.Primes) : - (rationalCyclotomicArtinLocalizedField m q ≃ₐ[ - (rationalCyclotomicArtinBaseAbv q).Completion] + (rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] rationalCyclotomicArtinLocalizedField m q) →* (rationalCyclotomicArtinLevel m ≃ₐ[ℚ] rationalCyclotomicArtinLevel m) := @@ -2650,8 +2656,7 @@ 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 ≃ₐ[(rationalCyclotomicArtinBaseAbv q).Completion] rationalCyclotomicArtinLocalizedField m q := finitePlaceLocalArtinMonoidHom (K := ℚ) (L := rationalCyclotomicArtinLevel m) @@ -2987,8 +2992,8 @@ private theorem rationalCyclotomicArtinFrobeniusLift_localization (rationalCyclotomicArtinExtension m q).2 (rationalCyclotomicLevelPrimitiveRoot m)) := congrArg - (fun σ : rationalCyclotomicArtinLocalizedField m q ≃ₐ[ - (rationalCyclotomicArtinBaseAbv q).Completion] + (fun σ : rationalCyclotomicArtinLocalizedField m q ≃ₐ[(rationalCyclotomicArtinBaseAbv + q).Completion] rationalCyclotomicArtinLocalizedField m q => σ (AbsoluteValue.toAlgebraicLocalization (rationalCyclotomicArtinBaseAbv q) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 68dcd1fbfb..210e20b32f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -311,8 +311,7 @@ theorem rationalCyclotomicPrincipalFinitePlaceCharacter_at_prime_succ_formula rfl have hInput := hSpec.trans (hFactor.trans hLocal) have hCharacter := congrArg - (fun sigma : Gal( - KummerTheory.rationalCyclotomicLevel + (fun sigma : Gal(KummerTheory.rationalCyclotomicLevel ⟨p.1 ^ (n + 1), pow_pos p.2.pos (n + 1)⟩/ℚ) => IsCyclotomicExtension.Rat.galEquivZMod (p.1 ^ (n + 1)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index 97af3777ad..e88e5621a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -443,6 +443,9 @@ private theorem rationalCyclotomicRayNormAwayChosenFinitePlaceArtin_eq_one 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. -/ @@ -463,7 +466,7 @@ private theorem (RayClass.rationalPrime q)).symm x)) = 0 exact - _root_.GlobalClassFieldTheory.GlobalClassFields.finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup + finitePlaceCompletion_valuationMap_eq_zero_of_mem_localHigherUnitGroup (K := ℚ) (RayClass.rationalPrime q) n x hx open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index 6126c047ff..52b7236789 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -52,7 +52,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming valuationSubringUnitsToFieldUnits_mem_unitGroup -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 3dc6c681c4..158a289257 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -184,14 +184,12 @@ cyclotomic level inside the fixed rational separable closure. -/ noncomputable def rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup : - Gal( - KummerTheory.rationalCyclotomicLevel + Gal(KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* RayClass.RayClassGroup (RayClass.rationalModulus m) := by exact (commutativeGroupInversionContinuousMulEquiv - (Gal( - KummerTheory.rationalCyclotomicLevel + (Gal(KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩/ℚ))).trans (rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index f7123af2f0..6c5f619c4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -209,8 +209,8 @@ local instance rationalRayClassFieldCyclotomicRationalLevelNeZero : NeZero (m : attribute [local instance] rationalRayClassFieldCyclotomicRationalLevelNeZero open scoped Classical in -noncomputable /-- The rational cyclotomic level is a number field. -/ -local instance rationalRayClassFieldCyclotomicLevelNumberField : +/-- The rational cyclotomic level is a number field. -/ +noncomputable local instance rationalRayClassFieldCyclotomicLevelNumberField : NumberField (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := @@ -220,8 +220,8 @@ local instance rationalRayClassFieldCyclotomicLevelNumberField : attribute [local instance] rationalRayClassFieldCyclotomicLevelNumberField open scoped Classical in -noncomputable /-- The rational cyclotomic level is an abelian Galois extension of the rationals. -/ -local instance rationalRayClassFieldCyclotomicLevelAbelianGalois : +/-- The rational cyclotomic level is an abelian Galois extension of the rationals. -/ +noncomputable local instance rationalRayClassFieldCyclotomicLevelAbelianGalois : IsAbelianGalois ℚ (KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩) := @@ -446,8 +446,7 @@ group modulo `(m)`, transported along the exact norm-range equality. -/ noncomputable def rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup : - Gal( - KummerTheory.rationalCyclotomicLevel + Gal(KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩/ℚ) ≃ₜ* RayClass.RayClassGroup (RayClass.rationalModulus m) := galoisContinuousMulEquivRayClassGroupOfNormRangeEq @@ -465,8 +464,7 @@ transport. -/ theorem rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup_apply (σ : - Gal( - KummerTheory.rationalCyclotomicLevel + Gal(KummerTheory.rationalCyclotomicLevel ⟨m, NeZero.pos m⟩/ℚ)) : rationalCyclotomicLevelGaloisContinuousMulEquivRayClassGroup m σ = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean index bc71bedcb3..ade303c0c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean @@ -275,8 +275,7 @@ theorem primeCyclotomicPushout_isCyclic primeCyclotomicPushout_isGalois K L p hp hdegree IsCyclic - (PrimeCyclotomicPushout K L p ≃ₐ[ - PrimeCyclotomicBase K p] + (PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] PrimeCyclotomicPushout K L p) := by let : NeZero p := ⟨hp.ne_zero⟩ let : Field (PrimeCyclotomicPushout K L p) := @@ -314,8 +313,7 @@ noncomputable def primeCyclotomicPushoutGalEquivPiZMod (PrimeCyclotomicPushout K L p) := primeCyclotomicPushout_isGalois K L p hp hdegree - (PrimeCyclotomicPushout K L p ≃ₐ[ - PrimeCyclotomicBase K p] + (PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] PrimeCyclotomicPushout K L p) ≃* (Fin 1 → Multiplicative (ZMod p)) := by letI : NeZero p := ⟨hp.ne_zero⟩ @@ -331,8 +329,7 @@ noncomputable def primeCyclotomicPushoutGalEquivPiZMod primeCyclotomicPushout_isGalois K L p hp hdegree let G := - PrimeCyclotomicPushout K L p ≃ₐ[ - PrimeCyclotomicBase K p] + PrimeCyclotomicPushout K L p ≃ₐ[PrimeCyclotomicBase K p] PrimeCyclotomicPushout K L p letI : IsCyclic G := primeCyclotomicPushout_isCyclic diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean index e18873b6d7..a7743ff72a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -21,7 +21,8 @@ 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. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean index 0334376997..5534f209ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean @@ -25,7 +25,8 @@ generating the full extension is used to kill the full inertia group away from `S`. -/ -open scoped NumberField open NumberField IsDedekindDomain +open scoped NumberField +open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open HilbertRamification open HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean index 94214c212c..c7b5c6daa5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -454,8 +454,7 @@ theorem enlargedSUnitKummerCyclicFixedField_isCyclic ((fullSUnitKummerExtension (K := K) (Omega := Omega) n (enlargeByFiniteKummerRadicalSupport - (K := K) (L := E) n hmu S)) ≃ₐ[ - enlargedSUnitKummerCyclicFixedField + (K := K) (L := E) n hmu S)) ≃ₐ[enlargedSUnitKummerCyclicFixedField (K := K) (Omega := Omega) E n hmu hexponent S sigma] (fullSUnitKummerExtension diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean index 440dba26d7..877a9d813f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean @@ -84,8 +84,8 @@ noncomputable def rightCosetCompletionAlgEquiv 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 + (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 @@ -97,8 +97,7 @@ noncomputable def rightCosetCompletionAlgEquiv (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 := + (rightCosetExtensionEquiv vK hvK w q).1.Completion ≃ₐ[vK.Completion] w.1.Completion := { conjugateExtensionCompletionRingEquiv vK w (Quotient.out q) with commutes' := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean index 22db1aebfb..68fab938b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -143,6 +143,9 @@ theorem uniformizerPrincipalSubgroup_le_normSubgroup_cyclotomic_odd · 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 @@ -159,7 +162,7 @@ theorem localNormSubgroup_eq_uniformizerPrincipalSubgroup_cyclotomicPrimePower_o ⟨pow_ne_zero _ (Fact.out : Nat.Prime p).ne_zero⟩ let : IsCyclotomicExtension {n} ℚ_[p] L := by simpa [n] using - AlgebraicNumberTheory.Valuations.padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top zeta hzeta hgen + padic_isCyclotomicExtension_of_primitiveRoot_adjoin_eq_top zeta hzeta hgen let : FiniteDimensional ℚ_[p] L := IsCyclotomicExtension.finiteDimensional {n} ℚ_[p] L let : IsAbelianGalois ℚ_[p] L := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index 7f34a1b222..b1f6fcec51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -228,13 +228,13 @@ closure. -/ noncomputable def localAbstractFixedResidueActionOverIntermediateField (H : ClosedSubgroup (Gal(SeparableClosure K/K))) : H.toSubgroup →* - (selectedResidueField (localSeparableValuationSubring K) ≃ₐ[ - localAbstractFixedResidueIntermediateField K H] + (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) ≃ₐ[decompositionResidueField K + (localSeparableValuationSubring K)] selectedResidueField (localSeparableValuationSubring K)) := (localSeparableResidueAlgAction K).toMonoidHom.comp H.toSubgroup.subtype let rhoF : H.toSubgroup →* F.fixingSubgroup := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index d4f1bf9469..36717ad347 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -801,7 +801,8 @@ noncomputable def baseNormResidueMap (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 + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean index 3a776fcc72..57542dbeeb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean @@ -8,6 +8,7 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All 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..0a32f7a444 --- /dev/null +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.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 +-/ + +import Mathlib.FieldTheory.Galois.Basic +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue +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. +-/ + +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 index 76704ab9d2..ba31fdf9f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -9,10 +9,10 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport /-! # Ambient prime witnesses +import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget -This module constructs the ambient norm-residue value, a valuation-one -prime witness for each abelianized Galois element, and the corresponding -ambient Frobenius target. +This module constructs a valuation-one prime witness for each abelianized Galois element +using the corresponding intrinsic Frobenius lift. -/ noncomputable section @@ -23,45 +23,6 @@ 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] - /-- A prime-norm unit in the intrinsic base field chosen from a Frobenius lift of an abelianized Galois element. -/ noncomputable def ambientEmbeddedPrimeWitness @@ -253,108 +214,4 @@ noncomputable def ambientEmbeddedPrimeWitness exact normUnits F LF pF -/-- 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/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 981598ad3c..a305ee5b6a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -736,8 +736,7 @@ 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) : + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) : letI : FiniteDimensional K (finiteFixedField K H) := abstractFixedField_finiteDimensional @@ -809,8 +808,7 @@ private theorem exists_abstractFixedFieldResidueEquiv [IsNonarchimedeanLocalField (finiteFixedField K H)] [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation (finiteFixedField K H))] - (e : SeparableClosure (finiteFixedField K H) ≃ₐ[ - finiteFixedField K H] SeparableClosure K) : + (e : SeparableClosure (finiteFixedField K H) ≃ₐ[finiteFixedField K H] SeparableClosure K) : ∃ tau : decompositionResidueField (finiteFixedField K H) (localSeparableValuationSubring K) ≃+* @@ -943,8 +941,7 @@ private theorem residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEq (ValuativeRel.valuation (finiteFixedField K H))] [Fintype (decompositionResidueField (finiteFixedField K H) (localSeparableValuationSubring K))] - (e : SeparableClosure (finiteFixedField K H) ≃ₐ[ - finiteFixedField K H] SeparableClosure 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) = ⊤) @@ -1037,8 +1034,7 @@ 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) + (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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index 33cffbab94..d006403f1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -389,8 +389,8 @@ private theorem localSeparableResidueAlgAction_continuous : /-- 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) ≃ₐ[decompositionResidueField K + (localSeparableValuationSubring K)] selectedResidueField (localSeparableValuationSubring K)) where toMonoidHom := residueAlgActionOfEqTop K diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean index 85e0b63fd7..b7a29feb35 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -39,7 +39,8 @@ open Polynomial variable (k : Type u) [Field k] [Fintype k] -private instance finiteFieldRingCharPrime : Fact (ringChar k).Prime := +omit [Fintype k] in +private instance finiteFieldRingCharPrime [Finite k] : Fact (ringChar k).Prime := ⟨CharP.char_is_prime k (ringChar k)⟩ private noncomputable instance absoluteGaloisGroupT2 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean index 24369a73be..e5f407fda0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean @@ -39,13 +39,16 @@ variable (k : Type u) [Field k] [Fintype k] variable (Omega : Type v) [Field Omega] [Algebra k Omega] [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] -private instance finiteResidueBaseRingCharPrime : Fact (ringChar k).Prime := +omit [Fintype k] in +private instance finiteResidueBaseRingCharPrime [Finite k] : Fact (ringChar k).Prime := ⟨CharP.char_is_prime k (ringChar k)⟩ private instance residueAlgebraicClosureIsAlgClosure : IsAlgClosure k Omega := ⟨inferInstance, inferInstance⟩ -private instance residueAlgebraicClosureIsGalois : IsGalois k Omega := by +omit [Fintype k] in +private instance residueAlgebraicClosureIsGalois [Finite k] : IsGalois k Omega := by + let := Fintype.ofFinite k infer_instance private instance residueAlgebraicClosureGaloisT2 : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean index d577384cbc..2183964d3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -48,8 +48,8 @@ theorem prod_embeddings_algebraMap_powerBasisGen_eq 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 σ _ => ?_ + · 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean index ad368e41f2..4cecfcc008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -216,8 +216,7 @@ instance absoluteFiniteQuotientField_isAbelianGalois 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 + · exact (absoluteFiniteQuotientEquiv K N).symm.injective (by simp only [map_mul] exact hquotient_comm ((absoluteFiniteQuotientEquiv K N).symm σ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index 9466420fdc..2536280d9a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -36,6 +36,9 @@ 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 @@ -43,19 +46,22 @@ noncomputable def equalCharacteristicResidueRank ⟨CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F, Nat.pos_of_ne_zero fun hrank => by have hcard := - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank + 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 - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F /-! ## The prescribed prime element in the target local field -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean index 7c0f2334f2..1802bcc034 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -321,6 +321,9 @@ theorem padicMultiplicativeAbelianLocalArtin_baseUniformizer 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 @@ -367,7 +370,7 @@ theorem padicMultiplicativeAbelianLocalArtin_eq_uniformizerUnitPart CompleteDVF.higherPrincipalUnitGroup.coe_valuationSubringUnitFieldUnitHom_apply, standardLubinTateBaseUniformizerUnit] using congrArg (fun z : ℚ_[p]ˣ => (z : ℚ_[p])) - (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart F.toCompleteDVF hπ x) calc φ x = φ x * φ ϖ ^ (-e) := by @@ -751,6 +754,9 @@ noncomputable def 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)`. @@ -829,7 +835,7 @@ theorem padicMultiplicativeAbelianLocalArtin_ker CompleteDVF.higherPrincipalUnitGroup.coe_valuationSubringUnitFieldUnitHom_apply, standardLubinTateBaseUniformizerUnit] using congrArg (fun z : ℚ_[p]ˣ => (z : ℚ_[p])) - (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart + (valuationSubringUnitFieldUnitHom_fieldUnitUniformizerUnitPart F.toCompleteDVF hπ x) have hxDecomposition : x = j u * ϖ ^ e := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index bbbf8938be..efa71d76e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -185,8 +185,8 @@ instance equalCharacteristicChangedCompletedLevelField_charP noncomputable def equalCharacteristicChangedCompletedLevelFieldEquivSplittingField (F : LocalField.{u, v} K) (u : F.residueField⟦X⟧ˣ) (n : ℕ) : - equalCharacteristicChangedCompletedLevelField F u n ≃ₐ[ - equalCharacteristicCompletedUnramifiedField F.residueField] + equalCharacteristicChangedCompletedLevelField F u n + ≃ₐ[equalCharacteristicCompletedUnramifiedField F.residueField] (equalCharacteristicChangedCompletedPrimitivePolynomial F u n).SplittingField := AlgEquiv.refl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean index 2400da5c17..5d9feab8a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -235,8 +235,8 @@ instance equalCharacteristicCompletedLevelField_isAlgebraic /-- Comparison with the library splitting-field model. -/ noncomputable def equalCharacteristicCompletedLevelFieldEquivSplittingField (F : LocalField.{u, v} K) (n : ℕ) : - equalCharacteristicCompletedLevelField F n ≃ₐ[ - equalCharacteristicCompletedUnramifiedField F.residueField] + equalCharacteristicCompletedLevelField F n ≃ₐ[equalCharacteristicCompletedUnramifiedField + F.residueField] (equalCharacteristicCompletedPrimitivePolynomial F n).SplittingField := AlgEquiv.refl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean index bdcb53aa8c..27557f042a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -143,7 +143,7 @@ theorem equalCharacteristicDirectThetaSourceUniformizerInteger_coe Valued.integer (equalCharacteristicCompletedLevelField F n)) : equalCharacteristicCompletedLevelField F n) = equalCharacteristicCompletedLevelUniformizer F n := by - simp [equalCharacteristicCompletedLevelUniformizerInteger, + simp? [equalCharacteristicCompletedLevelUniformizerInteger, equalCharacteristicCompletedLevelCoefficientHom, equalCharacteristicCompletedBaseIntegerToLevel, equalCharacteristicCompletedLevelUniformizer, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean index 9bcd292207..29995569dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean @@ -36,6 +36,9 @@ noncomputable def equalCharacteristicLaurentUniformizer 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 @@ -52,7 +55,7 @@ noncomputable def equalCharacteristicLaurentRingEquiv (F := F.toCompleteDVF) F.residueCharacteristic (n := n) (by simpa [f, n] using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) pi hpi exact RingEquiv.ofBijective eval ⟨RingHom.injective eval, @@ -60,9 +63,12 @@ noncomputable def equalCharacteristicLaurentRingEquiv (F := F.toCompleteDVF) F.residueCharacteristic (n := n) (by simpa [f, n] using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + 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 @@ -79,10 +85,13 @@ theorem equalCharacteristicLaurentRingEquiv_apply Module.finrank_pos⟩) (by simpa using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + 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) @@ -100,7 +109,7 @@ theorem equalCharacteristicLaurentRingEquiv_algebraMap_C Module.finrank_pos⟩) (by simpa using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) a := by rw [equalCharacteristicLaurentRingEquiv_apply] exact @@ -111,9 +120,12 @@ theorem equalCharacteristicLaurentRingEquiv_algebraMap_C Module.finrank_pos⟩) (by simpa using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + 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) @@ -133,7 +145,7 @@ theorem equalCharacteristicLaurentRingEquiv_algebraMap_X Module.finrank_pos⟩) (by simpa using - CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) + residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F) pi hpi end EqualCharacteristic diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean index 96cb7d3a3e..0447381ca8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -167,8 +167,8 @@ noncomputable def equalCharacteristicLubinTateTorsionEquivRootSet 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 [equalCharacteristicLubinTatePiPolynomialIterate_natDegree] + exact Nat.pow_pos Nat.card_pos rw [Polynomial.mem_rootSet_of_ne hP, Polynomial.aeval_def, ← equalCharacteristicSeparableBaseHom_eq_algebraMap, equalCharacteristicLubinTatePiPolynomialIterate_eval₂] @@ -176,8 +176,8 @@ noncomputable def equalCharacteristicLubinTateTorsionEquivRootSet 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 + · 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, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean index 56410f4a1b..db79c5a169 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean @@ -76,6 +76,9 @@ noncomputable def equalCharacteristicLubinTateAmbientPiEnd 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 @@ -89,7 +92,7 @@ theorem equalCharacteristicLubinTateAmbientPiEnd_apply (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + t * x = _ rw [iterateFrobenius_def] - rw [CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] + rw [residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] /-- Multiplication by an embedded residue-field coefficient. -/ noncomputable def equalCharacteristicLubinTateAmbientCoefficientEnd diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean index 4368017a5c..a1cf661d1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -82,6 +82,9 @@ noncomputable def equalCharacteristicLubinTatePiEnd 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 @@ -96,7 +99,7 @@ theorem equalCharacteristicLubinTatePiEnd_apply (CompleteDVF.higherPrincipalUnitGroup.iwasawaResidueRank F) x + equalCharacteristicLaurentUniformizer F * x = _ rw [iterateFrobenius_def] - rw [CompleteDVF.higherPrincipalUnitGroup.residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] + rw [residueField_card_eq_residueCharacteristic_pow_iwasawaResidueRank F] /-- Multiplication by a residue-field coefficient, regarded as an additive endomorphism of the Laurent-series field. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index d888d8a127..c0585ef0a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -1064,7 +1064,8 @@ theorem equalCharacteristicLubinTateBaseUniformizerInteger_map_addVal_eq_degree 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 + _ = (Fintype.card Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩) : ℕ∞) + := hadd _ = ((Nat.card F.residueField - 1) * Nat.card F.residueField ^ n : ℕ) := by congr 1 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean index 8f3016bb15..29455a07ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -875,7 +875,7 @@ theorem /-- The power-interval form of the finite-parameter displacement criterion, stated using its chosen representative. -/ theorem - standardLubinTateUnitParameterToGal_displacement_addVal_ge_iff_chosenRepresentative_mem_of_pow_interval + 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 : ℕ) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean index 1fe776b418..efe2653ce8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean @@ -224,7 +224,7 @@ namespace Intertwines /-- An intertwiner remains an intertwiner after substituting a family of intertwiners. -/ theorem subst - [Fintype σ] [Fintype τ] + [Finite σ] [Finite τ] {e ebar ehat : LubinTateSeries F π} {H : MvPowerSeries σ F.valuationSubring} (hH : Intertwines e ebar H) @@ -233,6 +233,8 @@ theorem subst (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 = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean index 494f0bad0c..6205ed2594 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean @@ -53,8 +53,7 @@ private noncomputable local instance (p : ℕ) [Fact p.Prime] (n : ℕ) : WithIdeal (standardLubinTateLevelCompleteDVF - (padicMultiplicativeLubinTateSeries_isUniformizer p) n - ).valuationSubring where + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring where i := (standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n @@ -72,8 +71,7 @@ private noncomputable local instance (p : ℕ) [Fact p.Prime] (n : ℕ) : CompleteSpace (standardLubinTateLevelCompleteDVF - (padicMultiplicativeLubinTateSeries_isUniformizer p) n - ).valuationSubring := by + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := by let source := standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n @@ -85,8 +83,7 @@ private noncomputable local instance (p : ℕ) [Fact p.Prime] (n : ℕ) : T2Space (standardLubinTateLevelCompleteDVF - (padicMultiplicativeLubinTateSeries_isUniformizer p) n - ).valuationSubring := by + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring := by let source := standardLubinTateLevelCompleteDVF (padicMultiplicativeLubinTateSeries_isUniformizer p) n @@ -198,8 +195,7 @@ theorem padicStandardLevelIntegerEmbedding_coe (p : ℕ) [Fact p.Prime] (n : ℕ) (x : (standardLubinTateLevelCompleteDVF - (padicMultiplicativeLubinTateSeries_isUniformizer p) n - ).valuationSubring) : + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) : ((padicStandardLevelIntegerEmbedding p n x : (padicCompletedLevelCompleteDVF p n).valuationSubring) : padicCompletedLevelField p n) = @@ -310,8 +306,7 @@ theorem padicStandardLevelIntegerEmbedding_powerSeriesEval (p : ℕ) [Fact p.Prime] (n : ℕ) (x : (standardLubinTateLevelCompleteDVF - (padicMultiplicativeLubinTateSeries_isUniformizer p) n - ).valuationSubring) + (padicMultiplicativeLubinTateSeries_isUniformizer p) n).valuationSubring) (hx : PowerSeries.HasEval x) (f : PowerSeries (padicLocalField p).valuationSubring) : padicStandardLevelIntegerEmbedding p n diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean index 4223ba38aa..fe3a251451 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean @@ -28,6 +28,9 @@ 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 @@ -61,7 +64,7 @@ theorem IsAbelianConductor.finiteExponent_le_iff_higherUnit_le_tensorNorm rw [abelianFullConductor_finiteExponent_eq_localConductorExponent (K := K) (L := L) v] exact - (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent + (ideleClassNormLocalHigherUnitExponent_eq_localConductorExponent (K := K) (L := L) v).symm have hcoeff : c.finitePart v = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean index 655ec8ee95..29dab402b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean @@ -19,6 +19,9 @@ 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 @@ -43,7 +46,7 @@ theorem IsAbelianConductor.finiteExponent_eq_zero_iff_unramified rw [heq] change H.narrowFiniteConductor.support = _ exact - GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_support_eq_ramifiedBaseFinitePlaces + ideleClassNorm_conductor_support_eq_ramifiedPlaces (K := K) (L := L) calc c.finitePart v = 0 ↔ v ∉ c.finitePart.support := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean index 9f3bacf4bf..ffb41b78ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean @@ -18,6 +18,9 @@ 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 @@ -36,7 +39,7 @@ theorem IsAbelianConductor.mem_infinitePart_iff_realRamified hc.unique (normFullConductor_isAbelianConductor K L) rw [heq] change v ∈ H.fullConductor.infinitePart ↔ _ - rw [GlobalClassFieldTheory.GlobalClassFields.ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus] + 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 index 38d87e8471..34f8e86162 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean @@ -27,6 +27,9 @@ 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`. -/ @@ -98,14 +101,14 @@ theorem IsAbelianConductor.finiteExponent_le_one_iff_residueChar_not_dvd_ramific · exact (hd c).mp ((hc c).mpr le_rfl) have hCoeff : c.finitePart v = - GlobalClassFieldTheory.GlobalClassFields.ideleClassNormChosenFinitePlaceLocalConductorExponent + ideleClassNormChosenFinitePlaceLocalConductorExponent (K := K) (L := L) v := by rw [hcd] simpa only [d] using (abelianFullConductor_finiteExponent_eq_localConductorExponent (K := K) (L := L) v) have hChosen : - GlobalClassFieldTheory.GlobalClassFields.ideleClassNormChosenFinitePlaceLocalConductorExponent + ideleClassNormChosenFinitePlaceLocalConductorExponent (K := K) (L := L) v = LocalClassFieldTheory.localConductorExponent C E := by rfl diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean index b4d671e647..c93c36df4f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean @@ -24,6 +24,9 @@ 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 @@ -35,7 +38,7 @@ theorem rayClassIdealNormImage_eq_artinKer rayClassIdealNormImage K L D.modulus = D.artin.ker := by let m := GlobalClassFieldComparison.rayClassModulusToOriginal K D.modulus have hsource := - GlobalClassFieldTheory.IdealClassFieldTheory.idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension + idealArtinKernel_eq_idealNormSubgroup_of_finiteExtension (K := K) (L := L) m (GlobalClassFieldComparison.finiteAbelianReciprocity_modulus_isDefining K L D) have hquot := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean index 7b3ea58f72..4261ce9aa5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean @@ -27,6 +27,12 @@ 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 @@ -40,7 +46,7 @@ theorem smallHilbertClassField_artinEquiv artin (ordinaryRayClassOfFinitePrime v) = arithmeticFrobeniusAt (K := K) w := by let g := - SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroupOfIsSmall E hE + smallHilbertGaloisEquivClassGroupOfIsSmall E hE let artin : RayClassGroup (ordinaryRayClassModulus K) ≃* (E ≃ₐ[K] E) := (ordinaryRayClassGroupEquivClassGroup (K := K)).trans g.symm refine ⟨artin, ?_⟩ @@ -60,7 +66,7 @@ theorem smallHilbertClassField_artinEquiv rw [← GlobalClassFieldComparison.arithmeticPrimeArtin_eq_arithmeticFrobeniusAt (K := K) (L := E) v w hw hunram] exact - (SmallHilbertClassFieldComparison.arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime + (arithmeticSmallHilbertClassFieldGaloisEquivClassGroup_prime E hE v).symm end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean index c4bd7087ff..e28adea283 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean @@ -25,6 +25,9 @@ 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 @@ -35,7 +38,7 @@ theorem finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal finitePrimeFractionalIdeal v ∈ (toPrincipalIdeal (𝓞 K) K).range := by exact - GlobalClassFieldComparison.finitePrime_splitsCompletelyInSmallHilbertClassField_iff_principal_of_isSmall + finitePrime_splitsCompletely_iff_principal_of_isSmall K E hE v end ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean index f85cf75425..2661b924c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -28,6 +28,9 @@ 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 @@ -137,7 +140,7 @@ theorem exists_finitePlaceCompletionLocalArtin (K := K) (L := L) v x = 1 := hGlobal _ ↔ x ∈ _root_.chosenFinitePlaceLocalNormSubgroup (K := K) (L := L) v := - GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm + chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm v x _ ↔ x ∈ finitePlaceTensorNormSubgroup K L v := by rw [← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean index cb92089cec..9d23611933 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean @@ -33,6 +33,9 @@ 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 @@ -75,7 +78,7 @@ theorem exists_finiteAbelianGlobalArtin_finitePlaceNormKernel (GlobalClassFieldTheory.Reciprocity.globalNormResidueMonoidHom_comp_finitePlaceIdeleClass (K := K) (L := L) v) x rw [hcompat] - rw [GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean index 2710bcc25a..93d308f1f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean @@ -30,6 +30,12 @@ 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 @@ -102,12 +108,12 @@ theorem exists_finitePlaceRayArtin_decomposition D.artin (ι x) = GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K L (IdeleGroup.finitePlaceIdeleClass v x) := - GlobalClassFieldTheory.GlobalClassFields.rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue m a hprime (IdeleGroup.finitePlaceIdeleClass v x) _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom K L v x := by exact DFunLike.congr_fun - (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass (K := K) (L := L) v) x refine ⟨w, ι, ?_, ?_⟩ · ext x diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean index 1c7e747cc4..1cab944013 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean @@ -33,6 +33,61 @@ 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 @@ -101,41 +156,7 @@ theorem exists_finitePlaceRayArtin_localValueDiagram 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 hprime := finiteAbelianReciprocityData_prime_formula K L D let ι : (v.adicCompletion K)ˣ →* RayClassGroup D.modulus := e.symm.toMonoidHom.comp ((QuotientGroup.mk' m.congruenceSubgroup).comp @@ -148,12 +169,12 @@ theorem exists_finitePlaceRayArtin_localValueDiagram D.artin (ι x) = GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom K L (IdeleGroup.finitePlaceIdeleClass v x) := - GlobalClassFieldTheory.GlobalClassFields.rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue + rayArtin_comp_ideleClass_eq_arithmeticGlobalNormResidue m a hprime (IdeleGroup.finitePlaceIdeleClass v x) _ = GlobalClassFieldTheory.Reciprocity.arithmeticChosenFinitePlaceArtinMonoidHom K L v x := by exact DFunLike.congr_fun - (GlobalClassFieldTheory.Reciprocity.arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass + (arithmeticGlobalNormResidueMonoidHom_comp_finitePlaceIdeleClass (K := K) (L := L) v) x have hfactor (x : (v.adicCompletion K)ˣ) : GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom @@ -182,12 +203,8 @@ theorem exists_finitePlaceRayArtin_localValueDiagram _ = (δ : L ≃ₐ[K] L) := hx change eD.symm (localE x) = eD.symm τ at hxD exact eD.symm.injective hxD - have hTransportInj : Function.Injective transport := by - intro σ τ hστ - have hD : eD.symm (eAut.symm σ) = eD.symm (eAut.symm τ) := by - apply Subtype.coe_injective - exact hστ - exact eAut.symm.injective (eD.symm.injective hD) + 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 @@ -258,13 +275,8 @@ theorem exists_finitePlaceRayArtin_localValueDiagram ext x change localArtin x = 1 ↔ x ∈ finitePlaceTensorNormSubgroup K L v calc - localArtin x = 1 ↔ transport (localArtin x) = 1 := by - constructor - · intro hx - rw [hx, map_one] - · intro hx - apply hTransportInj - simpa only [map_one] using hx + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean index 80f875da5c..c6ca757576 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean @@ -26,6 +26,9 @@ 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. -/ @@ -114,7 +117,7 @@ theorem exists_finitePlaceRayArtin_normKernel (IdeleGroup.finitePlaceIdeleClass v x) = GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom (K := K) (L := L) v x from hcompat] - rw [GlobalClassFieldTheory.Reciprocity.chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, + rw [chosenFinitePlaceArtinMonoidHom_eq_one_iff_chosenLocalNorm, ← finitePlaceLocalTensorNorm_range_eq_chosenLocalNormSubgroup (K := K) (L := L) v] change x ∈ (localTensorNorm (K := K) (L := L) v).range ↔ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean index 3d8d5a81a6..541d95906b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -69,9 +69,11 @@ private noncomputable def periodicChainMap 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, Nat.add_left_cancel_iff, ↓reduceIte, hj] + · 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, Nat.add_left_cancel_iff, ↓reduceIte, hj] + · simp only [Rep.FiniteCyclicGroup.moduleCatChainComplex, + HomologicalComplex.alternatingConst, ComplexShape.down_Rel, dite_eq_ite, ↓reduceIte, hj] exact (subCompNormMap σ f hf).comm₁₂ private noncomputable def periodicShortComplex diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean index e9fd0cbb5a..50a9f74d1b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -713,7 +713,8 @@ 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 -local instance : NeZero H.index := ⟨by +omit [Fintype G] in +local instance [Finite G] : NeZero H.index := ⟨by rw [H.index_eq_card] exact Nat.card_pos.ne'⟩ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index d8ef514371..44d272d934 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -840,7 +840,7 @@ orders. -/ theorem completePermutationLattice_herbrandQuotient_eq_stabilizerProduct {G ι : Type} - [Fintype G] [Group G] [Fintype ι] [DecidableEq ι] + [Fintype G] [Group G] [Fintype ι] (ρ : G →* Equiv.Perm ι) (L : Submodule ℤ (ι → ℝ)) [DiscreteTopology L] [IsZLattice ℝ L] @@ -875,6 +875,7 @@ theorem ∏ ω : MulAction.orbitRel.Quotient G ι, (Fintype.card (permutationOrbitStabilizer ω) : ℚ) := by + classical let indexAction : MulAction G ι := permutationMulAction ρ let ambientAction : diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 5834e3829f..4d597c3ed5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -676,6 +676,7 @@ theorem augmentation_foxCoefficient (i j : X) : (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) = @@ -837,6 +838,7 @@ theorem generator_mul_foxDeterminantLift_mem_mixed (commutator G)).neg_mem hneg simpa using this +omit [DecidableEq X] in theorem delta_vecMul_foxMatrix : Matrix.vecMul (fun i : X => diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean index f64f37bb67..a76ac105ba 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -281,6 +281,12 @@ theorem uniformizerValueExponent_residueCharacteristic_ne_zero 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. -/ @@ -298,13 +304,13 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing (u : F.valuationSubringˣ)) = φ u) (hψa : ψ a = 1) : ψ = fieldUnitLogHomWithUniformizerValue F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ (uniformizerLogValueKilling F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ a) := by let d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ let L := fieldUnitLogHomWithUniformizerValue F d φ (uniformizerLogValueKilling F d φ a) @@ -322,7 +328,7 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing m • Multiplicative.toAdd (ψ ϖ) := by have hdecomp : d z = a := d.apply_symm_apply a rw [← hdecomp] - rw [CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + 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] @@ -334,7 +340,7 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing m • Multiplicative.toAdd (L ϖ) := by have hdecomp : d z = a := d.apply_symm_apply a rw [← hdecomp] - rw [CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + rw [fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] rw [L.map_mul, L.map_mul, L.map_zpow] rw [toAdd_mul, toAdd_mul, toAdd_zpow] have hLprincipal : @@ -374,6 +380,12 @@ theorem fieldUnitLogHomWithUniformizerValue_unique_of_killing 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. @@ -392,7 +404,7 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZero infer_instance letI : Valued K (WithZero (Multiplicative ℤ)) := Valued.mk' v Continuous - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ).symm := by let F : ValuationTheory.DiscreteValuationField.CompleteDVF.{u, 0} K := completeDVFOfWithZeroValuation v @@ -414,7 +426,7 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZero let hcontinuousRestricted := letI : Valued K (MonoidHom.mrange v.toMonoidWithZeroHom) := restricted - CompleteDVF.higherPrincipalUnitGroup.continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_mrangeRestrict + continuous_rootsPrincipalUnitsUniformizer_symm F hπ have htop : direct.toTopologicalSpace = restricted.toTopologicalSpace := by exact congrArg (fun U : UniformSpace K => U.toTopologicalSpace) huniform @@ -439,11 +451,14 @@ theorem continuous_fieldUnitsEquivRootsPrincipalUnitsUniformizer_symm_ofWithZero (CompleteDVF.higherPrincipalUnitGroup.fieldUnitDecompositionFactors F) (unitsTopology direct.toTopologicalSpace) (factorsTopology direct.toTopologicalSpace) - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (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 @@ -504,7 +519,7 @@ theorem existsUnique_continuous_log all_goals rfl rcases F.exists_uniformizer with ⟨π, hπ⟩ let d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F.toCompleteDVF hπ let c : K := uniformizerLogValueKilling F.toCompleteDVF d φ pUnit let L : Kˣ →* Multiplicative K := @@ -541,7 +556,7 @@ theorem existsUnique_continuous_log F.toCompleteDVF hπ φ c u rw [show L = fieldUnitLogHomWithUniformizerValue F.toCompleteDVF d φ c from rfl] rw [show d = - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F.toCompleteDVF hπ from rfl] rw [hu] exact diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean index d8e8462d28..e2145efb16 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean @@ -180,6 +180,12 @@ theorem fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) hx +open CompleteDVF.higherPrincipalUnitGroup renaming + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in +open 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. -/ @@ -191,17 +197,17 @@ theorem fieldUnitLogHomWithUniformizerValue_eq_of_completeDVF_principal Multiplicative A) (c : A) (u : (LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup F) 1) : fieldUnitLogHomWithUniformizerValue F - (CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + (fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) φ c (CompleteDVF.higherPrincipalUnitGroup.valuationSubringUnitFieldUnitHom F (u : F.valuationSubringˣ)) = φ u := by apply fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition (F := F) (d := - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF + fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF F hπ) (φ := φ) (c := c) (u := u) - simp [CompleteDVF.higherPrincipalUnitGroup.fieldUnitsEquivRootsPrincipalUnitsUniformizer_of_completeDVF_apply] + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean index 165c1cdfe2..55cefc8a6c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean @@ -282,7 +282,7 @@ theorem hasSum_powerSeries_subst_sigma /-- 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'`.-/ +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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean index c7e7c89c8b..1fe79d4abf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -27,6 +27,9 @@ namespace LocalField variable {K : Type u} [Field K] +open 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 @@ -66,12 +69,15 @@ noncomputable def chosenFieldUnitsStructureMixedCharacteristic chosenMixedFirstPrincipalUnitStructureOfWithZeroValuation v hv exact ⟨a, - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation + fieldUnitsEquivUniformizerRootsPrincipalUnits v hπ (Multiplicative (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic]))) e⟩ +open 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 `ℕ`. -/ @@ -98,7 +104,7 @@ noncomputable def chosenFirstPrincipalUnitStructureEqualCharacteristic let E := (CompleteDVF.higherPrincipalUnitGroup.iwasawaGlobalAdicPrincipalUnitsContinuousAddEquiv F hπ).trans - (CompleteDVF.higherPrincipalUnitGroup.adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation + (adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation v) let I := iwasawaPadicIntProductContinuousAddEquivNat F.residueCharacteristic @@ -112,6 +118,9 @@ noncomputable def chosenFirstPrincipalUnitStructureEqualCharacteristic I.symm.trans E exact LocalFieldTheory.DiscreteValuationField.continuousMulEquivOfAdditiveTarget eAdd +open 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 @@ -135,7 +144,7 @@ noncomputable def chosenFieldUnitsStructureEqualCharacteristic let ePrincipal := chosenFirstPrincipalUnitStructureEqualCharacteristic v exact - CompleteDVF.higherPrincipalUnitGroup.fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation + fieldUnitsEquivUniformizerRootsPrincipalUnits v hπ (Multiplicative (ℕ → ℤ_[F.residueCharacteristic])) ePrincipal end LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean index 7cadc295c2..14c4f7fd23 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -1127,6 +1127,9 @@ theorem principalUnitQuotientProjectionLinear_ker (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 @@ -1147,9 +1150,12 @@ theorem discretePrincipalUnitQuotient_moduleIsTorsion change (exponent : ℤ_[F.residueCharacteristic]) • x = 0 rw [Nat.cast_smul_eq_nsmul] exact - CompleteDVF.higherPrincipalUnitGroup.discretePrincipalUnitQuotient_nsmul_residueCharacteristic_pow_eq_zero + 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 @@ -1171,7 +1177,7 @@ theorem discretePrincipalUnitQuotient_isPGroup Nat.card_congr Multiplicative.toAdd _ = F.residueCharacteristic ^ ((CompleteDVF.higherPrincipalUnitGroup.principalUnitResidueDegree F : ℕ) * n) := - CompleteDVF.higherPrincipalUnitGroup.card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow + card_discretePrincipalUnitQuotient_eq_residueCharacteristic_pow F n /-- Finite generation passes from a higher principal-unit group to its diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean index 89760dc51a..6c245c46b8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -311,6 +311,9 @@ theorem tendsto_zero_logSeriesTermField_padic_mulValuation_of_lt_one (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) (padic_mulValuation_logSeries_denominator p) hvx +open 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 @@ -324,11 +327,14 @@ theorem tendsto_zero_signedLogSeriesTermField_padic_mulValuation_of_lt_one atTop (padicMulValuationNhds p (0 : ℚ_[p])) := by rw [padicMulValuationNhds_eq_valuedNhds] exact - MultiplicativeIntegerValuation.tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one + 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 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 @@ -341,7 +347,7 @@ theorem tendsto_zero_expSeriesTermField_padic_mulValuation_of_lt_exp_neg_one atTop (padicMulValuationNhds p (0 : ℚ_[p])) := by rw [padicMulValuationNhds_eq_valuedNhds] exact - MultiplicativeIntegerValuation.tendsto_zero_expSeriesTermField_ofWithZeroValuation_of_lt_exp_neg_one + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index 86572b37eb..ac6793889c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -282,6 +282,9 @@ theorem mrangeRestrict_integer_completeSpace 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. -/ @@ -331,7 +334,7 @@ theorem mrangeRestrict_integer_compactSpace_of_residueField_finite have hcomplete : CompleteSpace 𝒪[K] := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_completeSpace F) exact - (Valued.integer.compactSpace_iff_completeSpace_and_isDiscreteValuationRing_and_finite_residueField + (compactSpace_iff_complete_discrete_finite_residue (K := K) (Γ₀ := MonoidHom.mrange F.valuation.toMonoidWithZeroHom)).2 ⟨hcomplete, inferInstance, inferInstance⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean index c80e2d9aa9..2fe66a3221 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean @@ -213,8 +213,8 @@ def dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDeco [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 ≃ₐ[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 @@ -247,8 +247,8 @@ theorem dedekindRamification_inertiaFieldOverDecompositionField_finrank_eq_quoti 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 ≃ₐ[decompositionField (K := + K) (L := L) G P] inertiaFieldOverDecompositionField (K := K) (L := L) G P) := by rw [← IsGalois.card_aut_eq_finrank] _ = @@ -267,8 +267,8 @@ 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 ≃ₐ[decompositionField (K := K) (L + := L) G P] inertiaFieldOverDecompositionField (K := K) (L := L) G P) ≃* (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P := (dedekindRamificationDecompositionQuotientInertiaEquivGalInertiaFieldOverDecomposition @@ -286,8 +286,8 @@ theorem dedekindInertiaField_inertiaField_properties 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 ≃ₐ[decompositionField (K := + K) (L := L) G P] inertiaFieldOverDecompositionField (K := K) (L := L) G P) ≃* (B ⧸ P) ≃ₐ[A ⧸ p] B ⧸ P) ∧ fixingSubgroup G diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean index 704b02987f..6db647cc9b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean @@ -39,7 +39,7 @@ theorem ramificationIdx_tower /-- The prime-decomposition tower identity: inertia degrees multiply in a tower. -/ theorem dedekindTower_inertiaDeg_tower - (p : Ideal A) + (_p : Ideal A) (P : Ideal B) (Q : Ideal C) [Q.LiesOver P] : Q.inertiaDeg A = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean index 383854cd94..77794e3211 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean @@ -191,7 +191,7 @@ theorem normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_nonar /-- The closed unit ball of the bundled norm formula consists exactly of the elements integral over the base valuation ring. -/ theorem - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_mem_valuationSubring_iff_isIntegral + 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) @@ -217,7 +217,7 @@ theorem /-- The valuation ring of the bundled finite norm formula is the actual integral closure of the base valuation ring in `L`. -/ theorem - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_valuationSubring_eq_integralClosure + 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) @@ -233,7 +233,7 @@ theorem v hnonarch) L).toSubring := by ext x exact - normFormula_finite_normFormulaAbsoluteValue_of_henselFactorization_mem_valuationSubring_iff_isIntegral + henselFactorization_normFormula_mem_valuationSubring_iff_isIntegral (K := K) (L := L) v hnonarch hv x end Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean index 19b0c94edd..85df6e93c6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -37,6 +37,9 @@ theorem henselianValuation_iff_henselFactorization 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. @@ -86,7 +89,7 @@ theorem normFormula_algebraic_extension intro W hW let : V.valuation.HasExtension W.valuation := hW.1 simpa only [ValuationSubring.valuationSubring_valuation] using - DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + normFormula_valuationSubring_eq_integralClosure (K := K) (L := L) V hval W.valuation /-- Exact extension of nonarchimedean absolute values supplies extension of @@ -230,6 +233,9 @@ theorem normFormula_finite_normFormulaAbsoluteValue_eq_of_valuationSubring_eq_of 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 @@ -292,7 +298,7 @@ theorem normFormula_finite_extension_norm_formula absoluteValueValuation_hasExtension_of_extends v w hnonarch hwnonarch hw_ext have hW := - DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + 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 @@ -301,7 +307,7 @@ theorem normFormula_finite_extension_norm_formula absoluteValueValuation_hasExtension_of_extends v extended hnonarch hextendedNonarch hextendedBase have hR := - DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + normFormula_valuationSubring_eq_integralClosure (K := K) (L := L) V hval R.valuation have hsub : W = R := by simpa only [ValuationSubring.valuationSubring_valuation] using diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index 8d20a048b2..9427305158 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -115,6 +115,9 @@ theorem integralClosureValuationSubringIntegerMapOfMemOrInv_injective (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 @@ -129,7 +132,7 @@ theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdea integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let hvL_le : B ≤ vL.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation vL hval (ValuationSubring.idealOfLE B vL.valuationSubring hvL_le).comap (integralClosureValuationSubringIntegerMapOfMemOrInv @@ -139,7 +142,7 @@ theorem idealOfLE_comap_integralClosureValuationSubringIntegerMap_eq_maximalIdea integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval let hvL_le : B ≤ vL.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation vL hval let i : base.valuationSubring →+* B := integralClosureValuationSubringIntegerMapOfMemOrInv @@ -230,6 +233,9 @@ theorem prime_eq_maximalIdeal_of_comap_integralClosureValuationSubringIntegerMap 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 @@ -242,7 +248,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) target.toDVF.valuation.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation target.toDVF.valuation hval) = IsLocalRing.maximalIdeal (integralClosureValuationSubringOfMemOrInv @@ -254,7 +260,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval) v'.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation v' hval) = IsLocalRing.maximalIdeal (integralClosureValuationSubringOfMemOrInv @@ -264,7 +270,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.toDVF.valuation hval have htarget_le : B ≤ target.toDVF.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -273,7 +279,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent intro Gamma' _ v' hExt let : base.toDVF.valuation.HasExtension v' := hExt have hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -284,6 +290,9 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent 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 : @@ -311,7 +320,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim (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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation target.toDVF.valuation hval exact hunique (ValuationSubring.idealOfLE B target.toDVF.valuation.valuationSubring htarget_le) @@ -323,7 +332,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim · intro Gamma' _ v' hExt let : base.toDVF.valuation.HasExtension v' := hExt let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.toDVF.valuation v' hval exact hunique (ValuationSubring.idealOfLE B v'.valuationSubring hv_le) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index 4f9f5d901b..2d5a935110 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -204,6 +204,9 @@ theorem hasUniqueValuationExtension_of_forall_isIntegral (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 @@ -225,7 +228,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca ((integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval).inclusion target.valuation.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval))) (hlocal : ∀ {Gamma' : Type y} [LinearOrderedCommGroupWithZero Gamma'] @@ -234,14 +237,14 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca ((integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval).inclusion v'.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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) := @@ -252,7 +255,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt have hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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) := @@ -265,6 +268,9 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_loca 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, @@ -285,7 +291,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval) target.valuation.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval) = IsLocalRing.maximalIdeal (integralClosureValuationSubringOfMemOrInv @@ -297,7 +303,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval) v'.valuationSubring - (ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + (integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval) = IsLocalRing.maximalIdeal (integralClosureValuationSubringOfMemOrInv @@ -307,7 +313,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval have htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -316,7 +322,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt have hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval have hv_eq : v'.valuationSubring = B := valuationSubring_eq_of_le_of_idealOfLE_eq_maximalIdeal @@ -327,6 +333,9 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent 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 @@ -361,7 +370,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim (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 := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval exact hunique (ValuationSubring.idealOfLE B target.valuation.valuationSubring htarget_le) @@ -373,7 +382,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_unique_prim · intro Gamma' _ v' hExt let : base.valuation.HasExtension v' := hExt let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval exact hunique (ValuationSubring.idealOfLE B v'.valuationSubring hv_le) @@ -674,6 +683,9 @@ theorem integralClosure_mem_or_inv_of_finite_separable 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 @@ -691,7 +703,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval (B.inclusion target.valuation.valuationSubring htarget_le).IsIntegral) (hintegral : @@ -701,7 +713,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -713,7 +725,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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) @@ -723,12 +735,15 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_inte integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -743,7 +758,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval (B.inclusion target.valuation.valuationSubring htarget_le).Finite) (hfinite : @@ -753,7 +768,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + 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 @@ -765,7 +780,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval have htargetFinite' : (B.inclusion target.valuation.valuationSubring htarget_le).Finite := by @@ -777,7 +792,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval have hvFinite : (B.inclusion v'.valuationSubring hv_le).Finite := by @@ -786,6 +801,9 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_fini 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 @@ -805,7 +823,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval ∀ x : B, B.inclusion target.valuation.valuationSubring htarget_le x ∈ @@ -818,7 +836,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval ∀ x : B, B.inclusion v'.valuationSubring hv_le x ∈ @@ -833,7 +851,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval exact idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff @@ -845,7 +863,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval exact idealOfLE_eq_maximalIdeal_of_mem_maximalIdeal_iff @@ -853,6 +871,9 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent (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 @@ -870,7 +891,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval ∀ x : B, x ∈ IsLocalRing.maximalIdeal B → @@ -883,7 +904,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval ∀ x : B, x ∈ IsLocalRing.maximalIdeal B → @@ -897,7 +918,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let htarget_le : B ≤ target.valuation.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation target.valuation hval change ∀ x : B, B.inclusion target.valuation.valuationSubring htarget_le x ∈ @@ -916,7 +937,7 @@ theorem hasUniqueValuationExtension_of_integralClosure_mem_or_inv_of_forall_cent integralClosureValuationSubringOfMemOrInv (L := L) base.valuation hval let hv_le : B ≤ v'.valuationSubring := - ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv_le_valuationSubring_of_hasExtension + integralClosureValuationSubring_le_of_hasExtension (L := L) base.valuation v' hval change ∀ x : B, B.inclusion v'.valuationSubring hv_le x ∈ @@ -1069,6 +1090,9 @@ theorem exists_chevalley_valuationSubring_eq_target_of_hasUniqueValuationExtensi (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 @@ -1106,7 +1130,7 @@ theorem exists_chevalley_extension_valuation_eq_target_of_hasUniqueValuationExte target.valuation.valuationSubring = vL.valuationSubring := by obtain ⟨ΓL, hΓL, vL, hExt, hpullback, hIntegral, hlies, hlocal, hResidue⟩ := - ValuationTheory.DiscreteValuationField.Valuation.chevalley_exists_extension_valuation_with_pullback_integralClosure_local_data + chevalley_exists_extension_valuation_with_integralClosure (L := L) base.valuation let : LinearOrderedCommGroupWithZero ΓL := hΓL let : base.valuation.HasExtension vL := hExt diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean index e0811543c6..2070548c44 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean @@ -57,7 +57,9 @@ theorem idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent ⟨Ideal.Quotient.mk I ((Polynomial.X ^ 2 - Polynomial.X : Polynomial R).derivative.eval a0), ?_, ?_⟩ - · simp only [pow_two, Polynomial.derivative_sub, 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] + · 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) = @@ -67,7 +69,9 @@ theorem idempotentPolynomial_derivative_eval_isUnit_of_quotient_idempotent _ = 1 := by rw [ha0.eq] ring - · simp only [pow_two, Polynomial.derivative_sub, 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] + · 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) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean index 271a41bd46..9d7dafe527 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean @@ -18,6 +18,9 @@ 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 @@ -30,7 +33,7 @@ theorem valuationSubring_eq_integralClosure_of_henselianRing rw [ValuationSubring.valuationSubring_valuation] exact integralClosure_mem_or_inv_of_henselianRing (L := L) V have h := congrArg ValuationSubring.toSubring - (_root_.DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + (normFormula_valuationSubring_eq_integralClosure V hval w) change w.valuationSubring.toSubring = (integralClosure V.valuation.valuationSubring L).toSubring at h diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean index b17322aa91..5905c209bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -263,6 +263,9 @@ theorem valuation_esymm_eq_pow_card_add_of_eq_of_lt ((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 @@ -291,7 +294,7 @@ theorem residue_ne_zero_of_isPrimitive_valuationSubring intro i simp rcases - AlgebraicNumberTheory.Valuations.henselFactorization_exists_coeff_mem_ideal_dvd_all_two_polynomials + 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 := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean index d03efdae5f..d6c5b1d170 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean @@ -23,6 +23,9 @@ 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. -/ @@ -57,7 +60,7 @@ theorem primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit_o have hconst : IsUnit (Q.coeff 0) := by by_contra hconst exact - (DiscreteValuationField.not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean index 47a100fef5..00bec5ad68 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean @@ -63,6 +63,9 @@ theorem monicResidualCoprimeFactorLifting_of_unique_algebraic_extensions 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 @@ -105,7 +108,7 @@ theorem henselianUniqueExtension_unique_algebraic_valuationSubring_extension_of_ ValuationTheory.DiscreteValuationField.Valuation.integralClosureValuationSubringOfMemOrInv (L := L) V.valuation hval := by simpa only [ValuationSubring.valuationSubring_valuation] using - DiscreteValuationField.Valuation.normFormula_extension_valuationSubring_eq_integralClosure_of_mem_or_inv + normFormula_valuationSubring_eq_integralClosure (K := K) (L := L) V hval W.valuation change W.toSubring = (integralClosure V L).toSubring rw [hWic] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean index d0b6745602..e17f15b122 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean @@ -157,6 +157,9 @@ theorem valuation_coeff_prod_X_sub_C_lt_coeff_zero_of_one_lt 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 @@ -194,7 +197,7 @@ theorem primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit have hconst : IsUnit (Q.coeff 0) := by by_contra hconst exact - (DiscreteValuationField.not_all_roots_same_valuation_of_primitive_irreducible_endpoints_nonunit + (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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean index cfff73d8e3..3afb377d37 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -152,6 +152,9 @@ theorem MonicResidualCoprimeFactorLifting.leadingCoeff_unit_branch (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 @@ -185,7 +188,7 @@ theorem primitiveIrreducibleReductionProperty_of_monicResidualCoprimeFactorLifti intro a b ha hb exact hlift.irreducible_roots_same_valuation B hQirr hsplit ha hb have hdegree : qbar.natDegree = 0 := - AlgebraicNumberTheory.Valuations.primitive_irreducible_reduction_natDegree_zero_of_leadingCoeff_nonunit_of_roots_eq + primitive_reduction_natDegree_zero_of_roots_eq V B Q hQprim hQirr hlead hrootsEq refine ⟨Or.inl hdegree, ?_⟩ intro a b hfactor _hcoprime diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean index 0400a95820..f7ef255272 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean @@ -68,7 +68,7 @@ def compatibleGroupFamilies subgroup. Declaring it explicitly keeps clients independent of reducibility of `compatibleGroupFamilies`. -/ instance compatibleGroupFamiliesGroup - { ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + {ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] (transition : ∀ {i j : ι}, i ≤ j → G j →* G i) : Group (compatibleGroupFamilies G transition) := by unfold compatibleGroupFamilies @@ -77,7 +77,7 @@ instance compatibleGroupFamiliesGroup /-- Coordinatewise commutativity descends to the compatible-family inverse limit. -/ instance compatibleGroupFamiliesCommGroup - { ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, CommGroup (G i)] + {ι : 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 @@ -88,7 +88,7 @@ instance compatibleGroupFamiliesCommGroup /-- Evaluation of a compatible family at one coordinate. -/ def compatibleGroupFamiliesEval - { ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + {ι : 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 @@ -96,7 +96,7 @@ def compatibleGroupFamiliesEval /-- 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)] + {ι : 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 := @@ -104,7 +104,7 @@ theorem compatibleGroupFamiliesEval_apply /-- The named compatibility law for an inverse-limit family. -/ theorem compatibleGroupFamilies_transition - { ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + {ι : 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) = @@ -115,7 +115,7 @@ theorem compatibleGroupFamilies_transition agree. -/ @[ext] theorem compatibleGroupFamilies_ext - { ι : Type*} [Preorder ι] (G : ι → Type*) [∀ i, Group (G i)] + {ι : 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 = From 2c7761389b5ed29d203a39555ae4cb2c148f1c36 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 08:07:19 +0000 Subject: [PATCH 18/33] Migrate class field theory to public Lean modules --- LeanPool/ClassFieldTheory.lean | 3498 +++++++++-------- .../ClassFieldTheory/ClassFieldTheory.lean | 32 +- .../AbstractClassFieldTheory.lean | 10 +- .../AbstractClassFieldTheory/All.lean | 8 +- .../AbstractClassFieldTheory/Degree.lean | 32 +- .../AbstractClassFieldTheory/Degree/All.lean | 30 +- .../Degree/Fields.lean | 14 +- .../Degree/Frobenius.lean | 6 +- .../Degree/FrobeniusFixedField.lean | 10 +- .../Degree/FrobeniusLift.lean | 6 +- .../Degree/Indices.lean | 6 +- .../AbstractClassFieldTheory/Degree/Norm.lean | 10 +- .../Degree/NormConjugation.lean | 8 +- .../Degree/NormLaws.lean | 8 +- .../Degree/PadicCyclicClosure.lean | 14 +- .../Degree/PrimeElements.lean | 6 +- .../ProfiniteIntegerFiniteQuotient.lean | 16 +- .../Degree/Valuation.lean | 8 +- .../Degree/ValuationLaws.lean | 8 +- .../AbstractClassFieldTheory/Reciprocity.lean | 52 +- .../Reciprocity/All.lean | 50 +- .../Reciprocity/ClassField.lean | 6 +- .../Reciprocity/ClassFieldAxiom.lean | 6 +- .../Reciprocity/ClassFieldCandidate.lean | 12 +- .../Reciprocity/Construction.lean | 80 +- .../Reciprocity/Construction/All.lean | 78 +- .../CanonicalUnramifiedNormQuotient.lean | 8 +- .../ChosenDegreeOneFrobenius.lean | 6 +- .../Construction/CoreFrobeniusNorm.lean | 10 +- .../DoubleCosetOrbitGeometry.lean | 14 +- .../Construction/FiniteFieldUnitMaps.lean | 10 +- .../FiniteIntermediateCompositum.lean | 6 +- .../FiniteIntermediateFieldCompositum.lean | 6 +- .../Construction/FiniteNormQuotient.lean | 8 +- .../FixedTowerUnitCorrection.lean | 6 +- .../Construction/FixedTowerUnitDescent.lean | 8 +- .../FrobeniusClosureCommutation.lean | 6 +- .../Construction/FrobeniusDescent.lean | 8 +- .../Construction/FrobeniusField.lean | 6 +- .../FrobeniusFixedFieldAction.lean | 8 +- .../FrobeniusFixedFieldTower.lean | 8 +- .../FrobeniusPowerFixedField.lean | 6 +- .../FrobeniusQuotientDescent.lean | 6 +- .../Construction/FrobeniusSemigroup.lean | 6 +- .../Construction/InfiniteUnitDescent.lean | 8 +- .../InfiniteUnitNormSubgroup.lean | 6 +- .../Construction/MainFiniteReciprocity.lean | 20 +- .../Construction/MainMultiplicativity.lean | 22 +- .../MainMultiplicativity/All.lean | 20 +- .../ConjugatePrimeNorm.lean | 8 +- .../MainMultiplicativity/CorrectionSum.lean | 6 +- .../FiniteStageCorrections.lean | 6 +- .../FrobeniusActionRemainder.lean | 10 +- .../FrobeniusPowerSumRelation.lean | 6 +- .../NormClassRelation.lean | 8 +- .../PrimeUnitDifferences.lean | 6 +- .../ReciprocityMapMul.lean | 16 +- .../Construction/MainNaturality.lean | 6 +- .../Construction/MainTransfer.lean | 8 +- .../Construction/MainTransferFrobenius.lean | 6 +- .../MainTransferFrobeniusGeometry.lean | 8 +- .../Construction/NormSubgroup.lean | 8 +- .../Reciprocity/Construction/PrimeChoice.lean | 6 +- .../Construction/ReciprocityDefinition.lean | 12 +- .../Construction/ReciprocityIndependence.lean | 8 +- .../Construction/RelativeNormDoubleCoset.lean | 10 +- .../Construction/TransferNaturality.lean | 8 +- .../Construction/TransferOrbitClosure.lean | 10 +- .../Construction/UnitCohomologyAxiom.lean | 8 +- .../Reciprocity/Construction/Universal.lean | 14 +- .../Construction/UniversalNormDescent.lean | 8 +- .../Construction/UnramifiedNormQuotient.lean | 8 +- .../Reciprocity/Core.lean | 14 +- .../Reciprocity/CyclicNormQuotient.lean | 10 +- .../Reciprocity/FieldRepresentation.lean | 8 +- .../FiniteAbelianClassification.lean | 8 +- .../FiniteAbelianSubextension.lean | 10 +- .../Reciprocity/FiniteGaloisSubextension.lean | 6 +- .../Reciprocity/IntermediateExtension.lean | 8 +- .../Reciprocity/Main.lean | 24 +- .../MaximalUnramifiedReciprocity.lean | 10 +- .../Reciprocity/MaximalUnramifiedSymbol.lean | 6 +- .../Reciprocity/NormContinuity.lean | 6 +- .../Reciprocity/NormTopology.lean | 16 +- .../NormTopologyCharacterization.lean | 12 +- .../Reciprocity/ProfiniteAPI.lean | 8 +- .../Reciprocity/Reduction.lean | 10 +- .../Reciprocity/Sylow.lean | 8 +- .../Reciprocity/TotallyRamified.lean | 6 +- .../Reciprocity/TotallyRamifiedCase.lean | 18 +- .../Reciprocity/TotallyRamifiedCase/All.lean | 16 +- .../TotallyRamifiedCase/Conclusion.lean | 6 +- .../TotallyRamifiedCase/FixedSource.lean | 8 +- .../TotallyRamifiedCase/FrobeniusLift.lean | 6 +- .../TotallyRamifiedCase/FrobeniusNorms.lean | 6 +- .../RestrictionCosets.lean | 6 +- .../TotallyRamifiedCase/RestrictionEquiv.lean | 8 +- .../Reciprocity/ValuationContinuity.lean | 10 +- .../ClassFieldTheory/Algebra.lean | 10 +- .../Algebra/AbelianGaloisEquiv.lean | 6 +- ...initeAbelianIntermediateFieldAlgEquiv.lean | 8 +- .../IntermediateFieldAlgEquivOrderIso.lean | 6 +- .../AlgebraicNumberTheory.lean | 38 +- .../AlgebraicNumberTheory/Adele.lean | 24 +- .../AlgebraicNumberTheory/Adele/All.lean | 22 +- .../Adele/Coordinates.lean | 6 +- .../Adele/FinitePlaceTensorBlock.lean | 10 +- .../FiniteRestrictedProductBaseChange.lean | 10 +- .../Adele/InfinitePlaceTensorBlock.lean | 10 +- .../Adele/IntegralLocalFactor.lean | 24 +- .../Adele/IntegralTensorSupport.lean | 18 +- .../IntegralTensorSupport/AbsoluteValue.lean | 32 +- .../Adele/IntegralTensorSupport/All.lean | 16 +- .../FinitePlaceCompletion.lean | 6 +- .../IntegralTensorSupport/IdeleSupport.lean | 6 +- .../Adele/IntegralTensorSupport/Lattice.lean | 6 +- .../LocalTensorDecomposition.lean | 6 +- .../IntegralTensorSupport/Localization.lean | 6 +- .../Adele/LocalComponents.lean | 6 +- .../Adele/RestrictedAction.lean | 6 +- .../Adele/RestrictedProduct.lean | 8 +- .../AdeleBaseChange.lean | 8 +- .../AlgebraicNumberTheory/All.lean | 40 +- .../AlgebraicNumberTheory/Completion.lean | 24 +- .../Completion/AdicCompletionComparison.lean | 22 +- .../Completion/AdicCompletionMap.lean | 8 +- .../AlgebraicNumberTheory/Completion/All.lean | 22 +- .../Completion/ChosenLocalization.lean | 8 +- .../Completion/Comparison.lean | 8 +- .../Completion/ExtensionIndex.lean | 18 +- .../FinitePlaceAdicCompletionCongrEquiv.lean | 6 +- .../Completion/IntegerRingComparison.lean | 20 +- .../Completion/LocalizedValuation.lean | 12 +- .../Completion/UnramifiedComparison.lean | 14 +- .../Completion/UnramifiedComparison/All.lean | 12 +- .../CompletionToIdeal.lean | 12 +- .../IdealToCompletion.lean | 10 +- .../UnramifiedComparison/LocalNorm.lean | 8 +- .../RamificationIndex.lean | 10 +- .../CompositumEmbedding.lean | 8 +- .../FiniteAbelianCompositum.lean | 10 +- .../AlgebraicNumberTheory/Galois.lean | 28 +- .../Galois/AbsoluteAbelianization.lean | 12 +- .../AlgebraicNumberTheory/Galois/All.lean | 26 +- .../Galois/CyclicPrimeDegreeSubextension.lean | 6 +- .../Galois/CyclicPrimeSubextension.lean | 6 +- .../Galois/FixedFieldLattice.lean | 6 +- .../Galois/InfiniteBaseChange.lean | 10 +- .../Galois/MathlibAbsoluteAbelianization.lean | 10 +- .../MathlibAbsoluteGaloisBaseEquiv.lean | 10 +- .../Galois/MaximalAbelianSubextension.lean | 10 +- .../Galois/NormalFieldRange.lean | 6 +- .../Galois/RelativeAbelianization.lean | 6 +- .../Galois/UnboundedDegree.lean | 18 +- .../AlgebraicNumberTheory/Idele.lean | 58 +- .../AlgebraicNumberTheory/Idele/All.lean | 56 +- .../Idele/BaseChange.lean | 10 +- .../AlgebraicNumberTheory/Idele/Basic.lean | 10 +- .../Idele/ClassGroup.lean | 38 +- .../Idele/ClassGroup/AlgEquiv.lean | 14 +- .../ClassGroup/AlgEquivAdeleTopology.lean | 8 +- .../ClassGroup/AlgEquivFiniteIntegral.lean | 8 +- .../AlgEquivIdeleClassTopology.lean | 12 +- .../Idele/ClassGroup/AlgEquivTopology.lean | 8 +- .../Idele/ClassGroup/All.lean | 36 +- .../Idele/ClassGroup/BaseChange.lean | 10 +- .../ConnectedComponentQuotientCongr.lean | 14 +- .../Idele/ClassGroup/Core.lean | 10 +- .../Idele/ClassGroup/InfiniteAlgEquiv.lean | 8 +- .../Idele/ClassGroup/MathlibComparison.lean | 8 +- .../ClassGroup/MathlibTopologyComparison.lean | 10 +- .../Idele/ClassGroup/NormComparison.lean | 12 +- .../Idele/ClassGroup/NormalClosureNorm.lean | 12 +- .../Idele/ClassGroup/Tower.lean | 10 +- .../ClassGroup/TowerAlgEquivNaturality.lean | 8 +- .../Idele/ClassGroup/TowerBaseChange.lean | 8 +- .../Idele/Cohomology.lean | 16 +- .../Idele/Cohomology/All.lean | 14 +- .../Idele/Cohomology/Decomposition.lean | 36 +- .../Idele/Cohomology/Herbrand.lean | 12 +- .../Cohomology/HerbrandExactSequence.lean | 8 +- .../Idele/Cohomology/SPlaces.lean | 14 +- .../Idele/Cohomology/SPlaces/All.lean | 12 +- .../Idele/Cohomology/SPlaces/Herbrand.lean | 14 +- .../Cohomology/SPlaces/Herbrand/All.lean | 12 +- .../Cohomology/SPlaces/Herbrand/Factors.lean | 8 +- .../SPlaces/Herbrand/FamilyCardinality.lean | 6 +- .../SPlaces/Herbrand/FamilyFinite.lean | 6 +- .../Cohomology/SPlaces/Herbrand/Local.lean | 10 +- .../Idele/Cohomology/SPlaces/LocalBlocks.lean | 10 +- .../SPlaces/OutsideIntegralInduced.lean | 26 +- .../SPlaces/OutsideIntegralInduced/All.lean | 24 +- .../OutsideIntegralInduced/ChosenPlace.lean | 10 +- .../ChosenPlaceAction.lean | 16 +- .../ChosenPlaceIntegralBlock.lean | 10 +- .../ChosenPlaceIntegralBlockEquiv.lean | 8 +- .../ChosenPlaceIntegralBlockEquivApply.lean | 8 +- .../ChosenPlaceIntegralBlockInclusion.lean | 6 +- .../ChosenPlaceIntegralBlockInducedSmul.lean | 6 +- .../ChosenPlaceIntegralBlockTensorSmul.lean | 8 +- .../CompletionTransport.lean | 8 +- .../LocalInduction.lean | 14 +- .../LocalInduction/Action.lean | 6 +- .../LocalInduction/All.lean | 12 +- .../LocalInduction/Equiv.lean | 6 +- .../LocalInduction/Inclusion.lean | 6 +- .../LocalInduction/Spine.lean | 10 +- .../Cohomology/SPlaces/Reassociation.lean | 12 +- .../Idele/Cohomology/SupportedBridge.lean | 20 +- .../Idele/Extension.lean | 36 +- .../Idele/Extension/All.lean | 34 +- .../Idele/Extension/BaseChange.lean | 18 +- .../Idele/Extension/ClassGroup.lean | 8 +- .../Idele/Extension/EmbeddingNorm.lean | 8 +- .../Idele/Extension/GaloisDescent.lean | 12 +- .../Idele/Extension/GaloisNorm.lean | 12 +- .../Idele/Extension/IdealClass.lean | 14 +- .../Idele/Extension/IdeleClassBaseChange.lean | 10 +- .../Idele/Extension/IdeleNorm.lean | 8 +- .../Idele/Extension/IdeleNormComponents.lean | 12 +- .../Extension/InfiniteOnePlaceBaseNorm.lean | 10 +- .../Idele/Extension/LocalComponent.lean | 6 +- .../Idele/Extension/LocalNorm.lean | 10 +- .../Idele/Extension/NormLocalOrder.lean | 20 +- .../Idele/Extension/NormProperties.lean | 8 +- .../Idele/Extension/OnePlaceBaseNorm.lean | 10 +- .../FiniteMathlibTopologyComparison.lean | 10 +- .../Idele/FinitePrime.lean | 22 +- .../AlgebraicNumberTheory/Idele/IdealMap.lean | 10 +- .../Idele/IdentityComponent.lean | 12 +- .../Idele/LocallyCompact.lean | 10 +- .../AlgebraicNumberTheory/Idele/Norm.lean | 14 +- .../Idele/NormApproximation.lean | 10 +- .../Idele/NormApproximation/All.lean | 8 +- .../Idele/NormApproximation/FinitePlaces.lean | 30 +- .../NormApproximation/InfinitePlaces.lean | 20 +- .../AlgebraicNumberTheory/Idele/NormCore.lean | 10 +- .../Idele/NormOneCompact.lean | 18 +- .../Idele/NormTopology.lean | 18 +- .../Idele/NormTopology/All.lean | 16 +- .../Idele/NormTopology/ArchimedeanNorm.lean | 6 +- .../Idele/NormTopology/Continuity.lean | 24 +- .../Idele/NormTopology/ExtensionBehavior.lean | 6 +- .../NormTopology/FiniteNormArithmetic.lean | 18 +- .../Idele/NormTopology/IdeleClassNorm.lean | 10 +- .../Idele/NormTopology/NormOne.lean | 8 +- .../Idele/PositiveArchimedeanSection.lean | 12 +- .../Idele/Principal.lean | 12 +- .../Idele/PrincipalCore.lean | 6 +- .../Idele/PrincipalNorm.lean | 10 +- .../Idele/PrincipalTopology.lean | 10 +- .../AlgebraicNumberTheory/Idele/Relative.lean | 16 +- .../Idele/Relative/All.lean | 14 +- .../Relative/FiniteIntegralNormPreimage.lean | 34 +- .../Idele/Relative/FinitePlaceTensorNorm.lean | 10 +- .../Relative/InfinitePlaceTensorNorm.lean | 10 +- .../Idele/Relative/SPlaces.lean | 20 +- .../Idele/Relative/Support.lean | 6 +- .../Idele/RestrictedProductUnitsTopology.lean | 10 +- .../AlgebraicNumberTheory/Idele/SPlaces.lean | 10 +- .../Idele/SinglePlace.lean | 10 +- .../Idele/SufficientlyLarge.lean | 26 +- .../AlgebraicNumberTheory/Idele/Topology.lean | 6 +- .../AlgebraicNumberTheory/NormalClosure.lean | 10 +- .../AlgebraicNumberTheory/NumberField.lean | 38 +- .../NumberField/All.lean | 36 +- .../NumberField/CompletelySplitFinset.lean | 18 +- .../NumberField/CompletelySplitPrimes.lean | 18 +- .../CompletelySplitPrimesModFour.lean | 24 +- .../NumberField/DegreeOnePrimes.lean | 16 +- .../EverywhereUnramifiedTower.lean | 8 +- .../FiniteUnramifiedEtaleBridge.lean | 8 +- .../NumberField/FiniteUnramifiedTower.lean | 8 +- .../NumberField/GaloisDifferentBound.lean | 16 +- .../NumberField/IntegralPrimitiveElement.lean | 16 +- .../MathlibUnramifiedInterface.lean | 12 +- .../NumberField/PlaceEquiv.lean | 10 +- .../NumberField/RootDiscriminantBound.lean | 12 +- .../NumberField/SchurPrimeDivisors.lean | 22 +- .../NumberField/SmallModel.lean | 16 +- .../SupportedDiscriminantBound.lean | 20 +- .../NumberField/TameDifferentTrace.lean | 20 +- .../PowerResidueSymbols.lean | 10 +- .../PowerResidueSymbols/All.lean | 8 +- .../PowerResidueSymbols/FiniteField.lean | 8 +- .../PowerResidueSymbols/Ideal.lean | 10 +- .../QuadraticReciprocity.lean | 6 +- .../AlgebraicNumberTheory/Ramification.lean | 18 +- .../Ramification/All.lean | 16 +- .../Ramification/DegreeFromChosenPrimes.lean | 10 +- .../Ramification/DegreeProduct.lean | 10 +- .../Ramification/FiniteRamifiedPrimes.lean | 8 +- .../Ramification/RationalPrime.lean | 8 +- .../Ramification/Splitting.lean | 14 +- .../Ramification/Splitting/All.lean | 12 +- .../Ramification/Splitting/FinitePlace.lean | 8 +- .../Splitting/FinitePlaceIdeal.lean | 8 +- .../Ramification/Splitting/NormalClosure.lean | 10 +- .../Splitting/PrimeOrderFixedField.lean | 6 +- .../Ramification/UnramifiedRationals.lean | 6 +- .../AlgebraicNumberTheory/RayClass.lean | 30 +- .../AlgebraicNumberTheory/RayClass/All.lean | 28 +- .../RayClass/Approximation.lean | 6 +- .../AlgebraicNumberTheory/RayClass/Basic.lean | 8 +- .../RayClass/FullModulus.lean | 6 +- .../AlgebraicNumberTheory/RayClass/Ideal.lean | 18 +- .../RayClass/IdealNorm.lean | 20 +- .../RayClass/LocalConductor.lean | 8 +- .../RayClass/Narrow.lean | 6 +- .../OrdinaryClassGroupComparison.lean | 12 +- .../RayClass/PrimeGeneration.lean | 6 +- .../RayClass/PublicHigherUnitComparison.lean | 8 +- .../RayClass/Rational.lean | 18 +- .../RayClass/Topology.lean | 18 +- .../AlgebraicNumberTheory/SUnit.lean | 14 +- .../AlgebraicNumberTheory/SUnit/All.lean | 12 +- .../SUnit/GaloisAction.lean | 10 +- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 12 +- .../SUnit/LogLattice.lean | 12 +- .../AlgebraicNumberTheory/SUnit/Rank.lean | 18 +- .../SeparableClosureEmbedding.lean | 10 +- .../AlgebraicNumberTheory/TensorProduct.lean | 10 +- .../ClassFieldTheory/All.lean | 28 +- .../ClassFieldTheory/Definitions.lean | 20 +- .../ClassFieldTheory/Definitions/All.lean | 18 +- .../ConductorsAndRayClassFields.lean | 48 +- .../ConductorsAndRayClassFields/All.lean | 46 +- .../EmbedsInRayClassField.lean | 6 +- .../FractionalIdealNorm.lean | 8 +- .../FractionalIdealNormExponentMap.lean | 14 +- .../IsAbelianConductor.lean | 6 +- .../IsRayCongruent.lean | 8 +- .../IsUnramifiedOutsideModulus.lean | 10 +- .../NarrowClassGroup.lean | 10 +- .../NarrowRayClassModulus.lean | 8 +- .../OrdinaryRayClassModulus.lean | 6 +- .../ConductorsAndRayClassFields/RayArtin.lean | 6 +- .../RayClassFieldRealization.lean | 12 +- .../RayClassGroup.lean | 10 +- .../RayClassIdealModulusProjection.lean | 12 +- .../RayClassIdealNorm.lean | 10 +- .../RayClassModulus.lean | 14 +- .../RayClassOfFinitePrime.lean | 12 +- .../RayClassPrimeToIdeals.lean | 10 +- .../RayClassSubgroupQuotientEquiv.lean | 8 +- .../RayClassSubgroupRealization.lean | 12 +- .../RayLocalHigherUnitGroup.lean | 8 +- .../RayPrincipalIdealSubgroup.lean | 10 +- .../FrobeniusAndHilbertClassFields.lean | 24 +- .../FrobeniusAndHilbertClassFields/All.lean | 22 +- .../ArithmeticFrobeniusAt.lean | 12 +- .../FinitePrimeFractionalIdeal.lean | 10 +- .../FinitePrimeSplitsCompletely.lean | 8 +- .../IsBigHilbertClassField.lean | 8 +- .../IsEverywhereUnramified.lean | 8 +- .../IsSmallHilbertClassField.lean | 8 +- .../IsUnramifiedAtFinitePlaces.lean | 8 +- ...mberFieldFractionalIdealFactorization.lean | 12 +- .../NumberFieldFractionalIdealGroup.lean | 8 +- .../Definitions/GlobalClassFieldTheory.lean | 18 +- .../GlobalClassFieldTheory/All.lean | 16 +- .../FiniteAbelianExtension.lean | 10 +- .../FiniteAbelianReciprocityData.lean | 10 +- ...FiniteAbelianReciprocityQuotientEquiv.lean | 8 +- .../FinitePlaceTensorNormSubgroup.lean | 10 +- .../IdeleClassConnectedQuotient.lean | 12 +- .../IsMaximalAbelianGlobalArtin.lean | 8 +- .../Definitions/HasseArf.lean | 22 +- .../Definitions/HasseArf/All.lean | 20 +- .../HasseArf/HerbrandFunction.lean | 12 +- .../HerbrandFunctionAtLowerIndex.lean | 14 +- .../HasseArf/InverseHerbrandFunction.lean | 14 +- .../HasseArf/IsLowerRamificationJump.lean | 6 +- .../HasseArf/IsUpperRamificationJump.lean | 6 +- .../HasseArf/LowerRamificationGroup.lean | 6 +- .../HasseArf/RealLowerRamificationGroup.lean | 12 +- .../HasseArf/UpperRamificationGroup.lean | 8 +- .../Definitions/HilbertSymbols.lean | 36 +- .../Definitions/HilbertSymbols/All.lean | 34 +- .../FinitePlaceHilbertBadSet.lean | 6 +- .../GlobalHilbertPairingFamily.lean | 8 +- .../GlobalHilbertPairingFiniteFactor.lean | 10 +- .../GlobalHilbertPairingProperties.lean | 8 +- .../GlobalInfinitePlaceHilbertSymbol.lean | 8 +- .../HilbertSymbols/HilbertPairing.lean | 8 +- .../HilbertSymbols/HilbertPairingLaws.lean | 6 +- .../HilbertPairingNormResidueCriterion.lean | 8 +- .../HilbertSymbols/HilbertPairingSymbol.lean | 8 +- .../HilbertSymbols/IsKummerNorm.lean | 8 +- .../HilbertSymbols/IsLocalHilbertPairing.lean | 8 +- .../HilbertSymbols/KummerAlgebra.lean | 6 +- .../KummerAlgebraNormSubgroup.lean | 8 +- .../HilbertSymbols/PowerClass.lean | 6 +- .../HilbertSymbols/PowerClassGroup.lean | 8 +- .../Definitions/LocalClassFieldTheory.lean | 18 +- .../LocalClassFieldTheory/All.lean | 16 +- .../LocalClassFieldTheory/FieldNormHom.lean | 6 +- .../FieldNormQuotient.lean | 8 +- .../FieldNormSubgroup.lean | 6 +- .../FiniteAbelianLocalExtension.lean | 10 +- .../LocalClassFieldTheory/IsFieldNorm.lean | 6 +- .../OpenFiniteIndexSubgroup.lean | 8 +- .../Definitions/NormTheorems.lean | 14 +- .../Definitions/NormTheorems/All.lean | 12 +- .../NormTheorems/ExtendingAbsoluteValue.lean | 10 +- .../NormTheorems/IsEverywhereLocalNorm.lean | 8 +- .../NormTheorems/IsNormAtFinitePlace.lean | 10 +- .../NormTheorems/IsNormAtInfinitePlace.lean | 10 +- .../GlobalClassFieldTheory.lean | 16 +- .../GlobalClassFieldTheory/All.lean | 14 +- .../ClassFieldAxiom.lean | 28 +- .../ClassFieldAxiom/All.lean | 26 +- .../CyclicIdeleClassNormIndex.lean | 42 +- .../ClassFieldAxiom/HasseNormPrinciple.lean | 22 +- .../ClassFieldAxiom/IdeleClassFormation.lean | 12 +- .../IdeleClassPowerLocalUnitQuotient.lean | 22 +- .../IdeleClassPowerLocalUnitQuotient/All.lean | 20 +- .../ArchimedeanPowerIndex.lean | 14 +- .../FinitePlaceCompletionInstances.lean | 10 +- .../FinitePlacePowerIndex.lean | 12 +- .../LocalResidueArithmetic.lean | 16 +- .../NormContainment.lean | 36 +- .../PrimePowerKummerIndex.lean | 20 +- .../SupportedIdeleIndex.lean | 10 +- .../SupportedPrincipalQuotient.lean | 14 +- .../IdelePowerLocalUnitNormContainment.lean | 16 +- .../IdelePowerLocalUnitSubgroup.lean | 8 +- .../KummerLocalNormContainment.lean | 16 +- .../ClassFieldAxiom/MathlibNormInterface.lean | 10 +- .../SUnitKummerPrimeSelection.lean | 20 +- .../SUnitKummerPrimeSelection/All.lean | 18 +- .../BasePlaceSelection.lean | 10 +- .../SUnitKummerPrimeSelection/Conclusion.lean | 8 +- .../CoordinatePlaces.lean | 8 +- .../DecompositionFields.lean | 10 +- .../FinitePlaceDecomposition.lean | 12 +- .../SUnitKummerPrimeSelection/PrimeSet.lean | 6 +- .../RestrictionKernel.lean | 6 +- .../ClassFieldAxiom/SUnitLocalPowerMap.lean | 28 +- .../SupportedIdelePowerLocalUnitQuotient.lean | 8 +- .../GlobalClassFieldTheory/Cohomology.lean | 12 +- .../Cohomology/All.lean | 10 +- .../CofinitelySplitFiniteExtension.lean | 12 +- .../CyclicPrimePowerFullDecomposition.lean | 12 +- .../IdeleClassHerbrandSupportedFinal.lean | 52 +- .../GlobalClassFields.lean | 160 +- .../AbelianConductorExactness.lean | 24 +- .../AbelianConductorRamification.lean | 6 +- .../AbelianLocalConductorComparison.lean | 8 +- .../AbelianNormConductor.lean | 10 +- .../GlobalClassFields/All.lean | 158 +- .../ArithmeticClassFieldCorrespondence.lean | 24 +- ...rithmeticHilbertClassFieldReciprocity.lean | 16 +- .../ArithmeticRayClassFieldReciprocity.lean | 8 +- .../ArithmeticUnramifiedPrimeArtin.lean | 14 +- .../BigHilbertClassField.lean | 8 +- .../BigHilbertClassFieldMathlibArtin.lean | 18 +- .../BigHilbertClassFieldNaturality.lean | 8 +- .../BigHilbertClassFieldOverOriginalBase.lean | 6 +- .../ClassFieldRealization.lean | 10 +- ...osedFiniteIndexClassFieldConstruction.lean | 10 +- .../ClosedFiniteIndexClassFieldNormRange.lean | 6 +- ...sedFiniteIndexClassFieldOriginalField.lean | 6 +- ...losedFiniteIndexClassFieldReciprocity.lean | 14 +- .../Algebraic.lean | 10 +- .../Algebraic/All.lean | 8 +- .../Algebraic/Construction.lean | 14 +- .../Algebraic/Evaluation.lean | 6 +- .../All.lean | 12 +- .../Degree.lean | 8 +- .../GlobalNormResidue.lean | 8 +- .../Topological.lean | 16 +- .../Topological/All.lean | 14 +- .../Topological/Construction.lean | 6 +- .../Topological/Evaluation.lean | 6 +- .../Topological/EvaluationCore.lean | 6 +- .../Topological/EvaluationValue.lean | 6 +- .../Topological/QuotientTransport.lean | 6 +- .../GlobalClassFields/Conductor.lean | 6 +- .../GlobalClassFields/ConductorFrobenius.lean | 12 +- .../ConductorInfinitePart.lean | 6 +- .../GlobalClassFields/ConductorLattice.lean | 8 +- .../ConductorLocalComparison.lean | 8 +- .../ConductorPrimeArtin.lean | 10 +- .../ConductorRayClassMaximality.lean | 6 +- .../GlobalClassFields/ConductorSupport.lean | 18 +- .../CyclicConductorUniqueness.lean | 6 +- .../CyclicNormConductor.lean | 8 +- .../GlobalClassFields/CyclicNormTower.lean | 8 +- .../CyclicRayClassMaximality.lean | 8 +- .../CyclotomicKummerNormDescent.lean | 14 +- .../EmbeddedAbelianSubextension.lean | 10 +- .../FiniteAbelianClassFieldContainment.lean | 28 +- ...FiniteAbelianClassFieldCorrespondence.lean | 12 +- ...elianClassFieldCorrespondenceTopology.lean | 10 +- .../FiniteIndexNormClassField.lean | 10 +- .../FinitePlaceArtinQuotient.lean | 6 +- .../FullConductorRayClassField.lean | 8 +- .../HilbertClassFieldComparison.lean | 6 +- .../HilbertClassFieldMaximalSubextension.lean | 20 +- .../HilbertClassFieldMaximality.lean | 8 +- .../HilbertClassFieldPrimeSplitting.lean | 12 +- .../HilbertClassFieldRealization.lean | 28 +- .../HilbertClassFieldReciprocity.lean | 16 +- .../HilbertClassFieldReciprocity/All.lean | 14 +- .../BigActual.lean | 10 +- .../BigOriginal.lean | 8 +- .../SmallActual.lean | 8 +- .../SmallOriginal.lean | 8 +- .../Transport.lean | 6 +- ...HilbertClassFieldUnramifiedMaximality.lean | 20 +- .../HilbertNormCharacterization.lean | 10 +- ...finiteAbelianClassFieldCorrespondence.lean | 6 +- .../GlobalClassFields/KummerNormDescent.lean | 22 +- .../MathlibFrobeniusHilbertComparison.lean | 66 +- .../MathlibGlobalReciprocity.lean | 34 +- .../GlobalClassFields/NormConductor.lean | 20 +- .../GlobalClassFields/NormLimitation.lean | 10 +- .../NormRayClassMaximality.lean | 6 +- .../GlobalClassFields/NormTowerConductor.lean | 10 +- .../OrdinaryNormClassField.lean | 16 +- .../PowerCongruenceCore.lean | 22 +- .../PublicIdealArtinKernelComparison.lean | 12 +- .../PublicIdealNormArtinKernel.lean | 14 +- .../PublicIdealNormQuotientComparison.lean | 10 +- .../PublicRayClassComparison.lean | 44 +- .../RationalRayPrimeClass.lean | 14 +- .../RayClassFieldRealization.lean | 38 +- .../RayClassModulusProjection.lean | 12 +- .../GlobalClassFields/RayClassPrimeIdele.lean | 12 +- .../RayClassSubgroupFieldAntitone.lean | 8 +- .../RayClassSubgroupPrimeArtin.lean | 10 +- .../RayFrobeniusRigidity.lean | 12 +- .../GlobalClassFields/RayPrimeGeneration.lean | 8 +- .../SUnitKummerNormCore.lean | 20 +- .../SUnitKummerNormRealization.lean | 12 +- .../SmallHilbertClassField.lean | 12 +- .../SmallHilbertClassFieldMathlibArtin.lean | 20 +- ...lHilbertClassFieldMaximalSubextension.lean | 10 +- .../SmallHilbertClassFieldNaturality.lean | 8 +- ...mallHilbertClassFieldOverOriginalBase.lean | 6 +- .../SmallHilbertNormCharacterization.lean | 12 +- .../UnramifiedPrimeArtin.lean | 14 +- .../UnramifiedPrimeNormClass.lean | 12 +- .../IdealClassFieldTheory.lean | 50 +- .../AbstractCapitulation.lean | 16 +- .../IdealClassFieldTheory/All.lean | 48 +- .../ArithmeticIdealArtin.lean | 14 +- .../ArithmeticIdealDecompositionLaw.lean | 8 +- .../IdealClassFieldTheory/IdealArtinMap.lean | 10 +- .../IdealArtinQuotient.lean | 6 +- .../IdealDecompositionLaw.lean | 14 +- .../IdealClassFieldTheory/IdealFrobenius.lean | 6 +- .../IdealNormArtinExactness.lean | 6 +- .../IdealClassFieldTheory/NormLimitation.lean | 6 +- .../NormLimitationCore.lean | 6 +- .../NormLimitationStatement.lean | 8 +- .../PrincipalIdealTheorem.lean | 10 +- .../PrincipalIdealTower.lean | 12 +- .../PrincipalIdealTransfer.lean | 24 +- .../RationalAbstractExtensionToOrdinary.lean | 6 +- .../RationalFiniteNormTransfer.lean | 20 +- .../RationalFiniteNormTransfer/All.lean | 18 +- .../Compatibility.lean | 6 +- .../FieldSpine.lean | 8 +- .../FiniteNormClass.lean | 8 +- .../MembershipTypes.lean | 8 +- .../RationalFiniteNormTransfer/Quotient.lean | 6 +- .../Representatives.lean | 6 +- .../ZeroTransport.lean | 10 +- .../RationalFixedFieldBaseChange.lean | 6 +- .../SmallHilbertPrincipalization.lean | 10 +- .../SmallHilbertSplitting.lean | 8 +- .../SmallHilbertTowerConjugation.lean | 22 +- .../SmallHilbertTowerRealization.lean | 10 +- .../SmallHilbertTowerUnramified.lean | 12 +- .../GlobalClassFieldTheory/Reciprocity.lean | 174 +- .../AbstractFixedFieldGlobalNormResidue.lean | 8 +- .../Reciprocity/All.lean | 172 +- .../Reciprocity/ArithmeticNormalization.lean | 8 +- .../Reciprocity/ComplexificationArtin.lean | 18 +- .../ComplexificationArtin/All.lean | 16 +- .../InfinitePlaceCompatibility.lean | 8 +- .../InfinitePlaceOverfield.lean | 6 +- .../NumberFieldComplexification.lean | 10 +- .../OverextensionArtin.lean | 8 +- .../RamifiedOverextension.lean | 6 +- .../RationalComplexification.lean | 12 +- .../CyclotomicAbstractFixedFieldArtin.lean | 10 +- .../CyclotomicIdeleClassValuation.lean | 18 +- .../Reciprocity/CyclotomicIdeleValue.lean | 8 +- .../CyclotomicIdeleValueTopology.lean | 10 +- .../CyclotomicNormOneCorrection.lean | 10 +- .../Reciprocity/CyclotomicPrincipalIdele.lean | 6 +- .../CyclotomicTorsionFixedField.lean | 32 +- ...lotomicUnramifiedGeometricRestriction.lean | 6 +- ...micUnramifiedLocalGlobalCompatibility.lean | 8 +- .../CyclotomicUnramifiedRestriction.lean | 8 +- .../Reciprocity/CyclotomicZHatBaseChange.lean | 28 +- .../Reciprocity/FiniteGaloisRealization.lean | 10 +- .../FiniteGaloisRealizationCore.lean | 26 +- .../FiniteGaloisRealizationFinitePlace.lean | 6 +- .../FiniteGaloisRealizationNormQuotient.lean | 6 +- .../FiniteGaloisRealizationSubextension.lean | 8 +- .../Reciprocity/FiniteIdeleArtin.lean | 30 +- .../Reciprocity/FiniteLocalFamily.lean | 8 +- .../FinitePlaceAdicHilbertComparison.lean | 8 +- .../FinitePlaceAdicHilbertProductFormula.lean | 6 +- .../FinitePlaceAdicLocalField.lean | 20 +- .../Reciprocity/FinitePlaceArtin.lean | 20 +- .../Reciprocity/FinitePlaceArtin/All.lean | 18 +- .../FinitePlaceArtin/Conjugation.lean | 10 +- .../FinitePlaceArtin/Construction.lean | 30 +- .../Reciprocity/FinitePlaceArtin/Core.lean | 16 +- .../CrossLocalRestriction.lean | 8 +- .../FinitePlaceArtin/NormRestriction.lean | 8 +- .../FinitePlaceArtin/TowerRestriction.lean | 6 +- .../UnramifiedNormalization.lean | 10 +- .../FinitePlaceCyclotomicFrobeniusLift.lean | 26 +- .../Reciprocity/GlobalArtin.lean | 12 +- .../Reciprocity/GlobalArtinCompatibility.lean | 18 +- ...GlobalArtinFiniteSupportApproximation.lean | 10 +- .../Reciprocity/GlobalHilbertSymbol.lean | 34 +- .../Reciprocity/GlobalHilbertSymbol/All.lean | 32 +- .../Reciprocity/GlobalHilbertSymbol/Core.lean | 10 +- .../FinitePlaceCharacterComparison.lean | 10 +- .../FinitePlaceComparison.lean | 6 +- .../FinitePlaceFiniteSupport.lean | 8 +- .../FinitePlaceLocalGlobal.lean | 6 +- .../GlobalHilbertSymbol/InfinitePlace.lean | 8 +- .../InfinitePlaceCharacter.lean | 10 +- .../InfinitePlaceNegative.lean | 6 +- .../InfinitePlaceNegativeRoot.lean | 8 +- .../InfinitePlaceNegativeUnit.lean | 6 +- .../InfinitePlacePositive.lean | 10 +- .../InfinitePlaceRamification.lean | 6 +- .../InfinitePlaceRealComparison.lean | 6 +- .../InfinitePlaceRealSquare.lean | 8 +- .../Reciprocity/GlobalNormResidue.lean | 14 +- .../GlobalNormResidueAbelianization.lean | 6 +- ...alNormResidueAbelianizationNaturality.lean | 10 +- .../GlobalNormResidueNaturality.lean | 8 +- .../Reciprocity/HilbertFamilyAlgEquiv.lean | 8 +- .../HilbertFiniteFactorNaturality.lean | 8 +- .../Reciprocity/HilbertProductFormula.lean | 10 +- .../HilbertProductFormulaAlgEquiv.lean | 10 +- ...eleClassDirectLimitAbstractFixedField.lean | 8 +- .../IdeleClassDirectLimitCore.lean | 12 +- .../IdeleClassDirectLimitExtension.lean | 6 +- .../IdeleClassDirectLimitExtensionAction.lean | 6 +- .../IdeleClassDirectLimitExtensionNorm.lean | 6 +- .../IdeleClassDirectLimitFiniteLevel.lean | 6 +- .../IdeleClassDirectLimitFiniteLevelCore.lean | 12 +- ...leClassDirectLimitFiniteTowerNormCore.lean | 8 +- ...eClassDirectLimitFiniteTowerNormProof.lean | 6 +- ...ssDirectLimitFiniteTowerNormStatement.lean | 6 +- ...deleClassDirectLimitFixedPointDescent.lean | 6 +- ...ClassDirectLimitFixedPointDescentCore.lean | 10 +- .../IdeleClassDirectLimitFixedPoints.lean | 8 +- .../IdeleClassDirectLimitNormQuotient.lean | 8 +- .../Reciprocity/IdeleClassNormTopology.lean | 10 +- .../Reciprocity/InfiniteGlobalArtin.lean | 10 +- .../InfiniteGlobalArtinDescent.lean | 8 +- .../InfiniteGlobalArtinSurjectivity.lean | 10 +- .../InfiniteHilbertFactorNaturality.lean | 10 +- ...InfiniteLocalGlobalArtinCompatibility.lean | 22 +- .../Reciprocity/InfinitePlaceArtin.lean | 18 +- .../IntermediateNormAbelianization.lean | 8 +- .../LocalGlobalArtinCompatibility.lean | 14 +- .../LocalGlobalArtinCompatibility/All.lean | 12 +- .../Factorization.lean | 8 +- .../FinitePadicAuxiliaryField.lean | 12 +- .../FinitePadicCyclicData.lean | 6 +- .../SeparableClosurePadicLift.lean | 12 +- .../MathlibHilbertProductFormula.lean | 10 +- .../MathlibTopologicalGlobalReciprocity.lean | 14 +- .../MaximalAbelianGlobalArtin.lean | 10 +- .../Reciprocity/MaximalAbelianKernel.lean | 12 +- .../Reciprocity/NormQuotient.lean | 6 +- .../Reciprocity/OnePlaceNormKernel.lean | 12 +- .../Reciprocity/PowerResidueReciprocity.lean | 38 +- .../Reciprocity/ProductFormula.lean | 10 +- .../RationalCyclotomicArithmeticProduct.lean | 8 +- .../RationalCyclotomicCharacterRigidity.lean | 6 +- .../RationalCyclotomicFinitePlace.lean | 12 +- .../RationalCyclotomicFinitePlaceArtin.lean | 52 +- .../RationalCyclotomicLocalization.lean | 10 +- ...ationalCyclotomicPrincipalAwayProduct.lean | 8 +- ...ationalCyclotomicPrincipalPrimeFactor.lean | 6 +- .../RationalCyclotomicPrincipalProduct.lean | 8 +- .../RationalCyclotomicRayNorm.lean | 16 +- .../RationalCyclotomicZHatRigidity.lean | 8 +- .../RationalPrimeFactorization.lean | 6 +- .../RationalPrincipalLocalUnit.lean | 30 +- ...ionalQuadraticPowerResidueReciprocity.lean | 6 +- .../TopologicalGlobalNormResidue.lean | 12 +- ...ogicalGlobalNormResidueAbelianization.lean | 12 +- .../ClassFieldTheory/HasseArf.lean | 54 +- .../ClassFieldTheory/KroneckerWeber.lean | 36 +- .../ClassFieldTheory/KroneckerWeber/All.lean | 34 +- .../ClassFieldTheory/KroneckerWeber/Core.lean | 34 +- .../KroneckerWeber/Final.lean | 12 +- .../GlobalCompositumCyclotomicTarget.lean | 6 +- .../GlobalCompositumGlobalEmbedding.lean | 6 +- .../GlobalCompositumLeftFactors.lean | 12 +- ...GlobalCompositumLocalizationEmbedding.lean | 8 +- ...GlobalCompositumValuationInertiaBound.lean | 8 +- .../GlobalCompositumValuedEmbedding.lean | 8 +- .../GlobalPadicPrimePowInertiaBound.lean | 14 +- .../LocalCyclotomicEmbedding.lean | 32 +- ...tionalCyclotomicArithmeticReciprocity.lean | 8 +- .../RationalRayClassFieldCyclotomic.lean | 10 +- .../KroneckerWeber/RayClassComparison.lean | 10 +- .../KroneckerWeber/Setup.lean | 20 +- .../UnramifiedCompositumSupport.lean | 12 +- .../ClassFieldTheory/KummerTheory.lean | 8 +- .../ClassFieldTheory/KummerTheory/All.lean | 6 +- .../KummerTheory/Concrete.lean | 16 +- .../KummerTheory/Concrete/All.lean | 14 +- .../Concrete/CyclotomicPrimeBaseChange.lean | 8 +- .../Concrete/FinitePlaceDecomposition.lean | 12 +- .../Concrete/SUnitKummerUnramified.lean | 16 +- .../Concrete/SUnitPreparation.lean | 18 +- .../Concrete/SUnitPreparation/All.lean | 16 +- .../Concrete/SUnitPreparation/Core.lean | 16 +- .../EnlargedSUnitRestriction.lean | 8 +- .../FiniteRadicalSupport.lean | 6 +- .../FullSUnitKummerExtension.lean | 8 +- .../SUnitLocalPowerKernel.lean | 8 +- .../SUnitPreparation/SUnitPowerQuotient.lean | 12 +- .../SimpleExtensionLocalBehavior.lean | 64 +- .../LocalClassFieldTheory.lean | 16 +- .../LocalClassFieldTheory/All.lean | 14 +- .../LocalClassFieldTheory/ClassFormation.lean | 48 +- .../ClassFormation/All.lean | 46 +- .../ClassFormation/ArchimedeanHilbert90.lean | 24 +- .../ArchimedeanNormQuotient.lean | 14 +- .../ClassFormation/CohomologyBridge.lean | 14 +- .../ClassFormation/FieldUnitsHerbrand.lean | 14 +- .../FilteredLiftingSequence.lean | 6 +- .../ClassFormation/Hilbert90.lean | 8 +- .../ClassFormation/IntegerUnitsHerbrand.lean | 10 +- .../ClassFormation/LocalBlocks.lean | 16 +- .../ClassFormation/LocalBlocks/All.lean | 14 +- .../ClassFormation/LocalBlocks/Family.lean | 12 +- .../LocalBlocks/Family/All.lean | 10 +- .../ClassFormation/LocalBlocks/Family/H0.lean | 6 +- .../LocalBlocks/Family/HMinusOne.lean | 6 +- .../LocalBlocks/Family/Instances.lean | 8 +- .../LocalBlocks/FamilyClassAxiom.lean | 30 +- .../ClassFormation/LocalBlocks/Induced.lean | 8 +- .../ClassFormation/LocalBlocks/Tensor.lean | 14 +- .../LocalBlocks/TensorNorm.lean | 28 +- .../LocalizedCompletionCohomology.lean | 18 +- .../Algebra.lean | 6 +- .../LocalizedCompletionCohomology/All.lean | 16 +- .../Cardinality.lean | 14 +- .../Cardinality/All.lean | 12 +- .../Cardinality/H0.lean | 6 +- .../Cardinality/HMinusOne.lean | 6 +- .../Cardinality/Quotient.lean | 6 +- .../Cardinality/Trivial.lean | 6 +- .../CompMulEquiv.lean | 18 +- .../LocalizedCompletionCohomology/Finite.lean | 6 +- .../Generator.lean | 6 +- .../HerbrandEquiv.lean | 6 +- .../ClassFormation/Main.lean | 12 +- .../ClassFormation/NormalBasis.lean | 12 +- .../ClassFormation/NormalBasisCohomology.lean | 6 +- .../NormalBasisFiniteQuotient.lean | 8 +- .../NormalBasisGaloisAction.lean | 12 +- .../NormalBasisGradedLifting.lean | 12 +- .../NormalBasisInfiniteProduct.lean | 12 +- .../NormalBasisRecursiveLifting.lean | 8 +- .../ClassFormation/PrincipalUnitGraded.lean | 8 +- .../ClassFormation/Valuation.lean | 12 +- .../ClassFormation/ValuationHerbrand.lean | 8 +- .../ClassFormation/ValueGroupCohomology.lean | 12 +- .../LocalClassFieldTheory/Finite.lean | 18 +- .../LocalClassFieldTheory/Finite/All.lean | 16 +- .../Finite/Conductor.lean | 10 +- .../Finite/CyclotomicNorm.lean | 12 +- .../Finite/CyclotomicNorm/All.lean | 10 +- .../Finite/CyclotomicNorm/PrincipalUnits.lean | 12 +- .../CyclotomicNorm/StandardSubgroup.lean | 8 +- .../Finite/CyclotomicNorm/Unramified.lean | 30 +- .../Finite/Existence.lean | 66 +- .../Finite/Existence/All.lean | 64 +- .../Finite/Existence/CharacteristicZero.lean | 10 +- .../Finite/Existence/Classification.lean | 10 +- .../Existence/CyclotomicKummerDescent.lean | 12 +- .../Finite/Existence/EqualCharacteristic.lean | 324 +- ...qualCharacteristicDominatingExtension.lean | 10 +- .../Existence/FiniteUnramifiedField.lean | 14 +- .../Finite/Existence/KummerNormOpen.lean | 14 +- .../Finite/Existence/LocalAbsoluteData.lean | 10 +- .../LubinTateUniformizerDiagonal.lean | 14 +- .../Existence/MathlibFieldClassification.lean | 12 +- .../Finite/Existence/MaximalKummerNorm.lean | 12 +- .../Existence/NormSubgroupOrderEmbedding.lean | 12 +- .../Existence/NormSubgroupRingEquiv.lean | 8 +- .../Existence/NormSubgroupSurjectivity.lean | 12 +- .../Finite/Existence/OrderReversal.lean | 16 +- .../ShrinkChosenFiniteAbelianFields.lean | 8 +- .../ShrinkChosenFiniteAbelianNorms.lean | 8 +- .../Existence/ShrinkFiniteAbelianFields.lean | 10 +- .../Existence/ShrinkFiniteAbelianNorms.lean | 8 +- .../Existence/ShrinkIntermediateFields.lean | 8 +- .../Existence/ShrinkLocalClassification.lean | 10 +- .../Finite/Existence/ShrinkOpenSubgroups.lean | 10 +- .../Existence/ShrinkSeparableClosure.lean | 8 +- .../StandardDominatingExtension.lean | 10 +- .../Finite/Existence/StandardLubinTate.lean | 16 +- .../StandardSubgroupIntersection.lean | 16 +- .../UnramifiedLubinTateDiagonal.lean | 6 +- .../Existence/UnramifiedNormContainment.lean | 16 +- .../Existence/UnramifiedNormSubgroup.lean | 12 +- .../UnshrinkFiniteAbelianFields.lean | 6 +- .../Finite/LocalReciprocity.lean | 114 +- .../AbsoluteUnitsFixedField.lean | 10 +- .../AbstractFixedFieldNorm.lean | 10 +- .../AbstractFixedFieldUnits.lean | 12 +- .../Finite/LocalReciprocity/All.lean | 112 +- .../ConcreteReciprocityCanonical.lean | 10 +- .../ConcreteReciprocityPrimeNorm.lean | 8 +- .../ConcreteReciprocityTransport.lean | 16 +- .../ConjugationNaturality.lean | 8 +- .../Finite/LocalReciprocity/Core.lean | 134 +- .../Finite/LocalReciprocity/Filtered.lean | 24 +- .../Filtered/AbstractUnramified.lean | 270 +- .../Finite/LocalReciprocity/Filtered/All.lean | 22 +- .../LocalReciprocity/Filtered/Compositum.lean | 14 +- .../LocalReciprocity/Filtered/Core.lean | 12 +- .../Filtered/EqualCharacteristic.lean | 18 +- ...EqualCharacteristicStandardCompositum.lean | 10 +- .../Filtered/FiniteAbelian.lean | 24 +- .../Filtered/InertiaUnramifiedExtension.lean | 6 +- .../Filtered/StandardCompositum.lean | 12 +- .../LocalReciprocity/Filtered/Unramified.lean | 10 +- .../FiniteAbelianFamilyRigidity.lean | 6 +- .../FiniteAbelianFamilySubgroupKernel.lean | 12 +- ...niteAbelianFamilyUnramifiedCompositum.lean | 16 +- .../FiniteAbstractFixedField.lean | 12 +- .../FiniteExtensionClassFieldAxiom.lean | 16 +- .../FiniteGaloisRealization.lean | 12 +- .../FiniteResidueFinrankTransfer.lean | 12 +- .../FiniteResidueFrobenius.lean | 12 +- .../FiniteResidueValuationComparison.lean | 8 +- .../FiniteSubgroupResidueDegree.lean | 8 +- .../FixedFieldContinuousNaturality.lean | 10 +- .../FixedFieldIntrinsicReciprocity.lean | 34 +- .../FixedFieldIntrinsicReciprocity/All.lean | 34 +- .../AmbientNormResidue.lean | 8 +- .../AmbientPrimeComparison.lean | 10 +- .../AmbientPrimeNormTransport.lean | 8 +- .../AmbientPrimeSymbolSetup.lean | 8 +- .../AmbientPrimeTarget.lean | 10 +- .../AmbientPrimeWitness.lean | 12 +- .../AmbientPrimeWitnessComparison.lean | 12 +- .../BaseComparison.lean | 16 +- .../BaseComparison/All.lean | 14 +- .../EmbeddedExtensionQuotient.lean | 8 +- .../EmbeddedInertiaComparison.lean | 8 +- .../FixedFieldNormQuotient.lean | 12 +- .../FixedFieldSpecialization.lean | 8 +- .../IntrinsicBaseEquivalence.lean | 10 +- .../EmbeddedFrobeniusTransport.lean | 6 +- .../EmbeddedFrobeniusTransport/Fields.lean | 6 +- .../EmbeddedFrobeniusTransport/Groups.lean | 18 +- .../IntrinsicFrobeniusArtinComparison.lean | 8 +- .../IntrinsicFrobeniusClosure.lean | 8 +- .../IntrinsicFrobeniusFixedField.lean | 8 +- .../IntrinsicFrobeniusQuotientTransport.lean | 8 +- .../NormRestriction.lean | 8 +- .../PrimeComparison.lean | 10 +- .../LocalReciprocity/FixedFieldLocalData.lean | 14 +- .../FixedFieldNormResidueNaturality.lean | 14 +- .../FixedFieldRelativeNorm.lean | 12 +- .../GaloisExtensionQuotient.lean | 8 +- .../GeneralTowerNaturality.lean | 12 +- .../HenselianValuationBase.lean | 10 +- ...ntermediateFieldNormResidueNaturality.lean | 12 +- .../IntrinsicAbsoluteData.lean | 8 +- .../LocalClassFieldAxiom.lean | 12 +- .../LocalHenselianValuation.lean | 10 +- .../LocalReciprocity/LocalResidueDatum.lean | 12 +- .../Finite/LocalReciprocity/Main.lean | 12 +- .../LocalReciprocity/MathlibInterface.lean | 20 +- .../Finite/LocalReciprocity/NormResidue.lean | 8 +- .../NormResidueNaturality.lean | 8 +- .../ResidueAbsoluteDegree.lean | 12 +- .../ResidueAbsoluteFrobenius.lean | 6 +- .../LocalReciprocity/ResidueActionIndex.lean | 8 +- .../ResidueAlgebraicClosureDegree.lean | 8 +- .../ResidueAlgebraicallyClosed.lean | 12 +- .../Finite/LocalReciprocity/ResidueDatum.lean | 10 +- .../SemilinearNaturality.lean | 6 +- .../SeparableFixedFieldNorm.lean | 10 +- .../SeparableNormProduct.lean | 12 +- .../LocalReciprocity/SeparableUnitsNorm.lean | 12 +- .../LocalReciprocity/TateTransport.lean | 6 +- .../TopologicalReciprocity.lean | 24 +- .../UnramifiedComparison.lean | 14 +- .../UnramifiedNormComparison.lean | 14 +- .../UnramifiedNormalization.lean | 26 +- .../UnramifiedReciprocity.lean | 8 +- .../UnramifiedResidueUniqueness.lean | 10 +- .../LocalReciprocity/ValuationSemilinear.lean | 6 +- .../Finite/Unramified.lean | 16 +- .../Finite/Unramified/All.lean | 14 +- .../Finite/Unramified/Cohomology.lean | 20 +- .../Finite/Unramified/Norm.lean | 8 +- .../Finite/Unramified/PrincipalUnits.lean | 14 +- .../Finite/Unramified/PrincipalUnits/All.lean | 12 +- .../Unramified/PrincipalUnits/Basic.lean | 10 +- .../Unramified/PrincipalUnits/Lift.lean | 6 +- .../Unramified/PrincipalUnits/NormSide.lean | 8 +- .../Unramified/PrincipalUnits/Trace.lean | 8 +- .../Finite/Unramified/ResidueNorm.lean | 14 +- .../Finite/Unramified/Uniformizer.lean | 8 +- .../Finite/UnramifiedConductor.lean | 14 +- .../LocalClassFieldTheory/Infinite.lean | 32 +- .../Infinite/AbsoluteArtin.lean | 6 +- .../Infinite/AbsoluteArtinRestriction.lean | 6 +- .../AbsoluteFiniteQuotientTransitions.lean | 8 +- .../Infinite/AbsoluteFiniteQuotients.lean | 12 +- .../AbsoluteGaloisAbelianization.lean | 8 +- ...AbstractProfiniteCompletionComparison.lean | 6 +- .../LocalClassFieldTheory/Infinite/All.lean | 30 +- .../FiniteAbelianQuotientKernels.lean | 12 +- .../Infinite/FiniteReciprocityDiagram.lean | 8 +- .../LocalMultiplicativeCompletion.lean | 12 +- .../Infinite/ProfiniteCompletion.lean | 12 +- .../Infinite/ProfiniteCompletionCriteria.lean | 6 +- .../Infinite/ProfiniteLocalReciprocity.lean | 18 +- .../TopologicalAbelianizationCongr.lean | 10 +- .../LocalClassFieldTheory/Kummer.lean | 30 +- .../LocalClassFieldTheory/Kummer/All.lean | 28 +- .../Kummer/CanonicalKummerNorm.lean | 16 +- .../Kummer/KummerExponentTower.lean | 8 +- .../Kummer/KummerNormPowerClassDegree.lean | 22 +- .../LocalHilbertExponentCompatibility.lean | 10 +- .../Kummer/LocalHilbertPairing.lean | 12 +- .../LocalHilbertPairingNondegeneracy.lean | 8 +- .../Kummer/LocalHilbertSymbol.lean | 8 +- .../Kummer/LocalHilbertSymbolLaws.lean | 6 +- .../Kummer/MathlibHilbertPairing.lean | 18 +- .../Kummer/MaximalLocalKummerPairing.lean | 6 +- .../Kummer/PowerResidueTameFormula.lean | 22 +- .../Kummer/SmallHilbertPairingTransport.lean | 8 +- .../LubinTateApplication.lean | 46 +- .../LubinTateApplication/All.lean | 44 +- ...lCharacteristicRealFilteredComparison.lean | 10 +- ...racteristicTransportedArtinComparison.lean | 12 +- ...risticTransportedFixedFieldComparison.lean | 10 +- ...alCharacteristicTransportedLevelTower.lean | 8 +- ...sticTransportedRealFilteredComparison.lean | 8 +- ...cteristicTransportedUpperRamification.lean | 156 +- ...acteristicTransportedUpperRestriction.lean | 8 +- .../EqualCharacteristicUpperFiltration.lean | 14 +- .../LaurentPrincipalUnitTransport.lean | 6 +- .../LubinTateTransport.lean | 14 +- .../LubinTateApplication/NormIndex.lean | 12 +- .../LubinTateApplication/NormSubgroup.lean | 12 +- .../PadicMultiplicativeArtinComparison.lean | 20 +- .../StandardArtinComparison.lean | 22 +- .../StandardFilteredArtinComparison.lean | 14 +- .../StandardFixedFieldComparison.lean | 10 +- .../StandardNormIndex.lean | 12 +- .../StandardNormSubgroupExact.lean | 10 +- .../StandardSubgroupIndex.lean | 16 +- .../TransportedNormSubgroupExact.lean | 6 +- .../ClassFieldTheory/LocalFieldTheory.lean | 8 +- .../LocalFieldTheory/All.lean | 6 +- .../LocalFieldTheory/Padic.lean | 8 +- .../LocalFieldTheory/Padic/All.lean | 6 +- .../LocalFieldTheory/Padic/Cyclotomic.lean | 8 +- .../Padic/Cyclotomic/All.lean | 6 +- .../Padic/Cyclotomic/Unramified.lean | 8 +- .../Padic/Cyclotomic/Unramified/All.lean | 6 +- .../Unramified/CanonicalExtension.lean | 44 +- .../ClassFieldTheory/LubinTate.lean | 14 +- .../ClassFieldTheory/LubinTate/All.lean | 12 +- .../LubinTate/EqualCharacteristic.lean | 24 +- .../LubinTate/EqualCharacteristic/All.lean | 22 +- .../EqualCharacteristic/CompletedLevel.lean | 66 +- .../CompletedLevel/All.lean | 64 +- .../CompletedLevel/ChangedCompletedLevel.lean | 10 +- .../ChangedCompletedPrimitiveAction.lean | 12 +- .../ChangedPolynomialEvaluation.lean | 8 +- .../CompletedLevel/ChangedUniformizer.lean | 10 +- .../ChangedUniformizerNormalization.lean | 8 +- .../CompletedFrobeniusBaseEquiv.lean | 6 +- .../CompletedFrobeniusContinuity.lean | 6 +- .../CompletedFrobeniusFixedField.lean | 10 +- .../CompletedFrobeniusFixedFieldAlgebra.lean | 6 +- ...FrobeniusFixedFieldCoefficientDescent.lean | 6 +- .../CompletedFrobeniusFixedFieldDegree.lean | 8 +- ...ompletedFrobeniusFixedFieldGeneration.lean | 6 +- ...ompletedFrobeniusFixedFieldPowerBasis.lean | 6 +- ...CompletedFrobeniusFixedFieldPrimitive.lean | 10 +- .../CompletedFrobeniusFixedNorm.lean | 6 +- .../CompletedFrobeniusLift.lean | 6 +- .../CompletedLevel/CompletedLevel.lean | 18 +- .../CompletedPrimitiveAction.lean | 10 +- .../CompletedPrimitiveIrreducible.lean | 12 +- .../DirectBracketAtCompletedLevel.lean | 10 +- .../DirectLubinTateBracket.lean | 8 +- .../DirectLubinTateBracketRecursion.lean | 8 +- .../DirectTargetLevelEmbedding.lean | 10 +- .../DirectThetaAtCompletedLevel.lean | 10 +- .../DirectThetaFirstIdentity.lean | 10 +- .../DirectThetaFrobeniusFixed.lean | 10 +- .../CompletedLevel/DirectThetaIteration.lean | 8 +- .../CompletedLevel/DirectThetaSeries.lean | 8 +- .../CompletedLevel/ThetaAtCompletedLevel.lean | 12 +- .../CompletedLevel/ThetaLocalInverse.lean | 8 +- .../EqualCharacteristic/Existence.lean | 12 +- .../EqualCharacteristic/Existence/All.lean | 10 +- .../Existence/LaurentLocalField.lean | 8 +- .../Existence/LaurentModel.lean | 6 +- .../LaurentUniformizerNormalization.lean | 10 +- .../EqualCharacteristic/FiniteLevel.lean | 32 +- .../EqualCharacteristic/FiniteLevel/All.lean | 30 +- .../FiniteLevel/AmbientDivisionTorsion.lean | 6 +- .../FiniteLevel/DivisionPolynomial.lean | 10 +- .../FiniteLevel/FiniteParameters.lean | 8 +- .../FiniteLevel/FreeRankOne.lean | 16 +- .../FiniteLevel/LevelAbelian.lean | 10 +- .../FiniteLevel/LevelAutomorphisms.lean | 14 +- .../FiniteLevel/LevelField.lean | 10 +- .../FiniteLevel/LevelFieldTower.lean | 8 +- .../FiniteLevel/NormUniformizer.lean | 8 +- .../FiniteLevel/PrimitiveAction.lean | 10 +- .../FiniteLevel/PrimitiveIrreducible.lean | 12 +- .../FiniteLevel/PrimitiveTorsion.lean | 8 +- .../FiniteLevel/UnitQuotientGalois.lean | 148 +- .../EqualCharacteristic/FormalModule.lean | 14 +- .../EqualCharacteristic/FormalModule/All.lean | 12 +- .../FormalModule/AmbientBracketAction.lean | 8 +- .../DivisionModuleEndomorphisms.lean | 10 +- .../FormalModule/LubinTateAction.lean | 6 +- .../FormalModule/LubinTateEndomorphism.lean | 12 +- .../EqualCharacteristic/Frobenius.lean | 14 +- .../EqualCharacteristic/Frobenius/All.lean | 12 +- .../Frobenius/CoefficientFrobenius.lean | 10 +- .../Frobenius/CompletedUnramifiedField.lean | 12 +- .../Frobenius/ContractingEquation.lean | 8 +- .../Frobenius/LaurentSeriesFrobenius.lean | 16 +- .../EqualCharacteristic/NormSubgroup.lean | 32 +- .../EqualCharacteristic/NormSubgroup/All.lean | 30 +- .../HigherUnitFixedFieldEmbedding.lean | 8 +- .../HigherUnitFixedFieldEquiv.lean | 6 +- .../HigherUnitFixedFieldMembership.lean | 6 +- .../HigherUnitFixedFieldSurjective.lean | 8 +- .../HigherUnitFrobeniusFixed.lean | 8 +- .../NormSubgroup/HigherUnitLevelMapFixed.lean | 10 +- .../NormSubgroup/HigherUnits.lean | 10 +- .../NormSubgroup/HigherUnitsNorm.lean | 12 +- .../NormSubgroup/LevelAlgebra.lean | 8 +- .../NormSubgroup/StandardSubgroupNorm.lean | 8 +- .../NormSubgroup/UniformizerNorm.lean | 8 +- .../NormSubgroup/UnitQuotientCard.lean | 14 +- .../NormSubgroup/UnitTransport.lean | 14 +- .../EqualCharacteristic/Ramification.lean | 16 +- .../EqualCharacteristic/Ramification/All.lean | 14 +- .../Ramification/Core.lean | 14 +- .../Ramification/DisplacementValuation.lean | 10 +- .../Ramification/GaloisAction.lean | 8 +- .../Ramification/LowerGroups.lean | 12 +- .../Ramification/PrimitivePoint.lean | 28 +- .../EqualCharacteristic/RealIndexSteps.lean | 8 +- .../LubinTate/EqualCharacteristic/Theta.lean | 16 +- .../EqualCharacteristic/Theta/All.lean | 14 +- .../Theta/ThetaCoefficients.lean | 18 +- .../Theta/ThetaEvaluation.lean | 10 +- .../Theta/ThetaFirstIdentity.lean | 8 +- .../Theta/ThetaSeries.lean | 10 +- .../Theta/ThetaUniqueness.lean | 8 +- .../LubinTate/FiniteLevel.lean | 64 +- .../LubinTate/FiniteLevel/All.lean | 62 +- .../FiniteLevel/ChangedLevelCompositum.lean | 10 +- .../ChangedPrimitiveEvaluation.lean | 20 +- .../FiniteLevel/ChangedUniformizer.lean | 28 +- .../FiniteLevel/CompletedEvaluation.lean | 14 +- .../FiniteLevel/CompletedIterates.lean | 6 +- .../FiniteLevel/DivisionPolynomial.lean | 8 +- .../FiniteParameterFiltration.lean | 6 +- .../FiniteLevel/FiniteParameters.lean | 10 +- .../GaloisParameterFiltration.lean | 8 +- .../FiniteLevel/HerbrandFormula.lean | 8 +- .../FiniteLevel/HigherUnitLevelEquiv.lean | 20 +- .../LubinTate/FiniteLevel/LevelAbelian.lean | 8 +- .../FiniteLevel/LevelAutomorphisms.lean | 10 +- .../FiniteLevel/LevelFieldTower.lean | 8 +- .../LubinTate/FiniteLevel/LevelValuation.lean | 10 +- .../FiniteLevel/LocalUpperRamification.lean | 16 +- .../FiniteLevel/LowerRamification.lean | 12 +- .../FiniteLevel/LowerRamificationFormula.lean | 10 +- .../LubinTate/FiniteLevel/NormSubgroup.lean | 8 +- .../FiniteLevel/NormUniformizer.lean | 8 +- .../FiniteLevel/ParameterCongruence.lean | 8 +- .../FiniteLevel/PrimitiveAction.lean | 12 +- .../FiniteLevel/PrimitiveDisplacement.lean | 14 +- .../FiniteLevel/PrimitiveEisenstein.lean | 8 +- .../LubinTate/FiniteLevel/PrimitiveRoot.lean | 12 +- .../FiniteLevel/PrimitiveTorsion.lean | 6 +- .../FiniteLevel/PrimitiveUniformizer.lean | 18 +- .../FiniteLevel/StandardLocalField.lean | 16 +- .../FiniteLevel/UpperRamification.lean | 8 +- .../LubinTate/FormalModule.lean | 28 +- .../LubinTate/FormalModule/All.lean | 26 +- .../FormalModule/CoefficientEquation.lean | 6 +- .../FormalModule/DegreeStabilization.lean | 8 +- .../LubinTate/FormalModule/Intertwiner.lean | 10 +- .../LubinTate/FormalModule/LinearTerm.lean | 8 +- .../FormalModule/RecursiveCoefficient.lean | 6 +- .../FormalModule/RecursiveCorrection.lean | 6 +- .../FormalModule/RecursiveIntertwiner.lean | 8 +- .../LubinTate/FormalModule/Reduction.lean | 14 +- .../LubinTate/FormalModule/Series.lean | 10 +- .../FormalModule/StandardFormalGroup.lean | 10 +- .../FormalModule/StandardSeries.lean | 6 +- .../ClassFieldTheory/LubinTate/Padic.lean | 52 +- .../ClassFieldTheory/LubinTate/Padic/All.lean | 50 +- .../Padic/ChangedUniformizerCoefficient.lean | 14 +- .../Padic/ChangedUniformizerIntertwiner.lean | 16 +- .../ChangedUniformizerIntertwiner/All.lean | 14 +- .../CompletedSeries.lean | 12 +- .../DefectCorrection.lean | 14 +- .../IntertwinerConstruction.lean | 6 +- .../ScalarCompatibility.lean | 6 +- .../ScalarEndomorphisms.lean | 14 +- .../CompletedChangedStandardCompositum.lean | 10 +- .../CompletedChangedStandardFixedField.lean | 6 +- .../CompletedChangedStandardFrobenius.lean | 8 +- .../CompletedChangedStandardResidue.lean | 12 +- .../CompletedChangedStandardUnramified.lean | 22 +- ...CompletedChangedUniformizerFixedField.lean | 12 +- .../CompletedChangedUniformizerPrimitive.lean | 8 +- ...CompletedChangedUniformizerThetaFixed.lean | 6 +- .../Padic/CompletedFrobeniusEvaluation.lean | 8 +- .../Padic/CompletedFrobeniusLift.lean | 6 +- .../LubinTate/Padic/CompletedLevel.lean | 18 +- .../Padic/CompletedPrimitiveAction.lean | 12 +- .../Padic/CompletedPrimitiveIrreducible.lean | 8 +- .../Padic/CompletedPrimitiveUniformizer.lean | 10 +- .../Padic/CompletedResidueFrobenius.lean | 8 +- .../CompletedStandardLevelTransport.lean | 8 +- .../Padic/CompletedUnramifiedField.lean | 12 +- .../CompletedUnramifiedFrobeniusFixed.lean | 8 +- .../Padic/MultiplicativeEvaluation.lean | 18 +- .../Padic/MultiplicativeEvaluation/All.lean | 16 +- .../CompletedCoefficientEvaluation.lean | 8 +- .../CompletedPrimitivePoint.lean | 8 +- .../CompletedScalarEndomorphism.lean | 18 +- .../Padic/MultiplicativeEvaluation/Core.lean | 24 +- .../FiniteLevelEvaluation.lean | 10 +- .../FiniteLevelPrimitiveRoot.lean | 12 +- .../Padic/MultiplicativeIntertwiner.lean | 8 +- .../LubinTate/Padic/MultiplicativeSeries.lean | 10 +- .../ClassFieldTheory/RamificationTheory.lean | 10 +- .../RamificationTheory/All.lean | 8 +- .../HilbertRamification.lean | 14 +- .../HilbertRamification/All.lean | 12 +- .../HilbertRamification/Dedekind.lean | 12 +- .../HilbertRamification/Dedekind/All.lean | 10 +- .../Dedekind/ChosenInertiaCoverage.lean | 14 +- .../Dedekind/InertiaGeneration.lean | 10 +- .../Dedekind/PadicValuationInertia.lean | 20 +- .../PadicCyclotomicInertiaBound.lean | 12 +- ...PadicCyclotomicRamificationIndexBound.lean | 10 +- .../PadicLocalizationCanonicalValuation.lean | 32 +- .../RamificationIndexComparison.lean | 8 +- .../ClassFieldTheory/Theorems.lean | 22 +- .../ClassFieldTheory/Theorems/All.lean | 20 +- .../Theorems/ConductorsAndRayClassFields.lean | 100 +- ...AbelianConductorFiniteExponentIsLeast.lean | 14 +- .../AbelianConductorFiniteNormCriterion.lean | 20 +- .../AbelianConductorFiniteSupport.lean | 8 +- .../AbelianConductorFiniteUnramified.lean | 12 +- .../AbelianConductorRayClassFieldLe.lean | 8 +- .../AbelianConductorRealRamification.lean | 12 +- .../AbelianConductorTameCriterion.lean | 20 +- .../ConductorsAndRayClassFields/All.lean | 98 +- ...EmbedsInEveryRayClassFieldRealization.lean | 10 +- .../EmbedsInRayClassFieldIffConductorLe.lean | 8 +- .../ExistsAbelianConductor.lean | 8 +- .../ExistsRayArtinModulusProjection.lean | 20 +- .../ExistsUniqueAbelianConductor.lean | 10 +- .../FractionalIdealNormPrimeExponent.lean | 6 +- .../IsAbelianConductorUnique.lean | 6 +- .../IsRayCongruentOfLe.lean | 8 +- ...rowRayClassGroupEquivNarrowClassGroup.lean | 14 +- .../OrdinaryNarrowModuliEqOfNoReal.lean | 8 +- .../OrdinaryRayClassGroupEquivClassGroup.lean | 16 +- .../RayArtinModulusProjection.lean | 18 +- .../RayClassFieldDegree.lean | 8 +- .../RayClassFieldModulusMonotone.lean | 8 +- .../RayClassFieldPrimeSplitting.lean | 12 +- .../RayClassFieldReciprocity.lean | 8 +- .../RayClassGroupFinite.lean | 10 +- .../RayClassGroupHomExtFinitePrime.lean | 10 +- ...sIdealArtinKerEqNormRangeSupPrincipal.lean | 10 +- .../RayClassIdealModulusProjectionPrime.lean | 10 +- ...ClassIdealModulusProjectionSurjective.lean | 12 +- .../RayClassIdealNormImageEqArtinKer.lean | 12 +- .../RayClassIdealNormImageLeArtinKer.lean | 10 +- .../RayClassSubgroupDegree.lean | 6 +- .../RayClassSubgroupEmbedding.lean | 18 +- .../RayClassSubgroupExistence.lean | 10 +- .../RayClassSubgroupFieldAntitone.lean | 8 +- .../RayClassSubgroupPrimeInertiaDegree.lean | 10 +- .../RayClassSubgroupPrimeSplitting.lean | 10 +- .../RayClassSubgroupQuotient.lean | 6 +- .../RayClassSubgroupQuotientEquivMk.lean | 6 +- .../RayClassSubgroupRealizationEq.lean | 8 +- .../RayClassSubgroupRealizationEquiv.lean | 10 +- .../RayLocalHigherUnitAntitone.lean | 8 +- .../RayLocalHigherUnitMembership.lean | 10 +- .../RayLocalHigherUnitOneAdd.lean | 16 +- .../RayLocalHigherUnitOpen.lean | 8 +- .../RayLocalHigherUnitZero.lean | 8 +- .../RayPrincipalIdealMembership.lean | 8 +- .../RayPrincipalIdealPrimeTo.lean | 10 +- .../FrobeniusAndHilbertClassFields.lean | 58 +- .../FrobeniusAndHilbertClassFields/All.lean | 56 +- .../ArithmeticFrobeniusAlgEquivTransport.lean | 14 +- ...eticFrobeniusEqOneIffSplitsCompletely.lean | 10 +- ...ArithmeticFrobeniusIndependentOfPrime.lean | 12 +- .../ArithmeticFrobeniusIsArithmetic.lean | 6 +- .../ArithmeticFrobeniusOrder.lean | 12 +- .../ArithmeticFrobeniusRestrictTower.lean | 10 +- .../BigHilbertClassFieldArtinEquiv.lean | 18 +- .../BigHilbertClassFieldDegree.lean | 16 +- .../BigHilbertClassFieldExists.lean | 10 +- ...HilbertClassFieldNarrowRayRealization.lean | 12 +- .../BigHilbertClassFieldPrimeSplitting.lean | 14 +- ...sFieldPrimeSplittingPositivePrincipal.lean | 14 +- .../BigHilbertClassFieldUnique.lean | 6 +- ...wRayRealizationIsBigHilbertClassField.lean | 16 +- ...ayRealizationIsSmallHilbertClassField.lean | 16 +- .../SmallBigHilbertClassFieldIffOfNoReal.lean | 12 +- .../SmallHilbertClassFieldArtinEquiv.lean | 18 +- .../SmallHilbertClassFieldDegree.lean | 12 +- .../SmallHilbertClassFieldEmbedsInBig.lean | 8 +- .../SmallHilbertClassFieldExists.lean | 10 +- .../SmallHilbertClassFieldLeBig.lean | 8 +- ...lbertClassFieldOrdinaryRayRealization.lean | 12 +- .../SmallHilbertClassFieldPrimeSplitting.lean | 14 +- ...mallHilbertClassFieldPrincipalization.lean | 10 +- .../SmallHilbertClassFieldUnique.lean | 6 +- ...SmallHilbertClassFieldUniqueUpToEquiv.lean | 8 +- .../Theorems/GlobalClassFieldTheory.lean | 26 +- .../Theorems/GlobalClassFieldTheory/All.lean | 24 +- .../FiniteAbelianGlobalReciprocity.lean | 10 +- ...initeAbelianGlobalReciprocityQuotient.lean | 8 +- ...niteAbelianReciprocityQuotientEquivMk.lean | 6 +- .../FinitePlaceCompletionLocalArtin.lean | 20 +- .../FinitePlaceLocalGlobalNormKernel.lean | 22 +- .../FinitePlaceRayArtinDecomposition.lean | 24 +- .../FinitePlaceRayArtinLocalValue.lean | 28 +- .../FinitePlaceRayArtinNormKernel.lean | 14 +- .../MaximalAbelianGlobalArtin.lean | 8 +- .../TopologicalGlobalReciprocity.lean | 20 +- .../ClassFieldTheory/Theorems/HasseArf.lean | 48 +- .../Theorems/HasseArf/All.lean | 46 +- .../Theorems/HasseArf/HasseArf.lean | 16 +- ...erbrandFunctionAtLowerIndexDifference.lean | 8 +- ...HerbrandFunctionAtLowerIndexNatOfJump.lean | 12 +- ...erbrandFunctionAtLowerIndexStrictMono.lean | 12 +- .../HasseArf/HerbrandFunctionCanonical.lean | 10 +- ...rbrandFunctionInverseHerbrandFunction.lean | 12 +- .../HasseArf/HerbrandFunctionNat.lean | 6 +- ...verseHerbrandFunctionHerbrandFunction.lean | 12 +- .../HasseArf/IsUpperRamificationJumpInt.lean | 12 +- .../LowerRamificationGroupAntitone.lean | 6 +- .../LowerRamificationGroupEventuallyBot.lean | 14 +- .../LowerRamificationGroupNormal.lean | 6 +- .../LowerRamificationGroupZeroEqInertia.lean | 6 +- .../RealAndUpperRamificationGroupNormal.lean | 8 +- .../RealLowerRamificationGroupCanonical.lean | 14 +- .../RealLowerRamificationGroupNat.lean | 8 +- .../RealLowerRamificationGroupNormal.lean | 6 +- .../HasseArf/UpperRamificationGroupAfter.lean | 8 +- .../UpperRamificationGroupAntitone.lean | 12 +- .../UpperRamificationGroupCanonical.lean | 8 +- .../UpperRamificationGroupEventuallyBot.lean | 16 +- .../Theorems/HilbertSymbols.lean | 70 +- .../Theorems/HilbertSymbols/All.lean | 68 +- .../FinitePlaceHilbertBadSetFinite.lean | 8 +- .../GlobalHilbertPairingFiniteSupport.lean | 8 +- .../GlobalHilbertPairingSupportBound.lean | 12 +- .../HilbertSymbols/HilbertPairingPerfect.lean | 12 +- .../HilbertPairingSymbolMul.lean | 6 +- .../HilbertPairingSymbolMulRight.lean | 6 +- .../HilbertSymbols/HilbertProductFormula.lean | 20 +- .../KummerAlgebraCopiesOfSimpleFactor.lean | 14 +- .../KummerAlgebraFiniteEtale.lean | 12 +- .../KummerAlgebraFiniteFree.lean | 8 +- .../HilbertSymbols/KummerAlgebraFinrank.lean | 8 +- ...KummerAlgebraNormIffSimpleRadicalNorm.lean | 8 +- .../KummerAlgebraNormIndex.lean | 10 +- .../KummerAlgebraNormProduct.lean | 10 +- .../KummerAlgebraOneNormSurjective.lean | 10 +- .../KummerAlgebraProductDecomposition.lean | 14 +- .../KummerAlgebraUniformFactorDegree.lean | 14 +- .../KummerAlgebraUniformFieldFactors.lean | 12 +- .../KummerRadicalDegreeEqPowerClassOrder.lean | 16 +- ...LocalHilbertPairingArtinNormalization.lean | 16 +- .../LocalHilbertPairingExists.lean | 12 +- ...alHilbertPairingExponentCompatibility.lean | 16 +- .../LocalHilbertPairingInverse.lean | 8 +- .../LocalHilbertPairingNormCriterion.lean | 12 +- .../LocalHilbertPairingPerfectExists.lean | 14 +- .../HilbertSymbols/PowerClassEqIff.lean | 6 +- .../HilbertSymbols/PowerClassEqOneIff.lean | 6 +- .../HilbertSymbols/PowerClassGroupFinite.lean | 12 +- .../HilbertSymbols/PowerClassInv.lean | 6 +- .../HilbertSymbols/PowerClassMul.lean | 6 +- .../HilbertSymbols/PowerClassPow.lean | 6 +- .../RootQuotientChoiceIndependence.lean | 8 +- .../Theorems/KroneckerWeber.lean | 12 +- .../Theorems/LocalClassFieldTheory.lean | 46 +- .../Theorems/LocalClassFieldTheory/All.lean | 44 +- .../FieldNormSubgroupFiniteIndex.lean | 12 +- .../FieldNormSubgroupIsOpen.lean | 12 +- .../FieldNormSubgroupRingEquiv.lean | 10 +- .../FieldNormSubgroupTower.lean | 8 +- .../FiniteAbelianLocalExistence.lean | 10 +- .../FiniteAbelianLocalExistenceOrderIso.lean | 16 +- .../FiniteAbelianLocalReciprocity.lean | 14 +- .../FiniteAbelianLocalReciprocityFamily.lean | 8 +- ...lReciprocityFamilyArithmeticFrobenius.lean | 18 +- ...initeAbelianLocalReciprocityFamilyExt.lean | 30 +- ...iprocityFamilyUnramifiedNormalization.lean | 20 +- .../FiniteAbelianLocalReciprocityIndex.lean | 12 +- ...FiniteAbelianLocalReciprocityQuotient.lean | 16 +- ...belianLocalReciprocityQuotientEquivMk.lean | 16 +- ...nLocalReciprocityQuotientEquivOfArtin.lean | 18 +- .../FiniteAbelianLocalReciprocityTower.lean | 8 +- ...anLocalReciprocityUnramifiedFamilyExt.lean | 16 +- ...elianLocalReciprocityUnramifiedHomExt.lean | 20 +- ...calReciprocityUnramifiedNormalization.lean | 18 +- .../MemFieldNormSubgroupIff.lean | 6 +- .../Theorems/NormTheorems.lean | 24 +- .../Theorems/NormTheorems/All.lean | 22 +- .../CompletionTensorNormDecomposition.lean | 12 +- ...etionTensorNormDecompositionCanonical.lean | 14 +- .../ComplexInfinitePlaceAllNorm.lean | 8 +- .../NormTheorems/CyclicHasseNormTheorem.lean | 14 +- .../GlobalNormIsEverywhereLocalNorm.lean | 10 +- .../NormTheorems/InfiniteNormIffPositive.lean | 10 +- .../NegativeOneNotInfiniteNorm.lean | 10 +- .../NormTheorems/TensorNormBaseChange.lean | 8 +- .../UnramifiedInfinitePlaceAllNorm.lean | 8 +- .../ClassFieldTheory/GaloisCohomology.lean | 14 +- .../GaloisCohomology/Cyclic.lean | 16 +- .../Cyclic/GaloisCohomology.lean | 10 +- .../GaloisCohomology/Cyclic/Herbrand.lean | 18 +- .../Cyclic/Herbrand/HerbrandFiniteness.lean | 12 +- .../Cyclic/Herbrand/HerbrandLowDegree.lean | 20 +- .../Herbrand/HerbrandLowDegree/Basic.lean | 22 +- .../HerbrandLowDegree/BinaryProduct.lean | 10 +- .../HerbrandLowDegree/Cardinality.lean | 8 +- .../Herbrand/HerbrandLowDegree/Core.lean | 8 +- .../HerbrandLowDegree/EquivariantEquiv.lean | 10 +- .../Herbrand/HerbrandLowDegree/Index.lean | 6 +- .../Herbrand/HerbrandLowDegree/Product.lean | 6 +- .../HerbrandLowDegree/TateComparison.lean | 8 +- .../Cyclic/Herbrand/Induced.lean | 10 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 10 +- .../Cyclic/Herbrand/Permutation.lean | 10 +- .../Cyclic/Herbrand/Permutation/Lattice.lean | 10 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 8 +- .../Cyclic/Herbrand/Permutation/Module.lean | 16 +- .../Cyclic/Herbrand/PrincipalUnits.lean | 8 +- .../Herbrand/PrincipalUnits/QuotientReps.lean | 6 +- .../PrincipalUnits/QuotientTower.lean | 12 +- .../Cyclic/Herbrand/Product.lean | 6 +- .../Cyclic/IntegralRepUniverse.lean | 4 + .../Cyclic/NormKernelVanishing.lean | 12 +- .../Cyclic/TateComparison.lean | 8 +- .../GaloisCohomology/Cyclic/TateH0.lean | 10 +- .../Cyclic/TateH0/Invariants.lean | 8 +- .../GaloisCohomology/Cyclic/TateH0/Main.lean | 6 +- .../Cyclic/TateH0/NormImage.lean | 14 +- .../GaloisCohomology/GroupTheory.lean | 16 +- .../GroupTheory/Augmentation.lean | 16 +- .../GaloisCohomology/GroupTheory/Finite.lean | 8 +- .../GroupTheory/Quotient.lean | 8 +- .../GroupTheory/QuotientTower.lean | 6 +- .../GroupTheory/RestrictionKernel.lean | 6 +- .../GroupTheory/Transfer.lean | 8 +- .../Transfer/RelativeAugmentation.lean | 10 +- .../GroupTheory/Transfer/Witt.lean | 28 +- .../GaloisCohomology/Kummer.lean | 8 +- .../GaloisCohomology/Kummer/Abstract.lean | 16 +- .../Abstract/KummerAbelianAssembly.lean | 8 +- .../Abstract/KummerAbelianCyclicFactors.lean | 8 +- .../Kummer/Abstract/KummerCyclicOperator.lean | 8 +- .../Kummer/Abstract/KummerDelta.lean | 10 +- .../Kummer/Abstract/KummerFixedField.lean | 8 +- .../Kummer/Abstract/KummerGlobalOperator.lean | 6 +- .../GaloisCohomology/Kummer/Concrete.lean | 48 +- .../Kummer/Concrete/Cyclotomic.lean | 14 +- .../ProfiniteUnitDecomposition.lean | 28 +- .../ProfiniteUnitDecomposition/Basic.lean | 12 +- .../CyclotomicQuotient.lean | 6 +- .../Decomposition.lean | 6 +- .../DenseTorsion.lean | 6 +- .../FiniteFree.lean | 6 +- .../FiniteOrder.lean | 6 +- .../FreeCoordinate.lean | 6 +- .../ProfiniteUnitDecomposition/Gather.lean | 6 +- .../ProfiniteUnitDecomposition/Local.lean | 6 +- .../ProfiniteUnitDecomposition/Swap.lean | 6 +- .../TorsionQuotientEquiv.lean | 6 +- .../TorsionQuotientMk.lean | 6 +- .../RationalCyclotomicCharacter.lean | 12 +- .../RationalCyclotomicCharacterEquiv.lean | 8 +- .../Cyclotomic/RationalCyclotomicField.lean | 6 +- .../RationalCyclotomicTorsionField.lean | 10 +- .../Kummer/Concrete/CyclotomicField.lean | 8 +- .../Kummer/Concrete/ExtensionRoundTrip.lean | 8 +- .../Kummer/Concrete/FiniteCharacterEquiv.lean | 6 +- .../Kummer/Concrete/FiniteDualSeparation.lean | 6 +- .../Kummer/Concrete/FiniteGeneration.lean | 8 +- .../Kummer/Concrete/FiniteSupport.lean | 8 +- .../Kummer/Concrete/GaloisCohomology.lean | 6 +- .../Kummer/Concrete/InfiniteContinuity.lean | 8 +- .../Kummer/Concrete/InfiniteGeneration.lean | 6 +- .../Kummer/Concrete/InfiniteInverse.lean | 8 +- .../Concrete/KummerCorrespondenceFormula.lean | 12 +- .../Concrete/LocalMaximalKummerExtension.lean | 10 +- .../Concrete/LocalUnitKummerUnramified.lean | 10 +- .../Concrete/MaximalKummerSubgroup.lean | 8 +- .../Kummer/Concrete/RadicalExtension.lean | 10 +- .../Kummer/Concrete/RadicalQuotient.lean | 8 +- .../Kummer/Concrete/RestrictedFinite.lean | 8 +- .../Kummer/Concrete/RootCharacters.lean | 6 +- .../Kummer/Concrete/SUnitPreparation.lean | 6 +- .../PrimePowerKernelCoordinates.lean | 16 +- .../Kummer/Concrete/SimpleExtension.lean | 6 +- .../Kummer/Concrete/SimpleExtensionNorm.lean | 12 +- .../GaloisCohomology/ProfiniteIntegers.lean | 16 +- .../CyclotomicTorsionQuotient.lean | 8 +- .../ProfiniteIntegers/ProfiniteInteger.lean | 14 +- .../ProfiniteIntegerCore.lean | 14 +- .../ProfiniteIntegerPrimeProduct.lean | 10 +- .../ProfiniteIntegerUnits.lean | 8 +- .../TopologicalGeneration.lean | 8 +- .../GaloisCohomology/Topology.lean | 6 +- .../TotallyDisconnectedQuotients.lean | 8 +- LeanPool/ClassFieldTheory/ProCGroups.lean | 6 +- .../ProCGroups/InducedFunctions.lean | 10 +- .../ClassFieldTheory/ValuedFieldTheory.lean | 10 +- .../ValuedFieldTheory/LocalField.lean | 18 +- .../LocalField/Analytic.lean | 24 +- .../LocalField/Analytic/Arithmetic.lean | 20 +- .../Analytic/ContinuousFieldUnitLog.lean | 14 +- .../Analytic/DenominatorValuation.lean | 8 +- .../Analytic/FieldUnitLogExtension.lean | 6 +- .../Analytic/FieldUnitLogUniqueness.lean | 6 +- .../LocalField/Analytic/LogExpAdditivity.lean | 8 +- .../Analytic/LogExpComposition.lean | 8 +- .../LocalField/Analytic/LogExpContinuity.lean | 6 +- .../LocalField/Analytic/LogExpSeries.lean | 24 +- .../Analytic/LogExpSeries/ExpConvergence.lean | 8 +- .../Analytic/LogExpSeries/FormalCore.lean | 16 +- .../Analytic/LogExpSeries/FormalCoreBase.lean | 16 +- .../FormalCoreBase/BasicFactors.lean | 6 +- .../FormalCoreBase/ChoiceCountSystem.lean | 6 +- .../FormalCoreBase/ChoicePositions.lean | 6 +- .../FormalCoreBase/ExplicitChoiceCounts.lean | 6 +- .../PowerSeriesComposition.lean | 8 +- .../FormalCoreBase/ProductArgument.lean | 10 +- .../Analytic/LogExpSeries/FormalProduct.lean | 8 +- .../Analytic/LogExpSeries/Homomorphisms.lean | 6 +- .../LogExpSeries/InverseEstimates.lean | 6 +- .../Analytic/LogExpSeries/LogConvergence.lean | 8 +- .../LogExpSeries/PrincipalUnitExp.lean | 6 +- .../LogExpSeries/PrincipalUnitLog.lean | 8 +- .../LogExpSeries/PrincipalUnitLog/Core.lean | 6 +- .../PrincipalUnitLog/Equivalences.lean | 6 +- .../Analytic/LogExpSeries/SeriesTerms.lean | 12 +- .../Analytic/PrincipalUnitExpLogEquiv.lean | 8 +- .../LocalField/DiscreteValuationField.lean | 70 +- .../DiscreteValuationField/Basic.lean | 24 +- .../EqualCharacteristicLaurent.lean | 48 +- .../DiscreteValuationField/FieldNorm.lean | 12 +- .../DiscreteValuationField/FieldNormBase.lean | 6 +- .../FieldNormEquiv.lean | 6 +- .../FieldUnitDecomposition.lean | 30 +- .../FieldUnitFactors.lean | 12 +- .../FieldUnitPowerIndexFormulas.lean | 14 +- .../FieldUnitStructure.lean | 10 +- .../FiniteCoefficientLaurent.lean | 22 +- .../IwasawaIndexing.lean | 10 +- .../IwasawaPrincipalUnits.lean | 18 +- .../MixedCharacteristicQp.lean | 40 +- .../MixedCharacteristicStructure.lean | 10 +- .../MixedCharacteristicStructure/Core.lean | 8 +- .../DeepPrincipalUnits.lean | 6 +- .../IntegralLattice.lean | 26 +- .../DiscreteValuationField/Norm.lean | 8 +- .../DiscreteValuationField/Norm/Basic.lean | 8 +- .../Norm/Quotients.lean | 8 +- .../NormFiltration.lean | 6 +- .../DiscreteValuationField/PadicField.lean | 12 +- .../PadicLinearOfContinuous.lean | 14 +- .../PadicModuleStructure.lean | 14 +- .../PadicPowerIndex.lean | 10 +- .../PadicValuationComparison.lean | 12 +- .../PolynomialRootProximity.lean | 10 +- .../DiscreteValuationField/PowerIndex.lean | 10 +- ...PrincipalUnitInverseLimitSurjectivity.lean | 6 +- .../PrincipalUnitPadicAction.lean | 26 +- .../AdicPadicModule.lean | 10 +- .../AdicProdiscreteComparison.lean | 6 +- .../PrincipalUnitPadicAction/Core.lean | 20 +- .../FiniteQuotientPadicModule.lean | 20 +- .../InverseLimitCore.lean | 8 +- .../InverseLimitTopology.lean | 6 +- .../PadicReductionContinuous.lean | 10 +- .../ProdiscretePadicModule.lean | 8 +- .../QuotientTransition.lean | 8 +- .../TopologyModelTypes.lean | 8 +- .../WithZeroValuationTopology.lean | 8 +- .../PrincipalUnits.lean | 18 +- .../PrincipalUnits/AutomorphismTransport.lean | 8 +- .../PrincipalUnits/Core.lean | 18 +- .../PrincipalUnits/Filtration.lean | 12 +- .../PrincipalUnits/ResidueQuotient.lean | 6 +- .../PrincipalUnits/ResidueRoots.lean | 14 +- .../TeichmullerDecomposition.lean | 8 +- .../PrincipalUnits/TeichmullerLift.lean | 8 +- .../RamificationAddVal.lean | 8 +- .../RamificationIdeal.lean | 6 +- .../RamificationInvariants.lean | 6 +- .../DiscreteValuationField/Units.lean | 10 +- .../ValuationSubringUnits.lean | 26 +- .../CompleteRangeRestriction.lean | 12 +- .../CyclicValueGroup.lean | 16 +- .../IntegerValuation.lean | 10 +- .../IntegerValuationUniformizer.lean | 10 +- .../LocalFieldRangeRestriction.lean | 6 +- .../RangeRestrictedTopology.lean | 14 +- .../RangeRestriction.lean | 6 +- .../SeriesValuationEstimates.lean | 8 +- .../UniformizerIntegerValuation.lean | 8 +- .../ValuationSubringUnitMap.lean | 6 +- .../ValuedExtensionUnitMap.lean | 10 +- .../DiscreteValuationField/ValueGroup.lean | 8 +- .../WithZeroValuationTopology.lean | 26 +- .../LocalField/GroupTheory.lean | 10 +- .../GroupTheory/ContinuousQuotientEquiv.lean | 8 +- .../GroupTheory/IntegerMultipleSubgroup.lean | 10 +- .../LocalField/GroupTheory/PowerIndex.lean | 16 +- .../LocalField/NonarchimedeanLocalField.lean | 68 +- .../AdditiveEquiv.lean | 6 +- .../NonarchimedeanLocalField/Basic.lean | 6 +- .../FiniteExtensionCompleteDVF.lean | 14 +- .../FiniteExtensionTopology.lean | 12 +- .../FiniteUnramified.lean | 16 +- .../GaloisIntegerRing.lean | 14 +- .../IdealQuotients.lean | 8 +- .../MultiplicativeDecomposition.lean | 12 +- .../NonarchimedeanLocalField/Norm.lean | 16 +- .../NormContinuity.lean | 12 +- .../NormQuotient.lean | 18 +- .../NormSubgroupFunctoriality.lean | 6 +- .../NormalizedIntegerValuation.lean | 8 +- .../PowerClassFiniteness.lean | 10 +- .../PrincipalUnitActions.lean | 6 +- .../PrincipalUnitQuotients.lean | 10 +- .../PrincipalUnits.lean | 6 +- .../ProfiniteUnits.lean | 12 +- .../ResidueExtension.lean | 30 +- .../ResidueGalois.lean | 12 +- .../ResidueUnits.lean | 12 +- .../SeparableNormValuation.lean | 16 +- .../ShrinkTransport.lean | 10 +- .../NonarchimedeanLocalField/Small.lean | 10 +- .../StandardOpenSubgroups.lean | 6 +- .../UniformizerPrincipalQuotient.lean | 8 +- .../UnitTopology.lean | 6 +- .../UnramifiedFrobenius.lean | 14 +- .../NonarchimedeanLocalField/Valuation.lean | 8 +- .../ValuationExactSequence.lean | 12 +- .../ValuativeExtension.lean | 10 +- .../ValuedTopology.lean | 6 +- .../LocalField/NormUnits.lean | 6 +- .../ValuedFieldTheory/LocalField/Padic.lean | 14 +- .../LocalField/Padic/ClosedAddSubgroup.lean | 8 +- .../LocalField/Padic/Cyclotomic.lean | 8 +- .../Padic/Cyclotomic/TotallyRamified.lean | 20 +- .../TotallyRamified/EisensteinPolynomial.lean | 16 +- .../TotallyRamified/EisensteinRelation.lean | 6 +- .../Cyclotomic/TotallyRamified/Existence.lean | 6 +- .../TotallyRamified/IntegralClosure.lean | 6 +- .../TotallyRamified/IntegralTranslate.lean | 6 +- .../TotallyRamified/PrimeElement.lean | 6 +- .../TotallyRamified/RamificationIndex.lean | 8 +- .../TotallyRamified/ValuationRingEquiv.lean | 6 +- .../Padic/Cyclotomic/Unramified.lean | 6 +- .../Unramified/ArithmeticFrobenius.lean | 14 +- .../Padic/NonarchimedeanLocalField.lean | 10 +- .../LocalField/Padic/PrincipalUnits.lean | 24 +- .../LocalField/Padic/UnitDecomposition.lean | 18 +- .../LocalField/Unramified.lean | 32 +- .../LocalField/Unramified/BaseChange.lean | 8 +- .../LocalField/Unramified/BaseChangeCore.lean | 8 +- .../Unramified/BasicInvariants.lean | 8 +- .../LocalField/Unramified/Composition.lean | 8 +- .../LocalField/Unramified/Definitions.lean | 8 +- .../LocalField/Unramified/FiniteSupport.lean | 8 +- .../Unramified/HenselReduction.lean | 8 +- .../HenselianAlgebraicExtension.lean | 6 +- .../LocalField/Unramified/MaximalResidue.lean | 8 +- .../Unramified/MaximalSubextension.lean | 6 +- .../Unramified/RamificationIndexTower.lean | 8 +- .../Unramified/ResidueEmbedding.lean | 10 +- .../LocalField/Unramified/ResidueLifting.lean | 6 +- .../LocalField/Unramified/Separable.lean | 16 +- .../ValuedFieldTheory/Ramification.lean | 22 +- .../Ramification/ClosedSubgroups.lean | 8 +- .../Ramification/Different.lean | 8 +- .../Ramification/Filtration.lean | 10 +- .../Ramification/GaloisValuation.lean | 16 +- .../GaloisValuation/AbsoluteGalois.lean | 12 +- .../AbsoluteGalois/AbsoluteRamification.lean | 6 +- .../FiniteExtensionCorrespondence.lean | 8 +- .../FiniteLevelValuationRestriction.lean | 82 +- .../InfiniteGaloisCorrespondence.lean | 8 +- .../GaloisValuation/ClosedFixingSubgroup.lean | 8 +- .../CompositumRestriction.lean | 8 +- .../IntermediateFieldRestriction.lean | 6 +- .../GaloisValuation/Ramification.lean | 12 +- .../RamificationQuotients.lean | 6 +- .../Ramification/Herbrand.lean | 14 +- .../Ramification/Herbrand/Average.lean | 10 +- .../Ramification/Herbrand/FixedField.lean | 10 +- .../Ramification/Herbrand/Function.lean | 12 +- .../Ramification/Herbrand/Quotient.lean | 10 +- .../Ramification/Herbrand/Tower.lean | 6 +- .../Ramification/HilbertRamification.lean | 94 +- .../AbsoluteValueConjugacy.lean | 48 +- .../AlgebraicLocalization.lean | 32 +- .../HilbertRamification/BaseChange.lean | 8 +- .../HilbertRamification/CharacterMap.lean | 6 +- .../HilbertRamification/CompleteDVF.lean | 16 +- .../CyclotomicDegreeBound.lean | 10 +- .../DecompositionField.lean | 8 +- .../DecompositionFieldExtension.lean | 6 +- .../DecompositionFieldLocalization.lean | 16 +- .../DecompositionGroup.lean | 8 +- .../HilbertRamification/Dedekind.lean | 26 +- .../HilbertRamification/Dedekind/Basic.lean | 12 +- .../Dedekind/CompositumUnramified.lean | 14 +- .../Dedekind/Conjugation.lean | 6 +- .../Dedekind/FixedFieldTower.lean | 6 +- .../Dedekind/FixedFieldUnramified.lean | 10 +- .../Dedekind/FixedFields.lean | 6 +- .../Dedekind/NumberFieldPrimes.lean | 12 +- .../Dedekind/OrbitCardinality.lean | 6 +- .../Dedekind/PrimeContractions.lean | 6 +- .../Dedekind/TowerInvariants.lean | 6 +- .../Dedekind/ValuedGalois.lean | 10 +- .../FiniteGaloisLevel.lean | 10 +- .../FiniteGaloisLevelIndependence.lean | 6 +- .../FiniteInertiaStructure.lean | 14 +- .../FiniteOrderValuation.lean | 10 +- .../FiniteRamificationPrimary.lean | 16 +- .../FirstRamificationComparison.lean | 12 +- .../FixedFieldRamification.lean | 12 +- .../FixedFieldRamificationIndex.lean | 12 +- .../FixedFieldValuationRing.lean | 8 +- .../HilbertRamification/GaloisStabilizer.lean | 8 +- .../HilbertRamification/HerbrandFunction.lean | 8 +- .../HilbertRamification/HerbrandTheorem.lean | 18 +- .../InertiaRamificationCard.lean | 8 +- .../InertiaRestrictionCard.lean | 8 +- .../LocalizationDensity.lean | 34 +- .../LocalizationRamificationGroups.lean | 10 +- .../HilbertRamification/Monogeneity.lean | 14 +- .../OrbitPolynomialIdeal.lean | 10 +- .../PadicLocalization.lean | 18 +- .../HilbertRamification/Polynomial.lean | 12 +- .../RamificationCharacterization.lean | 6 +- .../RamificationDepth.lean | 12 +- .../RamificationGroup.lean | 6 +- .../RamificationNumber.lean | 10 +- .../RamificationNumberFormula.lean | 10 +- .../RamificationNumberRestriction.lean | 8 +- .../RamificationPrimeToResidueTorsion.lean | 8 +- .../HilbertRamification/RealLowerGroups.lean | 12 +- .../ResidueExactSequence.lean | 8 +- .../UniformizerGradedHom.lean | 6 +- .../UniqueExtensionIntegralClosure.lean | 10 +- .../HilbertRamification/ValuationKrasner.lean | 6 +- .../ValuationRestriction.lean | 8 +- .../HilbertRamification/ValuationSubring.lean | 16 +- .../Ramification/InertiaCardinality.lean | 10 +- .../Ramification/LocalField.lean | 14 +- .../Ramification/LocalField/BaseChange.lean | 6 +- .../Ramification/LocalField/Core.lean | 18 +- .../FirstRamificationComparison.lean | 8 +- .../Ramification/LocalField/InertiaCard.lean | 8 +- .../Ramification/LocalField/Unramified.lean | 10 +- .../Ramification/ProfiniteInvariant.lean | 8 +- .../ValuedFieldTheory/Valuation.lean | 22 +- .../Valuation/AbsoluteValue.lean | 28 +- .../AbsoluteValue/AlgebraicExtension.lean | 24 +- .../AlgebraicExtension/Core.lean | 14 +- .../FiniteNormExtension.lean | 16 +- .../AlgebraicExtension/NormFormula.lean | 12 +- .../NormFormulaAbsoluteValue.lean | 6 +- .../NormFormulaCoefficients.lean | 8 +- .../NormFormulaExtension.lean | 8 +- .../NormFormulaIntegralClosure.lean | 8 +- .../RamificationInvariants.lean | 20 +- .../UniqueExtensionCoefficients.lean | 8 +- .../UniqueValuationSubring.lean | 6 +- .../AbsoluteValue/AlgebraicLocalization.lean | 8 +- .../Valuation/AbsoluteValue/Completeness.lean | 12 +- .../Valuation/AbsoluteValue/Completion.lean | 14 +- .../AbsoluteValue/ExponentialValuation.lean | 6 +- .../Valuation/AbsoluteValue/Extension.lean | 10 +- .../AbsoluteValue/Nonarchimedean.lean | 10 +- .../Valuation/AbsoluteValue/Ostrowski.lean | 10 +- .../PrincipalAdicCompleteness.lean | 10 +- .../AbsoluteValue/SpectralExtension.lean | 10 +- .../Valuation/AbsoluteValue/Theory.lean | 10 +- .../AbsoluteValue/Theory/AbsoluteValues.lean | 12 +- .../Valuation/AbsoluteValue/Theory/Core.lean | 8 +- .../Theory/ExponentialValuations.lean | 16 +- .../AbsoluteValue/ValuationSubring.lean | 12 +- .../Valuation/Completion.lean | 34 +- .../Completion/AbsoluteValueExtensions.lean | 56 +- .../Completion/BaseChangeAdjoinRoot.lean | 12 +- .../Completion/BaseChangeNormTrace.lean | 14 +- .../Completion/CanonicalTensorMap.lean | 10 +- .../Valuation/Completion/DegreeNormTrace.lean | 10 +- .../ExtensionFactorClassification.lean | 12 +- .../Completion/ExtensionInvariants.lean | 50 +- .../Completion/FiniteLocalization.lean | 14 +- .../Completion/FiniteProductNormTrace.lean | 10 +- .../Valuation/Completion/Padic.lean | 10 +- .../Valuation/Completion/PolynomialCRT.lean | 8 +- .../Completion/PolynomialFactors.lean | 12 +- .../SeparablePolynomialFactors.lean | 8 +- .../TensorProductDecomposition.lean | 18 +- .../TensorProductProductFormulas.lean | 8 +- .../Valuation/DiscreteValuationField.lean | 40 +- .../DiscreteValuationField/AddVal.lean | 6 +- .../DiscreteValuationField/AdicPower.lean | 6 +- .../AmbientUniformizer.lean | 6 +- .../DiscreteValuationField/Basic.lean | 12 +- .../ChevalleyExtension.lean | 12 +- .../DiscreteValuationField/Complete.lean | 10 +- .../CompleteDVRExpansion.lean | 10 +- .../DiscreteValuationField/Compositum.lean | 20 +- .../DiscreteValuationField/Extensions.lean | 20 +- .../FiniteExtension.lean | 12 +- .../FiniteExtension/Core.lean | 8 +- .../FiniteExtension/Defectless.lean | 10 +- .../FiniteExtension/Degree.lean | 14 +- .../FiniteExtension/Uniqueness.lean | 6 +- .../FiniteIntegralClosure.lean | 8 +- .../DiscreteValuationField/Henselian.lean | 10 +- .../HenselianFinite.lean | 16 +- .../HenselianValuationExtension.lean | 8 +- .../IntegralClosure.lean | 24 +- .../DiscreteValuationField/ResidueField.lean | 6 +- .../ValuationExtension.lean | 6 +- .../ValuationTransport.lean | 6 +- .../Valuation/HenselLemma.lean | 10 +- .../Valuation/Henselian.lean | 42 +- .../AlgebraicExtensionUniqueness.lean | 8 +- .../Henselian/AlgebraicIntegralClosure.lean | 16 +- .../Valuation/Henselian/Complete.lean | 8 +- .../Henselian/CoprimeFactorLifting.lean | 8 +- .../Valuation/Henselian/Core.lean | 46 +- .../Valuation/Henselian/EtaleLifting.lean | 8 +- .../Valuation/Henselian/Factorization.lean | 34 +- .../Henselian/Factorization/AdicLimits.lean | 8 +- .../Henselian/Factorization/Assembly.lean | 10 +- .../Henselian/Factorization/Basic.lean | 10 +- .../Factorization/CoefficientMinimum.lean | 8 +- .../Henselian/Factorization/Complete.lean | 8 +- .../Henselian/Factorization/DegreeBounds.lean | 6 +- .../Factorization/DivisionBounds.lean | 6 +- .../Henselian/Factorization/ErrorPowers.lean | 6 +- .../Factorization/FiniteApproximation.lean | 6 +- .../Factorization/InfiniteApproximation.lean | 6 +- .../Henselian/Factorization/Iteration.lean | 6 +- .../Factorization/PrincipalLimits.lean | 8 +- .../Henselian/Factorization/Step.lean | 8 +- .../Henselian/Factorization/Truncation.lean | 6 +- .../Henselian/Factorization/WeakLimits.lean | 8 +- .../IrreduciblePolynomialBounds.lean | 8 +- .../IrreduciblePolynomialLifting.lean | 8 +- .../Henselian/MonicFactorization.lean | 16 +- .../Henselian/NonmonicReduction.lean | 6 +- .../Henselian/PrimitiveFactorization.lean | 6 +- .../Henselian/PrimitiveReduction.lean | 10 +- .../Henselian/SimpleRootFactorization.lean | 8 +- .../Henselian/StandardEtaleLifting.lean | 8 +- .../Henselian/UniqueAlgebraicExtensions.lean | 10 +- .../Henselian/UniqueExtensionPrimitive.lean | 10 +- .../Henselian/UniqueExtensionReduction.lean | 8 +- .../ValuationExtensionCriterion.lean | 6 +- .../Valuation/LocalRingEquiv.lean | 10 +- .../ValuedFieldTheory/Valuation/Topology.lean | 14 +- .../Topology/AdicCompletionInverseLimit.lean | 6 +- .../AdicCompletionInverseLimitRing.lean | 16 +- .../Topology/AdicContractingFixedPoint.lean | 6 +- .../Topology/CompatibleInverseLimit.lean | 8 +- .../Valuation/Topology/Models.lean | 10 +- .../Valuation/UniqueRing.lean | 10 +- .../Valuation/ValuedAdicComplete.lean | 10 +- 1822 files changed, 18050 insertions(+), 10620 deletions(-) diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean index dfa5dfced2..53dd23e4c8 100644 --- a/LeanPool/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory.lean @@ -1,1677 +1,1823 @@ -/- -Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: n-yamaguchi-0729 --/ +module -- shake: keep-all --deprecated_module: ignore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients -import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing -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 --/ +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory.lean index 6a08f3d9d4..e83258564d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean index a495215f9e..20f52ec747 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean index 698fee9af6..051c0b656f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All /-! # Abstract class field theory @@ -19,3 +21,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean index 60952f7c45..3823ca42f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean index 6c1e2632e2..85a38e7e4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ProfiniteIntegerFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean index 6f46686152..9a652b92e5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -3,14 +3,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 -import Mathlib.GroupTheory.QuotientGroup.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean index e36caaafce..43b727483c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields /-! # Frobenius -/ + +@[expose] public section namespace ClassFormation /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index e8f63c2d72..39ce72b833 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean index fc3784b7cc..7d4cf95bff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Frobenius /-! # Frobenius Lift -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean index a3f574ef72..cb67b5cfb6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower /-! # Indices -/ + +@[expose] public section namespace ClassFormation /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean index 371af04fa8..9ab2064020 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean @@ -3,12 +3,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 -import Mathlib.GroupTheory.Index -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean index c0b007d13c..6a36ff939d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse /-! # Norm Conjugation -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean index cb69cc0c08..2ae86b1e5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower /-! # Norm Laws -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean index 4c4902ba5c..ca3e30a176 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Indices -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup -import Mathlib.GroupTheory.Index -import Mathlib.NumberTheory.Padics.ProperSpace + +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 @@ -18,6 +20,8 @@ finite kernel detects openness of the closed subgroup generated by any element of nonzero degree. -/ +@[expose] public section + open scoped Topology namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean index b4fca591bb..b0db1ce267 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.ValuationLaws /-! # Prime Elements -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean index 01759c99c7..848e6e49d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean @@ -3,15 +3,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 -import Mathlib.Data.ZMod.QuotientGroup -import Mathlib.GroupTheory.Archimedean -import Mathlib.GroupTheory.FiniteIndexNormalSubgroup -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Completion -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean index 15bfd79848..6e96087ece 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm /-! # Valuation -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean index 134db5bae6..cc48a2eb6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean index 594b3b6421..5381aa8978 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean @@ -3,30 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean index 13b1fb7244..ccc361d0e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean @@ -3,33 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopologyCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ProfiniteAPI -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean index 64f8a5ed2d..500f4d2ac0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification /-! # The abstract class-field correspondence @@ -15,6 +17,8 @@ the defining norm-subgroup equality and the two lattice formulas are consequences rather than extra assumptions. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean index 8d0c1bff5a..54eca944f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom /-! # Class Field Axiom -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean index 3c88980251..eb14324d1f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 @@ -26,6 +28,8 @@ classification conclusion depending on that specialization is asserted here. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean index 68fdb84ca9..52e679ca86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean @@ -3,44 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean index b93c545658..573c5c25a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean @@ -3,47 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean index 0024a5a360..aa13ca9d01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnramifiedNormQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean index e5a59e91bb..2a64f616b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal /-! # Chosen Degree One Frobenius -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean index 4bf30b97df..56ab439d18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean index f1aeaf6008..715b225991 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration -import Mathlib.GroupTheory.DoubleCoset -import Mathlib.GroupTheory.GroupAction.Quotient -import Mathlib.Topology.Algebra.Group.ClosedSubgroup -import Mathlib.Topology.Algebra.Group.SubmonoidClosure + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean index a0208c40fc..2ad963b846 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation -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.FrobeniusClosureCommutation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction /-! # Finite Field Unit Maps -/ + +@[expose] public section universe u v namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean index 6fb50b8451..6554492b37 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence /-! # Finite Intermediate Compositum -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean index 1dda8dabe2..55fbe9abc3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm /-! # Finite Intermediate Field Compositum -/ + +@[expose] public section universe u v namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean index 335f5ff1e4..55683cdbc6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean index 13fdfc60d6..b4bf74cd95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps /-! # Fixed Tower Unit Correction -/ + +@[expose] public section universe u v namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean index c4f320369e..d62590aae7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean index 0a53debd2b..3b6ce065b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm /-! # Frobenius Closure Commutation -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean index c5fd614b47..ade59efa2d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup -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.FrobeniusField /-! # Frobenius Descent -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean index 8409f0e516..23bb062be6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField /-! # Frobenius Field -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean index f781d9e240..d69008a4ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusClosureCommutation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean index 1009fa5ff7..d41fe62492 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean index 578a4ab9be..67fb4fd63d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum /-! # Frobenius Power Fixed Field -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean index 16437192af..651dbe89a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UniversalNormDescent /-! # Frobenius Quotient Descent -/ + +@[expose] public section universe u v namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean index c789deed01..24c906fcae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField /-! # Frobenius Semigroup -/ + +@[expose] public section namespace ClassFormation open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean index 32a1de27d2..de283c7fcf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FixedTowerUnitDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteFieldUnitMaps + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean index 40f2b99093..dca3eded10 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitDescent /-! # Infinite Unit Norm Subgroup -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean index 4c6eff5354..0dada68477 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean index 4d8a9fc9a1..79c8f3238d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean index 75c8a83521..4539f29893 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ReciprocityMapMul + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean index 83f40dd9b7..9c9d4e9185 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.RelativeNormDoubleCoset + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean index 625e5ace71..e35a4ede70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder /-! # Correction sums for reciprocity multiplicativity @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean index aef5d55a58..84da978702 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.PrimeUnitDifferences /-! # Finite-stage correction terms for reciprocity multiplicativity @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean index 6598cf2c06..56447c525a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.Universal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferOrbitClosure + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean index 21e75c1566..02473c37c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder /-! # The Frobenius power-sum relation for reciprocity multiplicativity @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean index cf35761ffe..5fb09a0e87 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CanonicalUnramifiedNormQuotient + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean index ecc17c9c92..fc249cfee5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusActionRemainder /-! # Finite-stage unit differences of Frobenius primes @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean index d71904173a..49d78fca79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.ConjugatePrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FrobeniusPowerSumRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.NormClassRelation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.FiniteStageCorrections -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainMultiplicativity.CorrectionSum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ChosenDegreeOneFrobenius + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index 65f7cc9d8b..0787f8cb35 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainFiniteReciprocity /-! # Main Naturality -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index b729fb5a32..cc97cea2ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.TransferNaturality + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean index 064d3f71b8..6461773fe2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransferFrobeniusGeometry /-! # Main Transfer Frobenius -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean index 744a14e3f6..1761110271 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.DoubleCosetOrbitGeometry /-! # Transfer--norm Frobenius geometry @@ -15,6 +17,8 @@ naturality. The reusable orbit and double-coset constructions are isolated in `DoubleCosetOrbitGeometry`. -/ +@[expose] public section + universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean index 4f00515025..b6479ac3d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse /-! # Norm Subgroup -/ + +@[expose] public section universe u namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean index e3c7441aa7..4c87750f8c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements /-! # Prime Choice -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean index 8ec1a5d2aa..bea154fcbb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusSemigroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.PrimeChoice + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean index e594c13932..8ce295b63e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityDefinition + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean index aeeb87246b..5d9e07893d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Norm -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import Mathlib.GroupTheory.GroupAction.Quotient + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean index 45d639db97..5ba07281dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean @@ -3,11 +3,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 -import Mathlib.GroupTheory.Transfer -import Mathlib.GroupTheory.Abelianization.Defs + +public import Mathlib.GroupTheory.Transfer +public import Mathlib.GroupTheory.Abelianization.Defs /-! # Transfer Naturality -/ + +@[expose] public section namespace ClassFormation /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean index 1e298ecbd0..817f1d3804 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration -import Mathlib.GroupTheory.Transfer -import Mathlib.Topology.Algebra.Group.ClosedSubgroup + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean index 102fe75f5c..9d3564956d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PrimeElements -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean index 02ec1cdee9..045788bd51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.InfiniteUnitNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteIntermediateFieldCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusFixedFieldAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusPowerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FrobeniusQuotientDescent + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean index 4c9dc7f29b..d71229dcc9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.CoreFrobeniusNorm -import Mathlib.Dynamics.BirkhoffSum.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean index 7349d732c9..0083addf6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.ReciprocityIndependence + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean index fb312cfd27..b74bc28247 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.CyclicNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean index d5f6c1c420..578109381f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean index 99d169c364..f857d9a214 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormLaws +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse /-! # Field Representation -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean index 40b9fa31fc..a0ea838408 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main /-! # Finite abelian classification by norm subgroups @@ -17,6 +19,8 @@ class which restricts trivially to both subextensions is already trivial on their compositum. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean index 8d54f5e318..c15471ac9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import Mathlib.Algebra.Group.Subgroup.Pointwise -import Mathlib.Topology.Algebra.Group.Pointwise + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean index 588f3fdfe3..f492fdc56b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient /-! # Finite Galois Subextension -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean index 9ec8c2eae6..ac60e3398a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import Mathlib.Topology.Algebra.Group.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension +public import Mathlib.Topology.Algebra.Group.Basic /-! # Intermediate Extension -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean index 11c857627d..21302ba2a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Sylow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean index 59578da5d4..3d0b8b0c72 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 @@ -16,6 +18,8 @@ extension is the inverse of the unramified norm-quotient equivalence. This file finite compatibility and then records the two formulas. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean index 30be6d383d..ba40364f8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer /-! # Abstract reciprocity: the maximal-unramified symbol @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean index 17fe300c65..cd71ff243b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology /-! # Continuity of norms @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean index ba332992ce..d809baeeba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean @@ -3,13 +3,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 -import Mathlib.Algebra.Group.TransferInstance -import Mathlib.Topology.Algebra.FilterBasis -import Mathlib.Topology.Algebra.Group.ClosedSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models + +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 @@ -18,6 +20,8 @@ The neighbourhood basis at zero consists literally of the norm subgroups make this family downward directed. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean index 24d67e4db7..caea85f0cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormContinuity -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 @@ -16,6 +18,8 @@ reciprocity isomorphism of the abstract reciprocity theorem. Parts (ii)--(iv) a imported valuation-, norm-, and norm-topology modules. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean index 0b1084042e..6dd9b36dc0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField + +public import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassField /-! # Profinite reciprocity facade @@ -15,6 +17,8 @@ separation, and total disconnectedness instances required by the generic theorems. -/ +@[expose] public section + noncomputable section namespace ClassFormation.Profinite diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean index 16b2815fe9..948be3c98c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.IntermediateExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean index db2ac9313b..bb10663603 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import Mathlib.GroupTheory.Nilpotent + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction +public import Mathlib.GroupTheory.Nilpotent /-! # Sylow -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean index 659a1007f8..b41365b1a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Core /-! # Totally Ramified -/ + +@[expose] public section namespace ClassFormation open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean index c457780815..e886f0a871 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean index eed5f77933..5e9be9b3c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean index a9893bebc2..95ec9b78b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FixedSource /-! # Totally ramified reciprocity @@ -12,6 +14,8 @@ This file derives exponent vanishing, injectivity, and finally bijectivity of finite reciprocity from the constructed fixed source. -/ +@[expose] public section + noncomputable section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean index 5036df284d..4d2b07c80c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.FrobeniusNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamified + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean index 26fffc9330..34c64e34a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction /-! # Frobenius lifts for totally ramified extensions @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean index 01e51d6652..335b864c90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionEquiv /-! # Frobenius actions and relative norms in a totally ramified tower @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean index 79ea0c03ca..6f472b3d4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction /-! # Restriction transport for finite Galois subextensions @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean index 80a17fc589..1c88b7f662 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase.RestrictionCosets -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.FrobeniusLift /-! # The lower Galois group in the totally ramified auxiliary tower @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean index 5821169c62..21bc931da9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology + +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 @@ -16,6 +18,8 @@ of reduction modulo `f` after the normalized degree map `d_K`. The norm--valuat sends its norm subgroup into the prescribed neighbourhood. -/ +@[expose] public section + noncomputable section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean index be211ce3df..4857894b49 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean index 40dcc7abf7..f52fc6bf58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Abelian + +public import Mathlib.FieldTheory.Galois.Abelian /-! # Abelian Galois extensions under equivalent field presentations @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean index 43685a9991..70031c22af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFieldAlgEquivOrderIso +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv /-! # Finite abelian intermediate fields under an ambient algebra equivalence @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean index 35690133ee..0904447b5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.IntermediateField.Basic + +public import Mathlib.FieldTheory.IntermediateField.Basic /-! # Intermediate fields under an algebra equivalence @@ -13,6 +15,8 @@ their intermediate-field lattices. This is the ambient-change step used for Mathlib's chosen separable closures. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean index c9ad4d203a..3b55efac59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean index 2d5c99004a..1c12dba7ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean index 15ac50743f..a6f5b3191e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean index 5b81d375af..c26f71787e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support /-! # Coordinate assembly for relative adeles @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean index 6892b738de..e899d21d05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction + +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 @@ -17,6 +19,8 @@ completion used by the canonical local tensor decomposition, and records equivar conjugation on the second tensor factor. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean index fd023132cb..eebe27607a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean index d907874606..24bc2254aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import Mathlib.NumberTheory.NumberField.Completion.LiesOverInstances + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean index b681d4e3d7..f441ee514e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import Mathlib.Algebra.Group.Pi.Units -import Mathlib.Algebra.Group.Submonoid.Units + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean index e441e0f6c4..120593e4b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean index 591a0e9c0d..925d9631e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import Mathlib.Algebra.Module.Torsion.Basic -import Mathlib.LinearAlgebra.Basis.SMul -import Mathlib.RingTheory.Algebraic.Integral -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Discriminant -import Mathlib.RingTheory.Localization.Finiteness -import Mathlib.RingTheory.Valuation.LocalSubring -import Mathlib.RingTheory.Valuation.ValuationSubring + +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 @@ -40,6 +42,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean index 8bcb9aad9e..d55eaf3431 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean index 6b71d5f964..ff7d1e10f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice /-! # Finite-place completion maps for relative tensor factors @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean index 045eaa9c80..393e522a99 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition /-! # Finite support for integral relative ideles @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean index e914c40653..eb6861b5a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue /-! # Integral lattices in relative tensor coordinates @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean index f114f33255..aabec2d58c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion /-! # Integral comparison for local tensor decompositions @@ -13,6 +15,8 @@ with the corresponding componentwise conditions in the completions above that place. -/ +@[expose] public section + open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean index a56f6105d5..c1b6760cdf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice /-! # Localization of the relative integral lattice @@ -13,6 +15,8 @@ integer lattice with the integral closure and derives coordinatewise integrality after localization. -/ +@[expose] public section + open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean index 323e29e5cd..3d16b0690e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.Coordinates /-! # Joint local components of relative adeles and ideles @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean index 5414592d1c..d606c27af5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct /-! # Galois action on the restricted local product @@ -14,6 +16,8 @@ relative ideles is equivariant, and the transported action is the coordinatewise tensor-conjugation action. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean index 30dc2f5532..5a51108fe6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents -import Mathlib.Algebra.Group.TransferInstance + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.LocalComponents +public import Mathlib.Algebra.Group.TransferInstance /-! # The restricted local product of a relative adele algebra @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index f7da0caaa8..7e6dd4aa0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison /-! # Scalar extension from relative to ordinary adeles @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean index d8830ec032..e657eb6972 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean @@ -3,25 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct + +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 @@ -30,3 +32,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean index 5b91fc09a2..3040ca8190 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean index f85f3c1498..87890f2696 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -import Mathlib.NumberTheory.RamificationInertia.Valuation + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean index bda8ad5edd..e8e7394e5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import Mathlib.NumberTheory.RamificationInertia.Valuation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.NumberTheory.RamificationInertia.Valuation /-! # The canonical map between adic completions @@ -14,6 +16,8 @@ extension of the number-field algebra map to their concrete adic completions. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean index da7c1fd105..c9433da6ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean index 713f50e7a2..7cca010164 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces /-! # The chosen localization at a finite place @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean index 8bac17842f..9f111b0ba8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import Mathlib.Analysis.SpecialFunctions.Pow.Continuity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity /-! # Comparing finite-place completion models @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean index 0946d20753..f26affd5c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy -import Mathlib.RingTheory.Ideal.GoingUp + +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 @@ -25,6 +27,8 @@ For a finite place `W` of `L`, `finitePlaceBelow W` is its contraction to closure shows that the centres are precisely the finite places above `v`. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean index 9b3f045f17..275917ceee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv /-! # Adic completions under a number-field equivalence @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean index 33140ad297..b801d8adec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import Mathlib.NumberTheory.Padics.HeightOneSpectrum + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean index b3086d4ea4..62130f7819 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean index 3f36123873..52550ed652 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean index 819795ef2f..f111100241 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean index 9a6997f25f..686191ae02 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic -import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Norm + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean index 34ee5ac333..3d9e7554e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -15,6 +17,8 @@ actual chosen finite-place extension implies unramifiedness of its localized completion. -/ +@[expose] public section + open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean index acb4145dfa..8894995e25 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean index 3bd2e48f98..77e7f930c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean index 2d54ff5e15..82170a27b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum + +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum /-! # Embedding a finite Galois compositum into a common field @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean index d1934b6dd6..eefa81a73d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.Galois.GaloisClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding /-! # Finite abelian composita @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean index 5bad9ae34e..68669e7c55 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean index c88cd4e2e0..330c171417 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.Galois.Profinite -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.Topology.Algebra.Group.TopologicalAbelianization + +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 @@ -17,6 +19,8 @@ maximal abelian subextension. Working inside the separable closure makes the construction uniform in every characteristic. -/ +@[expose] public section + noncomputable section open scoped IsMulCommutative diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean index a611fb1bba..b2df6dcd24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.RelativeAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean index 4f54101a65..a6de113ae9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower /-! # A prime-degree intermediate field of a finite cyclic extension @@ -16,6 +18,8 @@ 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} diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean index 5d344c4949..0a94f83a01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace /-! # The prime-degree subextension of a cyclic prime-power extension @@ -21,6 +23,8 @@ splitting descends to the prime-degree subextension, and nonsplitting there ascends to `L`. -/ +@[expose] public section + open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean index d56f72185e..6a5a8e7d41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/FixedFieldLattice.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic + +public import Mathlib.FieldTheory.Galois.Basic /-! # Fixed fields and subgroup lattice operations @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean index 0bf76472f7..96e86a47d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.GaloisClosure -import Mathlib.FieldTheory.Normal.Basic -import Mathlib.FieldTheory.SeparableClosure + +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.FieldTheory.Normal.Basic +public import Mathlib.FieldTheory.SeparableClosure /-! # Infinite Galois base change from finite layers @@ -16,6 +18,8 @@ mathlib's actual intermediate fields and uses no abstract replacement for the compositum. -/ +@[expose] public section + noncomputable section namespace IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean index d808006312..4cad88b6af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr -import Mathlib.FieldTheory.AbsoluteGaloisGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +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 @@ -16,6 +18,8 @@ map on topological abelianizations is a homeomorphism of groups, not merely an abstract group isomorphism. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean index a3c91dcd04..85249847f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr -import Mathlib.FieldTheory.AbsoluteGaloisGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +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 @@ -15,6 +17,8 @@ Conjugation then identifies the absolute Galois groups, including their Krull topologies, and hence their topological abelianizations. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean index df73090212..f34e38de8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean index 0f468dab87..3313de514e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/NormalFieldRange.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Normal.Basic + +public import Mathlib.FieldTheory.Normal.Basic /-! # Ranges of embeddings of normal extensions @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean index 462dd18391..361694b988 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization /-! # Relative topological abelianization @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean index 47a873d778..d5f5ad74c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/UnboundedDegree.lean @@ -3,14 +3,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 -import Mathlib.FieldTheory.Galois.GaloisClosure -import Mathlib.FieldTheory.IntermediateField.Basic -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic -import Mathlib.Algebra.Algebra.Equiv -import Mathlib.LinearAlgebra.Dimension.Free -import Mathlib.LinearAlgebra.Dimension.Finite -import Mathlib.LinearAlgebra.LinearIndependent.Defs + +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 @@ -20,6 +22,8 @@ independent finite families. Their finite Galois closures give the required actual intermediate fields. -/ +@[expose] public section + namespace AlgebraicNumberTheory universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean index f7119995f6..d4112064d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean @@ -3,33 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean index 4929846d96..0952c6dc9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean @@ -3,36 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean index 088ca8b807..218aabc781 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean index 1cca0c9f26..8cad8c788e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.NumberField.AdeleRing -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean index 7091d0f6bb..b7132372d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index 714092dd5b..af3071d8c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Maps -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean index fa49727ba4..c51990a8a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean index 1a555ce935..d71b3b7a61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean index 27542b5547..c1dd9de427 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean index 02b8c2deec..1cd6a42ea5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionMap + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean index 2a6509ddac..3a637673d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean @@ -3,26 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivAdeleTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivFiniteIntegral -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.InfiniteAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean index 6e8b75eae1..bcd54b0957 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent -import Mathlib.RingTheory.IsTensorProduct + +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 @@ -25,6 +27,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean index d1aac16e6d..f433a8ca4d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients -import Mathlib.GroupTheory.QuotientGroup.Defs -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Group.Subgroup + +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 @@ -17,6 +19,8 @@ onto the connected component of one. It therefore induces an equivalence of the corresponding quotient topological groups. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean index 3fc8168a82..5e0030e26c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean index 34666c433b..561f26749d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv /-! # Infinite completions under a number-field equivalence @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean index 87c0add590..c869db3026 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import Mathlib.NumberTheory.NumberField.AdeleRing + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import Mathlib.NumberTheory.NumberField.AdeleRing /-! # Comparison with Mathlib's idèle class group @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean index d784c3f5f4..3c2388f721 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FiniteMathlibTopologyComparison -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean index 475fa6d6b9..f89379cf16 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean index 02741a9274..9f8b91cac2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean index e7657b741a..462c619fbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import Mathlib.LinearAlgebra.TensorProduct.Basis -import Mathlib.RingTheory.TensorProduct.Maps + +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 @@ -20,6 +22,8 @@ This gives an actual norm `C_L → C_M` whose composite with quotients form a natural right-exact sequence. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean index 7e2f70bc5c..58fbc3251c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -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.TowerBaseChange /-! # Naturality of tower base change under number-field equivalences @@ -21,6 +23,8 @@ and therefore uses only tensor-product coherence; no new description of local components is introduced. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean index ae3ee8395f..e41c6b09e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean index 0ab04fecca..e65aca3a19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean index 127ea00d05..51b9f08dbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean index 172f260815..517afc8fe2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -3,22 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology +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 @@ -36,6 +38,8 @@ show that every unramified induced integer-unit block has trivial `H⁰` and `H⁻¹`. -/ +@[expose] public section + open scoped NumberField RestrictedProduct ValuativeRel open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean index 16c53b3f80..ade93cf339 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean index 224310f9a1..7fe978fabc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean index a041ac5d74..165e167352 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean index ba0fb1e873..b7be4e555a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean index c984ac4101..43c49ba26c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean index 970f7784b7..ef111439e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean index df324fcdab..8668ed1fac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean index ff70fbe9d0..dac440e2de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite /-! # Cardinalities of finite unrestricted local-block families @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean index 0b2289382b..21d64e2d4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local /-! # Finite unrestricted local-block families @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean index 6eef582957..dc29228a1a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean index 8a324b75b2..93d19e3e81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean index a3dafae86d..6d44d0f857 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean index 7cd5afbc52..401843d306 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean index 07901c22d2..47669b3159 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean index f96f73a2a5..38704ea070 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Decomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean index ad8b1d7b4d..763983392b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean index a3757b4988..09f99084d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock /-! # The chosen integral tensor equivalence @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean index 169babd806..15c9d43e90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean index 7f2e616745..a1a8d0f951 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction /-! # Inclusion of the chosen integral induced block @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean index c5d486eb12..96d2329ed5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion /-! # Equivariance of the induced integral block @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean index 85265c6db4..bb5b50ac11 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FinitePlaceTensorBlock + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean index 31a9500486..4a5fae99b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.LocalizedValuation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor /-! # Transporting integer rings across finite-place cosets @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean index feed29073f..c89869e637 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -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.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. -/ + +@[expose] public section 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 index f44edc6639..8f96714ddc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine /-! # Integral local induced modules @@ -12,6 +14,8 @@ 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 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 index d79b4291b0..3b7353934b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -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.SPlaces.OutsideIntegralInduced.LocalInduction.Spine /-! # Integral local induced modules Public facade for the shared completion spine, action, product equivalence, and inclusion leaves. -/ + +@[expose] public section 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 index 49d6da02d7..9c828be472 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action /-! # Integral local induction equivalence @@ -12,6 +14,8 @@ 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 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 index ebd08241c3..1a75de8856 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv /-! # Inclusion of integral local induced modules @@ -12,6 +14,8 @@ 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 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 index 85e4148f4b..d0081d590e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean index 3182d5f9c8..77ec507d9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces -import Mathlib.Algebra.GroupWithZero.Action.Prod + +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 @@ -17,6 +19,8 @@ outside the support. The comparison respects the concrete Galois actions. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean index ac9efb8880..7a271be5f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SufficientlyLarge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean index 9e097da061..4347ce36ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean index 7ef95bf054..0fe030d8bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean @@ -3,25 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.EmbeddingNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleClassBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean index 1ff5f257c3..817d96b9ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore -import Mathlib.FieldTheory.Galois.NormalBasis -import Mathlib.GroupTheory.GroupAction.Defs -import Mathlib.LinearAlgebra.TensorProduct.Basis -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Maps + +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 @@ -19,6 +21,8 @@ This file uses the canonical presentation idele norm formal linear-algebra operations. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean index f43594c738..a5a8928a60 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import Mathlib.LinearAlgebra.Basis.VectorSpace + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties +public import Mathlib.LinearAlgebra.Basis.VectorSpace /-! # Idele classes in finite extensions @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean index f4bcab9ef4..06e3e5ca8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm -import Mathlib.FieldTheory.Normal.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm +public import Mathlib.FieldTheory.Normal.Basic /-! # Norms through an ambient Galois extension @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean index 9a5a629f20..dae4c9183b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology -import Mathlib.Algebra.Group.Action.Basic -import Mathlib.GroupTheory.GroupAction.Quotient + +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 @@ -18,6 +20,8 @@ class has a fixed representative. Together with fixed-idele descent, this identi the fixed subgroup with the embedded copy of `C_K`. -/ +@[expose] public section + open scoped NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean index d99739ac54..a112a71848 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import Mathlib.Algebra.Module.LinearMap.Polynomial -import Mathlib.LinearAlgebra.Charpoly.BaseChange -import Mathlib.RingTheory.TensorProduct.MvPolynomial + +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 @@ -16,6 +18,8 @@ This file proves that, in the tensor-product presentation is the product of all Galois conjugates. -/ +@[expose] public section + open scoped BigOperators TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean index f2a60ae8dd..b60b62180b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import Mathlib.NumberTheory.RamificationInertia.Valuation -import Mathlib.RingTheory.ClassGroup.ExtendedHom + +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 @@ -19,6 +21,8 @@ idele classes and compares it with extension of fractional ideals and ideal classes. -/ +@[expose] public section + open scoped NumberField TensorProduct nonZeroDivisors open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean index d4e392af51..8788b57918 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.ClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange + +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 @@ -17,6 +19,8 @@ ideles and identifies relative class inclusion with the concrete extension map on ordinary idele classes. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean index 824498b64e..39f3b6b059 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.AdeleBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange /-! # The norm on ordinary ideles @@ -15,6 +17,8 @@ field transports that existing norm to the usual map `N_{L/K} : I_L → I_K`. -/ +@[expose] public section + open scoped NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean index 0b08aab53e..7770a3ebc2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean index 5cbf63b828..a57161fe89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm + +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 @@ -17,6 +19,8 @@ place below `W`; the surviving component is the corresponding local degree power. -/ +@[expose] public section + open scoped BigOperators NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean index 2b54ae897c..da69a89b73 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.GaloisNorm /-! # Local components of relative adeles and ideles @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean index cefc93d244..2698500718 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean index 37825ff803..aa6d0ff323 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness -import Mathlib.RingTheory.RamificationInertia.Inertia + +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 @@ -27,6 +29,8 @@ also concrete: inertia degree of the corresponding prime of the number-field extension. -/ +@[expose] public section + open scoped NumberField ValuativeRel WithZero open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean index 7d4b81be1f..032caec992 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange -import Mathlib.RingTheory.Norm.Transitivity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.BaseChange +public import Mathlib.RingTheory.Norm.Transitivity /-! # Functorial properties of the idele norm @@ -16,6 +18,8 @@ statements record the base-field power formula and compatibility with principal ideles and Galois conjugation. -/ +@[expose] public section + open scoped BigOperators open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean index 502e5300ad..886dd8d17a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm + +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 @@ -17,6 +19,8 @@ the place below `v`; the surviving component is the corresponding local-degree power. -/ +@[expose] public section + open scoped BigOperators NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean index 50fa5c1cc7..1d1ed96260 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.RestrictedProductUnitsTopology -import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean index 27aa7a72dc..3cef96ff2a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean index 96e19e310d..111afbf89a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.ClassGroup.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean index d5eb30214e..85220e00c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean index 46498743fa..e459683ad1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import Mathlib.LinearAlgebra.FreeModule.IdealQuotient -import Mathlib.Topology.Algebra.Valued.LocallyCompact + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean index 2af9837211..b2cce55d9d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean index 4e8b7aee9f..eaf18f1301 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean index 86c825f227..323019709b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean index ae2a1f4c9c..0bd18400c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean @@ -3,19 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification +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 @@ -32,6 +34,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean index bd66bec8cf..51211cfea1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import Mathlib.Analysis.SpecialFunctions.Pow.Real -import Mathlib.FieldTheory.IsAlgClosed.Basic + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean index f23674cf24..2353969b40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean index 5e45f69bde..44f865a893 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import Mathlib.Algebra.Module.ZLattice.Basic -import Mathlib.Analysis.Normed.Field.ProperSpace -import Mathlib.NumberTheory.NumberField.ClassNumber -import Mathlib.NumberTheory.NumberField.Units.DirichletTheorem + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean index 2fef6e7293..843cfc330f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean index 9cb91401f9..c5b27cfe89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean index 70c255e04c..d0d032e603 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic /-! # Archimedean behavior of idele norms @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean index 510842a602..95a0fd13ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean index e09764d338..f8dda36069 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.FiniteNormArithmetic /-! # Scalar-extension behavior of idele norms @@ -14,6 +16,8 @@ base-change realization is included as the endpoint used by cyclotomic reciprocity. -/ +@[expose] public section + open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean index 89fb61eb95..0e0de58c9d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import Mathlib.Algebra.BigOperators.Finprod -import Mathlib.NumberTheory.NumberField.Completion.Ramification -import Mathlib.RingTheory.Ideal.Norm.RelNorm + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean index 17850ad6dd..f8ca564ba3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean index 4f89b772cc..d2894b1cf4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ArchimedeanNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm /-! # Norms on norm-one idele groups @@ -13,6 +15,8 @@ The ordinary idele norm restricts to a homomorphism between the actual norm-one idele subgroups. -/ +@[expose] public section + open scoped NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean index 9b58955841..8e2c359b50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import Mathlib.Analysis.SpecialFunctions.Pow.Continuity + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean index b2b7c33d1d..25876b02b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalCore -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation + +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 @@ -16,6 +18,8 @@ field units with principal relative ideles, and transports low-degree Tate cohomology across that identification. -/ +@[expose] public section + noncomputable section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean index f5ab286cfc..05db230fd5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic /-! # Principal ideles and the idele class group @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean index 3f60258f97..41405fac47 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormCore -import Mathlib.RingTheory.FractionalIdeal.Norm + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean index 130cc479e5..28afb1643a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import Mathlib.Topology.Algebra.IsUniformGroup.Basic + +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 @@ -19,6 +21,8 @@ integers. Its infinite component then lies in the Minkowski integer lattice, whose topology is discrete. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean index 9b01b659cf..525e122425 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean index afdda5b488..ea246ceda1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FiniteIntegralNormPreimage -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean index 4b41f39707..d0f2219d13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation + +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 @@ -28,6 +30,8 @@ every factor of the canonical local tensor decomposition. This is the local res input needed to assemble pointwise local norm preimages globally. -/ +@[expose] public section + open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean index 4cde6ea256..af85d48b77 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean index 1108af15fc..8ac05de8c2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean index fb3e6727d3..e54707b674 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.IdeleSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Localization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.AbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.Lattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.FinitePlaceCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralTensorSupport.LocalTensorDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.IntegralLocalFactor -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product + +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 @@ -23,6 +25,8 @@ subgroups are stable under the Galois action and exhaust the full relative idele group. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean index c6c69db992..fb4c7cee6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalComponent /-! # Finite coefficient support for relative ideles @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean index 3ebd37314a..a7de1e691e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean @@ -3,10 +3,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 -import Mathlib.Topology.Algebra.Group.Units -import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace -import Mathlib.Topology.Algebra.RestrictedProduct.Units + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean index 98bda634a0..14da130799 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import Mathlib.RingTheory.DedekindDomain.SInteger + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean index 65b0342307..89b9f2b5c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation + +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 @@ -16,6 +18,8 @@ that embedding at finite places and the corresponding one-component relative idele. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean index f8fa01dfd8..c0bfc40915 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean @@ -3,17 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import Mathlib.NumberTheory.NumberField.ClassNumber +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 @@ -25,6 +27,8 @@ union of the (finite) supports of those representatives is a finite set `I_K = I_K^S Kˣ`. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean index a39da6246b..4880c58349 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Basic /-! # The idele topology @@ -13,6 +15,8 @@ the topological-group structure and the continuity of every local component map. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean index feadb60af9..a01dc4b3c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.FieldTheory.Normal.Closure -import Mathlib.NumberTheory.NumberField.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean index 9bc315ab6b..4a949f2aae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean index 7787e3f618..1d6eb19cd0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimesModFour -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedEtaleBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitFinset -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.RootDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SupportedDiscriminantBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean index e7126f47fb..152e86e0ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitFinset.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas -import Mathlib.RingTheory.Ideal.Maps -import Mathlib.Data.Finset.Card + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean index e0f72b0f45..6d61a644a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimes.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import Mathlib.FieldTheory.Galois.IsGaloisGroup -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import Mathlib.RingTheory.RamificationInertia.Ramification -import Mathlib.Algebra.Group.Subgroup.Finite + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean index 1651bc6009..ef94b212a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/CompletelySplitPrimesModFour.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.CompletelySplitPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.DegreeOnePrimes -import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic -import Mathlib.NumberTheory.RamificationInertia.Unramified -import Mathlib.NumberTheory.LegendreSymbol.Basic -import Mathlib.LinearAlgebra.Dimension.FreeAndStrongRankCondition -import Mathlib.RingTheory.RamificationInertia.Inertia -import Mathlib.RingTheory.Ideal.Quotient.Operations -import Mathlib.Data.Nat.ModEq + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean index 6925a64e78..ee3f117318 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/DegreeOnePrimes.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SchurPrimeDivisors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.IntegralPrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind -import Mathlib.NumberTheory.Divisors -import Mathlib.Data.ZMod.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean index 85e6a15e1b..fe8f81065a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/EverywhereUnramifiedTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification /-! # Everywhere-unramified towers of number fields @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean index 53e4c2249b..92a96c7521 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import Mathlib.RingTheory.Etale.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower +public import Mathlib.RingTheory.Etale.Basic /-! # Finite-place unramifiedness bridges for number fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean index 04a489f2c9..e3db7154ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import Mathlib.NumberTheory.RamificationInertia.Unramified + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import Mathlib.NumberTheory.RamificationInertia.Unramified /-! # Finite-prime unramifiedness in towers of number fields @@ -14,6 +16,8 @@ finite prime. The transitivity and intermediate-field arguments are proved from multiplicativity of ramification indices. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean index 4c15a27351..4d8b523a80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace -import Mathlib.NumberTheory.RamificationInertia.Galois -import Mathlib.RingTheory.RamificationInertia.Ramification -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas -import Mathlib.RingTheory.RamificationInertia.Inertia -import Mathlib.FieldTheory.Galois.Basic + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean index 4e95f13b7f..f8e2b95f97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/IntegralPrimitiveElement.lean @@ -3,13 +3,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 -import Mathlib.FieldTheory.PrimitiveElement -import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed -import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind -import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient -import Mathlib.RingTheory.Algebraic.Integral -import Mathlib.GroupTheory.Index + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean index e0050c40e4..0474c3858e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/MathlibUnramifiedInterface.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.FiniteUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean index 2c9699a518..c7ed65a2ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.NumberField.Basic -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean index cd54df66e6..48532fb90f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/RootDiscriminantBound.lean @@ -3,15 +3,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 -import Mathlib.NumberTheory.NumberField.Discriminant.Basic -import Mathlib.Analysis.SpecialFunctions.Pow.Real -import Mathlib.Tactic.Positivity -import Mathlib.Tactic.NormNum + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean index 0d01d90ce5..4e408ca187 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SchurPrimeDivisors.lean @@ -3,16 +3,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 -import Mathlib.Algebra.Polynomial.Roots -import Mathlib.Algebra.Polynomial.Div -import Mathlib.Algebra.BigOperators.Group.Finset.Piecewise -import Mathlib.Algebra.BigOperators.GroupWithZero.Finset -import Mathlib.Order.Filter.TendstoCofinite -import Mathlib.Data.Nat.Prime.Defs -import Mathlib.Data.Int.Basic -import Mathlib.Data.Set.Finite.Basic -import Mathlib.Tactic.Ring + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean index ee4d120335..fe3fa69222 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SmallModel.lean @@ -3,13 +3,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 -import Mathlib.Algebra.Field.Shrink -import Mathlib.Algebra.Ring.Shrink -import Mathlib.Basic.Countable.Small -import Mathlib.Data.Rat.Encodable -import Mathlib.LinearAlgebra.Countable -import Mathlib.NumberTheory.NumberField.Basic + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean index bdb50e44ad..eae8233c2a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.GaloisDifferentBound -import Mathlib.RingTheory.UniqueFactorizationDomain.NormalizedFactors -import Mathlib.Data.Multiset.Count -import Mathlib.NumberTheory.NumberField.Discriminant.Different -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas -import Mathlib.RingTheory.Ideal.Norm.AbsNorm -import Mathlib.RingTheory.KrullDimension.Basic -import Mathlib.RingTheory.RamificationInertia.Ramification + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean index b748886289..9e31d95216 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean @@ -3,15 +3,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 -import Mathlib.NumberTheory.NumberField.Discriminant.Different -import Mathlib.RingTheory.Ideal.Int -import Mathlib.FieldTheory.Finiteness -import Mathlib.RingTheory.DedekindDomain.Different -import Mathlib.RingTheory.Ideal.Quotient.Operations -import Mathlib.RingTheory.Ideal.Norm.AbsNorm -import Mathlib.RingTheory.Trace.Defs -import Mathlib.RingTheory.Trace.Basic + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean index 48c6b506ee..d88141ec12 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean index b5ee9ccd87..c08337d3dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal /-! # Power residue symbols over finite fields and ideals -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean index fee187c581..2a33d83fad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/FiniteField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Algebra.Group.Subgroup.Finite -import Mathlib.FieldTheory.Finite.Basic + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import Mathlib.FieldTheory.Finite.Basic /-! # Power-residue symbols over finite fields @@ -17,6 +19,8 @@ power-residue symbol is Its kernel is exactly the subgroup of `n`-th powers. -/ +@[expose] public section + namespace AlgebraicNumberTheory namespace PowerResidueSymbols diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean index bcee4154c8..0d640cf731 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField -import Mathlib.NumberTheory.NumberField.Ideal.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean index 0abb757505..4540d3c743 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/QuadraticReciprocity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.LegendreSymbol.JacobiSymbol + +public import Mathlib.NumberTheory.LegendreSymbol.JacobiSymbol /-! # Gauss reciprocity and its supplementary laws @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean index fde7c351b2..b6e77a1341 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean index 2c466eb4e9..d6acd3479f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean index 9963e7d811..b6c48fbb60 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean index 3ba4be9951..1ef26ab03a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.GaloisClosure -import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality + +public import Mathlib.FieldTheory.Galois.GaloisClosure +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality /-! # A finite-group degree product @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean index 5336b9ca76..f105f91a48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.DedekindDomain.Different -import Mathlib.RingTheory.DedekindDomain.Factorization + +public import Mathlib.RingTheory.DedekindDomain.Different +public import Mathlib.RingTheory.DedekindDomain.Factorization /-! # Finiteness of ramified primes in Dedekind extensions @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean index 9f39c13d6f..6e346e5b82 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import Mathlib.NumberTheory.NumberField.Ideal.Basic + +public import Mathlib.NumberTheory.Padics.HeightOneSpectrum +public import Mathlib.NumberTheory.NumberField.Ideal.Basic /-! # Rational prime ideals @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean index 7f5a0387a9..1c650dd577 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean index 1e732e8a91..3747b3b9ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean index 584b594ee9..c08a5114b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite /-! # Decomposition groups and complete splitting at finite places @@ -23,6 +25,8 @@ complete splitting is equivalent both to cardinality one and to local degree one. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean index 5498fb8b09..0fb99a4321 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension /-! # Finite-place splitting through prime ideals @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean index c920201296..b066586148 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import Mathlib.FieldTheory.Normal.Closure + +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 @@ -30,6 +32,8 @@ the `K`-conjugates of `L`, then `H` has trivial normal core. completely already in `M`. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean index 18f99462d7..eb724e962b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure /-! # Prime-order fixed fields and complete splitting @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean index e638b55b5b..02b3c630c2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.NumberField.Discriminant.Different + +public import Mathlib.NumberTheory.NumberField.Discriminant.Different /-! # No nontrivial everywhere-unramified extension of ℚ @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean index 457115b175..ef5d46f052 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean index 9665040d6e..6104060103 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean index de81edfc73..7a70f792c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal /-! # Multiplicative weak approximation for ideles @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean index b2fa7f4b44..abc33b7b93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology -import Mathlib.RingTheory.Ideal.Quotient.Operations + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalTopology +public import Mathlib.RingTheory.Ideal.Quotient.Operations /-! # Finite ray-modulus data @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean index cf36c1f57d..4bde655142 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic /-! # Ray moduli with selected real places @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean index 7d32ab2538..4b3984c4ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues -import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace -import Mathlib.Topology.Algebra.IsOpenUnits -import Mathlib.Topology.Algebra.Ring.Compact + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean index 79ec303f00..2cbe7545bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormLocalOrder -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import Mathlib.Algebra.BigOperators.Finsupp.Basic + +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean index cc75e6d98b..fd9ddf5a51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus /-! # Local conductor subgroups in the idele class group @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean index abebdbd8ec..c40cdf3212 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus /-! # Narrow ideal classes @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean index 1dfd2eb7fb..2dfb2fae44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import Mathlib.RingTheory.ClassGroup.Basic + +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 @@ -16,6 +18,8 @@ the ordinary ideal class group. The equivalence below also identifies their finite-prime classes. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean index 1e811974f2..098c0b1b11 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal /-! # Prime generation of ray ideal classes @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean index ee3e35dfab..af3631a1e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic /-! # Comparison of public and idelic higher-unit groups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean index b6a28d6cbc..9f022c8c72 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import Mathlib.Data.Nat.Factorization.Basic -import Mathlib.Data.Nat.GCD.BigOperators -import Mathlib.Data.ZMod.Units -import Mathlib.NumberTheory.NumberField.Units.Basic -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import Mathlib.NumberTheory.Padics.RingHoms + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean index 4b98403b41..e912ecbd92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.FullModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import Mathlib.Analysis.Complex.Convex -import Mathlib.Basic.Sign.Basic -import Mathlib.Topology.Algebra.Ring.Compact -import Mathlib.Topology.Connected.Clopen -import Mathlib.Topology.Instances.Sign + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean index 6380d00e4f..7c39d7de8c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean index 973a9edb31..ef0c21a0ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean index bf2df59315..85b5775bee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index c0db0b6108..d26f7a39b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic -import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Norm + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean index c7dae550ae..bec7b27807 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Rank -import Mathlib.Algebra.Module.PID -import Mathlib.Algebra.Module.ZLattice.Basic -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -23,6 +25,8 @@ and its coordinate-sum-zero hyperplane are constructed below from this lattice. -/ +@[expose] public section + noncomputable section open IsDedekindDomain Module diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean index e1db198b13..c9039ec4da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import Mathlib.Algebra.Exact.Basic -import Mathlib.LinearAlgebra.Dimension.Torsion.Finite -import Mathlib.LinearAlgebra.StdBasis -import Mathlib.NumberTheory.NumberField.ClassNumber -import Mathlib.NumberTheory.NumberField.Units.Regulator -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 @@ -19,6 +21,8 @@ The finite set `S` contains the finite places; all infinite places are understood to be present. -/ +@[expose] public section + noncomputable section open IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean index 5434576ade..c90b4b5d92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.FieldTheory.KrullTopology -import Mathlib.NumberTheory.NumberField.Basic + +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.FieldTheory.KrullTopology +public import Mathlib.NumberTheory.NumberField.Basic /-! # Embeddings into a separable closure @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean index aaf31609ca..8368f9255f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.LinearDisjoint -import Mathlib.LinearAlgebra.Dimension.Constructions -import Mathlib.LinearAlgebra.TensorProduct.Basis + +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 @@ -21,6 +23,8 @@ For Galoisness, every automorphism of `L / K` is extended by dimension of the tensor product. -/ +@[expose] public section + open scoped TensorProduct noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean index 618fcd405f..25dcdc8678 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All + +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 @@ -33,3 +35,5 @@ For a smaller production dependency closure, import `LocalClassFieldTheory`, `GlobalClassFieldTheory`, `HasseArf`, or `KroneckerWeber` directly. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean index 2e2776a40c..d8870164b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean index 4061332575..4a9483b324 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All + +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 @@ -19,3 +21,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean index a6fc10a7c4..8902e28edc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean @@ -3,28 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean index 34b3595d75..6814cdfa74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean index 026c3c95b6..64cdcf2a61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/EmbedsInRayClassField.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization /-! # Embedding into a ray class field -/ +@[expose] public section + namespace ClassFieldTheory universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean index dbefb3fb58..46a86800f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNormExponentMap +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization /-! # Relative norm of nonzero fractional ideals @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean index 4ef686ce23..2b2e6a3235 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean @@ -3,12 +3,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 -import Mathlib.Algebra.BigOperators.Finsupp.Basic -import Mathlib.NumberTheory.NumberField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Ideal.GoingUp -import Mathlib.RingTheory.Ideal.Norm.RelNorm + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean index 632c19db35..cad4b9dd58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsAbelianConductor.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField /-! # Conductors of finite abelian extensions -/ +@[expose] public section + namespace ClassFieldTheory universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean index f5f755bad1..c96bd4dd66 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean index 48eda2697b..d71bcffb03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsUnramifiedOutsideModulus.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification -import Mathlib.RingTheory.Unramified.Locus + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean index 1b97aa1f91..89a7f90a54 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import Mathlib.RingTheory.ClassGroup.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean index a0e302fc3e..90d0864ff2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean index 82f3bdbd5e..b5ae7183ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/OrdinaryRayClassModulus.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus /-! # The ordinary class-group modulus -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean index 244cdd372c..e3f8879f3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization /-! # The ray Artin map -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory.RayClassFieldRealization diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean index 6a9239e4d9..2130227b2b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassFieldRealization.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean index 5fe2a2f79a..c31b88698a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassGroup.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import Mathlib.GroupTheory.QuotientGroup.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean index 8c74862410..a7b4369d70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import Mathlib.Data.Finsupp.Order -import Mathlib.GroupTheory.QuotientGroup.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean index cd569928ef..2dab4d4336 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.FractionalIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import Mathlib.Algebra.BigOperators.Finsupp.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean index fc4b5ad108..11de337828 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean @@ -3,18 +3,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 -import Mathlib.Algebra.FiniteSupport.Defs -import Mathlib.Order.Preorder.Finsupp -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean index 4a353f5434..c24ae5d09c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean index 28881c3d71..fc375f552a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassPrimeToIdeals.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean index 1c6fcf4ed9..a1c5725db3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import Mathlib.GroupTheory.QuotientGroup.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import Mathlib.GroupTheory.QuotientGroup.Basic /-! # The quotient induced by a ray-class Artin map @@ -13,6 +15,8 @@ The prescribed subgroup is identified with the Artin kernel before applying the first isomorphism theorem. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean index 2481acfc19..ed89a4772c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupRealization.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean index ac9ca1ed02..82df7592cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean @@ -3,13 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.Ideal.Quotient.Operations + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean index 82e3fe3834..9dde1cce48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayPrincipalIdealSubgroup.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassPrimeToIdeals -import Mathlib.RingTheory.ClassGroup.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean index 220fb90e3d..a5836f4a21 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean index 66e8ab2579..5a8407a41f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealFactorization + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean index 98b20956ae..bb10f54402 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean @@ -3,15 +3,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 -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.NumberTheory.RamificationInertia.Galois -import Mathlib.RingTheory.Frobenius + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean index 8d54fe6c40..6af3acbe52 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean index 21ad001896..a795daddaa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeSplitsCompletely.lean @@ -3,13 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.NumberTheory.RamificationInertia.Galois + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean index d6474bee9f..db947c3bff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsBigHilbertClassField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean index bcb32b6283..64ea2ce3e5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsEverywhereUnramified.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsUnramifiedAtFinitePlaces -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean index c58df000d9..647abb54ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsSmallHilbertClassField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsEverywhereUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean index 6f757fa093..2e18a87802 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/IsUnramifiedAtFinitePlaces.lean @@ -3,13 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.Unramified.Locus + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean index b30bd0c660..a0ea8430f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.NumberFieldFractionalIdealGroup -import Mathlib.Algebra.BigOperators.Finsupp.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean index acd6cd1807..876e971f84 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealGroup.lean @@ -3,13 +3,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 -import Mathlib.NumberTheory.NumberField.Basic -import Mathlib.RingTheory.ClassGroup.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean index 004c499de5..8cba5ca69c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean index 56966f5132..da358172a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean index cf934b1aac..8635883994 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.NumberTheory.NumberField.Basic + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.NumberTheory.NumberField.Basic /-! # Finite abelian extensions of number fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean index 8cc712fa38..aa23fb79da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityData.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean index da06b35f6e..fff3b62812 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import Mathlib.GroupTheory.QuotientGroup.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData +public import Mathlib.GroupTheory.QuotientGroup.Basic /-! # The quotient induced by a finite Artin map @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean index 39a028c2b8..998aa91525 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic /-! # Finite-place tensor-norm subgroup @@ -16,6 +18,8 @@ The local algebra of `L / K` at a finite place `v` is factors above `v`; it does not choose a single completion of `L`. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean index 1579c5110c..d73ba44442 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IdeleClassConnectedQuotient.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.NumberField.AdeleRing -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Group.Subgroup -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean index 4919455b75..3076c16ac3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/IsMaximalAbelianGlobalArtin.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import Mathlib.FieldTheory.AbsoluteGaloisGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient +public import Mathlib.FieldTheory.AbsoluteGaloisGroup /-! # A maximal-abelian reciprocity-map property @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean index 47d6dc1ba6..6a6a69d612 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean index bfdf658c08..126707d84f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean index e9c0a0b73d..ce8c73c91d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import Mathlib.Algebra.Order.Floor.Ring -import Mathlib.Algebra.Order.Archimedean.Real.Basic -import Mathlib.Basic.Real.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean index 10926e98d3..18c4553c0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import Mathlib.Algebra.BigOperators.Group.Finset.Basic -import Mathlib.Algebra.Field.Rat -import Mathlib.Data.Finset.Interval -import Mathlib.SetTheory.Cardinal.Finite + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean index 6584071721..b21d463997 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.Logic.Function.Basic -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean index 0604ece19c..25a2aee2be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsLowerRamificationJump.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup + +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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean index e13e7691cf..f9a2dd17a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup /-! # Upper ramification jumps @@ -13,6 +15,8 @@ indices. A jump occurs exactly when that right limit differs from the group at the index itself. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean index b25133d0bf..3947eb7dfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean @@ -3,12 +3,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 -import Mathlib.RingTheory.Valuation.RamificationGroup + +public import Mathlib.RingTheory.Valuation.RamificationGroup /-! # Lower ramification groups -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean index 92a057cb8d..160c8456be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import Mathlib.Algebra.Order.Archimedean.Real.Basic -import Mathlib.Algebra.Order.Floor.Ring -import Mathlib.Basic.Real.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean index 33e51d9f2b..6aa5052090 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup /-! # Real-index upper ramification groups @@ -13,6 +15,8 @@ The upper group at `t` is the public real lower group at the inverse Herbrand index `ψ(t)`. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean index 77cdb38821..7458a61140 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean index b3917065ca..2076a443df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean index d878f5a125..0a945396a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/FinitePlaceHilbertBadSet.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +public import Mathlib.NumberTheory.NumberField.Completion.FinitePlace /-! # Possible nontrivial finite-place Hilbert factors @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean index e45135d3bc..a1abd19880 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFamily.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean index 138fc70e61..e9e7872c03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean index cd54bcf6a7..2f4d5d242c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingProperties.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean index 20b05d1224..234f377441 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean @@ -3,13 +3,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 -import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean index 8b9c978756..e766166a68 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairing.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean index 23886c93cc..36640fca65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingLaws.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol /-! # Algebraic laws for Hilbert pairings -/ +@[expose] public section + namespace ClassFieldTheory.HilbertPairing universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean index de2358bad1..58fe95ce00 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingNormResidueCriterion.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean index bb968a93f2..26f759c74a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/HilbertPairingSymbol.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean index 6cca95c1d8..44739f5aa8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsKummerNorm.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import Mathlib.RingTheory.Norm.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean index f283d95a54..ac2ab45a59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/IsLocalHilbertPairing.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingNormResidueCriterion + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean index 5a46f74f16..9717c90304 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebra.lean @@ -3,12 +3,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 -import Mathlib.FieldTheory.KummerExtension + +public import Mathlib.FieldTheory.KummerExtension /-! # Canonical Kummer algebras -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean index ba36f19362..ae61151024 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import Mathlib.RingTheory.Norm.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.Norm.Basic /-! # Norm subgroup of a Kummer algebra @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean index 6a3855a190..286657d6e6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClass.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup /-! # Canonical power classes -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean index 0a1d29ea86..1f421c9561 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/PowerClassGroup.lean @@ -3,13 +3,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 -import Mathlib.Algebra.Field.Basic -import Mathlib.GroupTheory.QuotientGroup.Basic + +public import Mathlib.Algebra.Field.Basic +public import Mathlib.GroupTheory.QuotientGroup.Basic /-! # Multiplicative power-class groups -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean index 979ec6c764..3c63ee40cc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean index dce2bd4814..b7bc8045a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean index 0e9cbf234d..15dee1becc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean @@ -3,12 +3,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 -import Mathlib.RingTheory.Norm.Basic + +public import Mathlib.RingTheory.Norm.Basic /-! # The field norm on multiplicative groups -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean index 071985d54e..bf4d5cd31f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.GroupTheory.QuotientGroup.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean index 36f9584e59..f89d2b0288 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormHom /-! # The subgroup of field norms -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean index edf53fb689..bc7b3ab542 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.IsSepClosed + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean index 37ef7d2efb..fdd7189ed6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup /-! # Predicate for field norms -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean index 0fe8d759b9..992711e110 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/OpenFiniteIndexSubgroup.lean @@ -3,13 +3,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 -import Mathlib.GroupTheory.Index -import Mathlib.Topology.Algebra.Group.Units + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean index 53cc0a550d..3b2771386e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean index bbd48f9c00..e3dabefc99 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean index e4bc40b1f1..ec1fc2a00f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/ExtendingAbsoluteValue.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Algebra.Basic -import Mathlib.Basic.Real.Basic -import Mathlib.Topology.UniformSpace.AbsoluteValue + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean index 37b516001d..082132ffdd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsEverywhereLocalNorm.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean index 3d4afb3005..d7ead6c453 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtFinitePlace.lean @@ -3,14 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean index db4ad23982..c44dbb29a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/IsNormAtInfinitePlace.lean @@ -3,14 +3,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 -import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean index 43af43b454..064c0d91ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean index 477390af4f..818c8214f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All + +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 @@ -17,3 +19,5 @@ 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`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean index a86d4673f4..f1cee534bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean index 3f4c25c46b..a58fa5a5e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean index 4e0dae0755..6544d05ff3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -3,26 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeDegreeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison + +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 @@ -37,6 +39,8 @@ through the equivariant identification of `Lˣ` with the subgroup of principal relative ideles. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index f886fbbd84..b1b406c281 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.NormProperties -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge + +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 @@ -33,6 +35,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean index 4cb871d964..f3833fead3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean index 90942cb3ce..3777aea984 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean index 1336c10b46..9e9551a174 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean index 1f63774471..a498f1b2ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import Mathlib.Algebra.Group.Equiv.Basic -import Mathlib.Basic.Sign.Basic -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean index 30de61d306..a29435db46 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -15,6 +17,8 @@ and finite residue-field structures used by finite-place class-field arithmetic. -/ +@[expose] public section + open scoped NumberField ValuativeRel open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean index f2739d1769..f2e86dbc01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean index 1768cad691..2dd08b1001 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete -import Mathlib.NumberTheory.NumberField.ProductFormula + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean index 0e1d294d51..c44d43927c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion + +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index 07a2254830..e9a0f4bde2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import Mathlib.FieldTheory.IsSepClosed + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean index 77f6b0d813..0191db485d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean index 7a387768c7..c681403d5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SupportedIdelePowerLocalUnitQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import Mathlib.Algebra.Group.Equiv.Basic -import Mathlib.Algebra.Group.Subgroup.Ker + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index ffda2e08ae..d524d48b32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitLocalPowerMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.KummerLocalNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PrincipalNorm + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean index 24583cc373..db5d866195 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean index b055391425..852f6e7a03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -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.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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean index e5f0a854d0..78222ea456 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple + +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 @@ -15,6 +17,8 @@ Hasse norm theorem into the implementation-independent predicates in `ClassFieldTheory.Definitions.NormTheorems`. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean index e3c0923184..a062682721 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean index f182123de3..57f67ed44f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet -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.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 @@ -18,3 +20,5 @@ This aggregate module exposes the restriction-kernel construction, prime selection, decomposition-field identifications, and the final local-power kernel theorem. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean index 7853681ade..0bb2b8f35e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean @@ -3,10 +3,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 -import Mathlib.Combinatorics.Hall.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean index ecb20a65e0..96bb3e0e20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean index 86db7b67aa..f2e1480a7e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition + +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 @@ -14,6 +16,8 @@ Kummer extension and proves the required decomposition and unramifiedness properties. -/ +@[expose] public section + open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean index 8138f6912a..463a4027c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 23a1749b74..5c2245cdc9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean index c343cc76c7..808c3d032d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection /-! # The finite prime set for an S-unit Kummer extension @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean index e45a0d51d4..c399658eb2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core /-! # Restriction kernels of S-unit Kummer extensions @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean index dd6d5fc542..550846d7b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.RestrictionKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.BasePlaceSelection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.CoordinatePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.PrimeSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.DecompositionFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.SUnitKummerPrimeSelection.Conclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Principal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import Mathlib.Algebra.Group.Subgroup.Finite -import Mathlib.GroupTheory.Index + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean index 6a9277b098..49b44d8ad9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdelePowerLocalUnitSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation /-! # Supported idele power-local-unit quotient @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean index 5bb1b8fbb4..3b64e56270 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean index c7a2fde576..ec73d63b07 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean index e6e7615e3a..f6a8877503 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CyclicPrimePowerFullDecomposition + +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 @@ -19,6 +21,8 @@ modules; this file contains only the global class-field-theoretic conclusion. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean index cf9e711d58..bf1a21bb93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.IdeleClassHerbrandSupportedFinal + +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 @@ -23,6 +25,8 @@ finite places outside a finite set split completely, then the idele class norm is surjective. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index 55037198f7..bb877bab42 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -3,31 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Local -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.FamilyCardinality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Herbrand.Factors -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.HerbrandExactSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import Mathlib.Algebra.BigOperators.GroupWithZero.Finset + +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 @@ -36,6 +38,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean index 22a588b5e2..375f1a05b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean @@ -3,84 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean index 5cc173a992..1c38652988 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -3,16 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization +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 @@ -28,6 +30,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean index 6c9e88f7b1..1bd977adc2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor /-! # Ramification support of abelian narrow finite norm conductors @@ -15,6 +17,8 @@ ramification locus, while the minimal narrow finite conductor has support contained in that locus. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean index 31455dc0aa..33bc53dca5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction /-! # Comparison of global and local conductor exponents @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean index dfdc4ae07c..701289d63d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.FiniteRestrictedProductBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor + +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 @@ -22,6 +24,8 @@ class field theory, and the local conductor-zero criterion then detects unramifiedness. -/ +@[expose] public section + open scoped NumberField NNReal ValuativeRel noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean index 9c2573b153..f004d47729 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean @@ -3,84 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicConductorUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RationalRayPrimeClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeNormClass + +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 @@ -89,3 +91,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean index eab9267b1d..2347e8cdd4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -24,6 +26,8 @@ canonical arithmetic reciprocity homeomorphism are fixed rather than merely asserted to exist. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean index 55dfce8502..6b9a38324d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -22,6 +24,8 @@ public bundle here is `MulEquiv`; the preceding Galois/norm-quotient factor remains a `ContinuousMulEquiv`. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean index 8ccce572bc..209c242e9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization /-! # Arithmetic reciprocity for actual ray class fields @@ -16,6 +18,8 @@ idèle norm range, the finite Krull topology, and the native ray-class quotient topology. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean index 0264963e2e..d0e2442d33 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean index 13c3c237cf..55b1d9a1e2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice /-! # The big Hilbert class field @@ -16,6 +18,8 @@ maximal-unramified field statement follows from this input together with the narrow finite conductor/ramification criterion. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean index 4678cfe043..1b7924e638 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean index 9a659475a4..dfdd266d1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField /-! # Naturality of the big Hilbert class field @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean index 6065c91db8..6bac7113f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization /-! # The big Hilbert class field over the original number field @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean index 992408fdfd..d3f491770b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean index f914c04809..b236fe7aba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondenceTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteIndexNormClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.OrdinaryNormClassField + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean index 1542549265..58b39742ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldConstruction /-! # Norm range over the canonical fixed-field base @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean index 7b5f4e4cf9..32889aa923 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldNormRange /-! # Transport to the original number field @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean index 96e70f46ca..f52d1f1545 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean index 966b05f3c5..e589a9f365 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean index 2944a554e5..717eae7b34 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean index daf107e596..04e1710c90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation + +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 @@ -17,6 +19,8 @@ continuous provider. This avoids a second specialization of the full finite global reciprocity instance tower. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean index 9648195062..f58244e230 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction /-! # Evaluation of algebraic closed finite-index reciprocity @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean index 92d057e8f2..2d1df23f2f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All + +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 @@ -17,3 +19,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean index 3245d7d43a..2888befe5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue /-! # Degree of a closed finite-index class field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean index 3fa2bff8a9..a2d69fea91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean index f4fce00932..50d684d7aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean index c928063e2d..7f2caf1945 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean index d01ab9d0cb..2cd00828a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport /-! # Continuous closed finite-index class-field reciprocity @@ -14,6 +16,8 @@ elimination preserves the native quotient topology, so no discrete topology instances are reconstructed here. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean index 20716f81c5..35a0316045 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore /-! # Evaluation of continuous closed finite-index reciprocity @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean index 27e7d2a9af..8fc06cb1ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue /-! # Generic evaluation core for transported reciprocity @@ -13,6 +15,8 @@ equality. It proves the composition formula once without unfolding a domain-specific selected-field construction. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean index e3e9a1c680..c1fc1bad0f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction /-! # Named value of closed finite-index reciprocity @@ -14,6 +16,8 @@ selected class-field instance tower once while remaining definitionally equivalent to the historical formula. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean index f7eab3896e..2b6c2854e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree /-! # Continuous transport between equal quotient groups @@ -14,6 +16,8 @@ continuous multiplicative equivalence directly; no discrete-topology instances or domain-specific class-field tower are required. -/ +@[expose] public section + noncomputable section namespace QuotientGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean index b23bb72fc1..23cf6215a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology /-! # Narrow finite conductors @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean index 4d1664ddc0..a00c6a44e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean index dda8878669..57349a2ed2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison /-! # Removing one real place from a defining modulus @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean index bd997f709a..bc32e491fe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison /-! # Lattice operations on narrow finite conductors @@ -17,6 +19,8 @@ for a compositum. For a generated subgroup one obtains the complementary divisibility by the pointwise minimum. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean index fe6669ccda..8e1df58b3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.Conductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.LocalConductor /-! # Narrow finite and local conductor exponents @@ -21,6 +23,8 @@ idele into its one-place component and the remaining defining-modulus component. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean index 9e52791719..a5349a44d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean index 632108dea9..0863dfb383 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice /-! # Exact narrow finite conductor ray-class presentations @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean index 3e099ff0f0..f0d0c6831a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLocalComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace + +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 @@ -28,6 +30,8 @@ exponents for a global extension, yielding the global conductor-support corollary. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean index 90049b70a9..24185fd591 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicRayClassMaximality /-! # Uniqueness of maximal cyclic norm subgroups at a narrow finite conductor @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean index dd39956bd2..743ba358f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex /-! # Narrow finite conductors of cyclic class-norm subgroups @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean index 27f38c0c80..4b5db0305f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex /-! # Exact norm quotients in a cyclic tower @@ -15,6 +17,8 @@ already available right exactness, this gives the short exact norm sequence and its exact cardinal factorization. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean index 3bf8d39301..7a6c4b296f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclicNormConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormRayClassMaximality /-! # Maximal cyclic quotients at the narrow finite conductor @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean index ff27872593..a120a76e6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.KummerNormDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import Mathlib.NumberTheory.Cyclotomic.Basic + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean index 6b605ad70e..211a73bb1a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean index 8093860257..1d3f03cc81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -3,18 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor +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 @@ -31,6 +33,8 @@ extension yields the intrinsic containment criterion over the original number field. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean index aa24d6e907..d642e6d6c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation + +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 @@ -23,6 +25,8 @@ subgroups: composita correspond to intersections and intersection fields correspond to products. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean index 9da9e27d28..09b591271a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue + +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 @@ -22,6 +24,8 @@ subgroup, together with its norm-range and degree-index theorems, is provided by `ClosedFiniteIndexClassField`. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean index 993adc5e72..7c775d5a20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PowerCongruenceCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.CyclotomicKummerNormDescent + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean index 7d3441afa2..b96ee4201f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core /-! # Finite-place Artin quotients @@ -16,6 +18,8 @@ identifies the concrete local norm quotient with the decomposition group. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean index b67f85c487..ba8ee64333 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization /-! # Full conductors and ray class field containment @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean index 39d95f6137..251cb550da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField /-! # Comparison of the big and small Hilbert class fields @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean index 2905f81ec7..6485c7cc7d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.EmbeddedAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import Mathlib.NumberTheory.NumberField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean index 3dbe843082..5a409ac474 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertNormCharacterization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization /-! # Maximality criteria for Hilbert class fields @@ -15,6 +17,8 @@ ordinary class number. Thus a maximal-degree unramified cyclic extension has the canonical Hilbert reciprocity quotient. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean index 2f819b491e..bbf4c12b36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting + +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 @@ -19,6 +21,8 @@ and proves that trivial Frobenius is equivalent to principality of the prime ideal. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean index 23124710f3..a20c71a670 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue + +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 @@ -30,6 +32,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean index 2d02641635..a06f1ee7d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean index 8d56756279..c138a650b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -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.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 @@ -16,3 +18,5 @@ This compatibility facade exports the generic transport core and the independently compiled big/small, realized-base/original-base reciprocity specializations. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean index 30f5f36b9f..8387ed2676 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean index 9867dd311d..120b70466e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean index 620770e706..ecbfa7ff35 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean index 867a57dac8..1237372a2d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean index 1d80b9b935..6c4087851c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization /-! # Generic transport core for Hilbert class-field reciprocity @@ -14,6 +16,8 @@ reuse the named data provider without rebuilding the generic reciprocity composite. -/ +@[expose] public section + open scoped IsMulCommutative NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean index 485200951b..26a59cd4ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.Transport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallActual -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.BigOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility + +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 @@ -21,6 +23,8 @@ compatibility therefore turns the vanishing of their intrinsic finite conductors unramifiedness at every finite prime. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean index a99d130dff..ce5805455f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean index e0bfa20597..c0643877ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel /-! # Infinite abelian class-field correspondence @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean index ef872c8be6..a1c9da8261 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity + +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 @@ -28,6 +30,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean index d9d8c70ac0..fe335f4387 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean @@ -3,37 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticHilbertClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ExtensionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldOverOriginalBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.NormalClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.Herbrand -import Mathlib.NumberTheory.RamificationInertia.Unramified -import Mathlib.FieldTheory.Finite.Basic -import Mathlib.RingTheory.Frobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.MathlibUnramifiedInterface +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 @@ -45,6 +47,8 @@ element. Its residue action identifies it with Mathlib's arithmetic Frobenius at every unramified finite prime. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean index b2ea24c537..b5c3525194 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -3,24 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.InfiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean index 38ee8e4bb0..948b1dbd86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorRayClassMaximality + +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 @@ -30,6 +32,8 @@ finite places. The full conductor, including an archimedean component, is deliberately not defined here. -/ +@[expose] public section + open scoped NumberField IsMulCommutative noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean index 2dc05bf077..4acd143e01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MaximalAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean index 8861c85afa..92e5fcdaaf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor /-! # Exact narrow finite ray-class presentations of norm quotients @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean index 91375d1887..830c417712 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor + +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 @@ -26,6 +28,8 @@ all-real-positive convention, not a claim about the full archimedean conductor. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean index e7b17217bd..fc088d3008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean index 3d6ae26a4b..cff3008db3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex + +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 @@ -26,6 +28,8 @@ This is the concrete power-congruence core used in the existence proof for global class fields. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean index 77a9778d41..ac89eea66b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean index 2f09ef8250..37014783f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean index 7acae2de1e..f230c28fa8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean index a02bc889f3..989f4a2ae9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticRayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FullConductorRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassSubgroupPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsUnramifiedOutsideModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import Mathlib.Data.Finsupp.Order + +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean index 84c5c291ab..e7e6afd5e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele + +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 @@ -18,6 +20,8 @@ one-place prime idèle represents the direct residue unit `q` in compare rational ray reciprocity with the cyclotomic character. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index 4968fe0f21..8030f3eb5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -3,23 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.NormalFieldRange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Degree -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.QuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.EvaluationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Topological.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.Algebraic.Evaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldReciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue +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 @@ -36,6 +38,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean index aa21c091fc..e9034267d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import Mathlib.Data.Finsupp.Order + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean index baf0b3dac2..06c763fe5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean index c4580d6342..35007fd92e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization /-! # Subgroup order and chosen ray class fields @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean index 6dbbe01b80..438d054bea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean index 966006f35d..509835c77b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorInfinitePart -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean index 9a81aceca6..2721ac6995 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele /-! # Frobenius generation of ray class groups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index 392f1bcdbd..ed92bb537b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.ArchimedeanPowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlaceCompletionInstances -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.LocalResidueArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.FinitePlacePowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.NormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedIdeleIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.SupportedPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassPowerLocalUnitQuotient.PrimePowerKummerIndex + +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 @@ -26,6 +28,8 @@ These are the two concrete cardinal ingredients in the class-field existence argument. -/ +@[expose] public section + open scoped NumberField BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean index 2d62e1a6b6..37c6ddd4a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SUnitKummerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex + +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 @@ -20,6 +22,8 @@ from the independently computed quotient cardinal and the global norm-residue index formula. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean index b7d7a20b7a..d2345110f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Narrow -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import Mathlib.NumberTheory.NumberField.ClassNumber -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassField + +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 @@ -17,6 +19,8 @@ quotient is canonically the ordinary ideal class group; consequently its order is the class number. -/ +@[expose] public section + open scoped NumberField IsMulCommutative noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index 2224d405eb..6437992228 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldReciprocity.SmallOriginal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean index df1b5bf995..ab6017ae3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation + +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 @@ -18,6 +20,8 @@ finite abelian extension unramified at all finite and infinite places inside the selected field. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean index a31e0bf6c9..8caed53bb4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison /-! # Naturality of the small Hilbert class field @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean index f922dbcdca..280721c6d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization /-! # The small Hilbert class field over the original number field @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean index 49a7a36f0c..a90f913375 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.CyclicIdeleClassNormIndex + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean index 338c1a7011..4926765c8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin + +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 @@ -24,6 +26,8 @@ decomposition law: the prime Artin element is trivial exactly when the place splits completely. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean index 96b78f1ce9..fd5c93f022 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ConductorFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FinitePlaceArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean index db59ce4172..4f05b7a6c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean @@ -3,29 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean index 532fef6f96..67d97ae2fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.MainTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient + +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 @@ -24,6 +26,8 @@ theorem. Consequently that transfer is trivial. No class-field realization or norm-subgroup equality is assumed here. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean index 5ebc663927..c6f6cb0ee3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean @@ -3,29 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealNormArtinExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified + +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 @@ -34,3 +36,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean index f2689abb46..7994258891 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.FinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean index 408d9bff96..f591fb3d3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealDecompositionLaw /-! # Arithmetic ideal Artin symbols and unramified decomposition @@ -16,6 +18,8 @@ reciprocity map, while the image of an ordinary prime ideal is the genuine arithmetic Frobenius automorphism. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean index 32a3053c09..0ef624a030 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.IdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin + +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 @@ -21,6 +23,8 @@ reciprocity identifies this quotient with the corresponding abelian Galois group. -/ +@[expose] public section + open scoped NumberField BigOperators NumberField.LiesOver noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean index 13c383c519..c113845626 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap /-! # The ideal Artin quotient @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean index 20e537204f..92bc0020ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassPrimeIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.UnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldUnramifiedMaximality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +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 @@ -25,6 +27,8 @@ to give the complete decomposition law: are related by the global ideal decomposition law. -/ +@[expose] public section + open scoped NumberField BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean index b2e51eabb4..bd3fab050c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinQuotient /-! # Ideal Frobenius classes and the decomposition law @@ -15,6 +17,8 @@ The general unramified Galois identity `r * f = n` belongs to `RamificationTheory.HilbertRamification.Dedekind.Basic`. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean index 3ad36c947a..4436acb80f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.ArithmeticIdealDecompositionLaw /-! # Ideal norms and arithmetic Artin exactness @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean index db9d18ff15..3b4135d8f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationCore /-! # Ideal and ray consequences of norm limitation @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean index a52c86b924..90719e455c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.NormLimitationStatement /-! # Proof core for ideal norm limitation @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean index 17016edbae..673a344ff2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormLimitation +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealArtinMap /-! # Statement boundary for ideal norm limitation @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean index 3567d6dcb9..67fe3c7314 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdealClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldComparison -import Mathlib.RingTheory.ClassGroup.ExtendedHom + +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 @@ -16,6 +18,8 @@ map forms the naturality square with the existing ideal-class extension `ClassGroup.extendedHom`. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean index 2adccce267..f4bd3e6044 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.NormConjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldCandidate -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean index 00d0574b97..2d62bb9e69 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified + +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 @@ -29,6 +31,8 @@ small Hilbert tower and transport it to genuine idèle-class extension and norm maps. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean index 0c551f2803..9c51177f54 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.AbstractCapitulation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean index 8ba90c3fb4..670d9f8cb5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean index da9d55e4d6..a8ec04a775 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FiniteNormClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.ZeroTransport + +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 @@ -18,3 +20,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean index 874c1819a4..c24e06c5db 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives /-! # Compatibility of rational finite-norm representatives @@ -12,6 +14,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean index 0f032b8de6..baec060a07 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFixedFieldBaseChange + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean index 1ab054e88c..9dbb2f7071 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -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.Quotient /-! # Finite norm-class evaluation after fixed-field inclusion @@ -13,6 +15,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean index cc56622914..e15405d9e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Representatives -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.Quotient /-! # Named membership endpoints for rational finite-norm transport @@ -13,6 +15,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean index 9a67f7d19d..afe955d606 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine /-! # Norm quotient maps for rational finite-norm transport @@ -12,6 +14,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean index b5fe234999..d02dbabc5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.FieldSpine /-! # Representatives and comparison endpoints for rational finite-norm transport @@ -12,6 +14,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean index 6cc439b9d0..175decd64b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Compatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.MembershipTypes -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalFiniteNormTransfer.Quotient + +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 @@ -14,6 +16,8 @@ This compiled leaf preserves the original public declarations while reusing the shared fixed-field instance providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean index ecd5acdf2b..6e6a28a77f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.RationalAbstractExtensionToOrdinary /-! # Rational fixed-field base-change transport @@ -12,6 +14,8 @@ Compatibility of abstract fixed-field inclusion with ordinary idele-class extens base change. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean index fe283d9455..7860e45e48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerUnramified + +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean index 3a7c0a24b5..49a3461cc5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.IdealFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassField /-! # Splitting in the small Hilbert class field @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean index ff0dfe6ef1..15b65f26a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.EverywhereUnramifiedTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldCorrespondence -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertNormCharacterization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.PrincipalIdealTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient + +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 @@ -25,6 +27,8 @@ classification therefore identifies every conjugate of the second small Hilbert class field with the original field. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean index 1b5a07e06d..7b00b700b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.HilbertClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerConjugation -import Mathlib.Data.Rat.Cast.Defs + +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 @@ -24,6 +26,8 @@ conjugate closed subgroup rather than over the first-stage subgroup itself. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean index 91aed72d25..7d3480f7b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMaximalSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.IdealClassFieldTheory.SmallHilbertTowerRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField + +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 @@ -18,6 +20,8 @@ The intrinsic small-Hilbert characterization then proves genuine unramifiedness at both finite and infinite places. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean index 69fa2f35d0..40478710e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean @@ -3,91 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 8974fa61f2..97e391d3e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue /-! # Global norm residue on actual fixed fields @@ -20,6 +22,8 @@ for the norm--restriction diagrams: no independently chosen embedding of either field is introduced. -/ +@[expose] public section + open scoped IsMulCommutative NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean index 9c81d30494..29e2736ba1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean @@ -3,91 +3,93 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassNormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IntermediateNormAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicArithmeticProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalQuadraticPowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization + +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 @@ -99,3 +101,5 @@ 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 `ℚ`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean index 01233e3c0e..00eafb7a95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidueAbelianization /-! # Arithmetic normalization of global reciprocity @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean index d846afed34..2bfa3de7aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean index c86a2cf2fb..098b2ef948 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification + +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 @@ -18,3 +20,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean index 77703357b4..65c41b3512 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality /-! # Infinite-place local-global Artin compatibility @@ -14,6 +16,8 @@ then transports the special overextension computation through global norm-residue naturality. -/ +@[expose] public section + open scoped IsMulCommutative open NumberField open IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean index 2454f0fc48..ae2478064c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification /-! # The complex-conjugation overfield at an infinite place @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index fac492a4b5..1ac5f2a413 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean index 2a4eac8864..e8c3feb947 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean index 95ebae3882..51832c425b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield /-! # The quadratic overextension at a ramified real place @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean index 667a2854ae..4773c4236f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.InfiniteOnePlaceBaseNorm -import Mathlib.NumberTheory.NumberField.CMField -import Mathlib.RingTheory.RootsOfUnity.Complex + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index 4c42e818de..0c3d0d6cf8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean index 9be5b8296e..95235a2fc2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValueTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.IdeleClassNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation + +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean index abd95e044a..d8be3fec37 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower /-! # The normalized cyclotomic idele value @@ -30,6 +32,8 @@ source-producing frontier; no quotient projection or abstract valuation hypothesis is substituted for it here. -/ +@[expose] public section + noncomputable section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean index a45cf4522c..eb41248c9d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicNormOneCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity + +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 @@ -18,6 +20,8 @@ the profinite neighbourhood system used after principal-idèle vanishing has been proved. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean index 9c7638155b..130fa55bf5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.ExtensionBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue -import Mathlib.Analysis.SpecialFunctions.Pow.NNReal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean index 84c54fc842..dce9fd87e5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleValue /-! # Principal ideles and the rational cyclotomic value @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean index b162ea62b0..5a6aebe710 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder + +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 @@ -35,6 +37,8 @@ torsion closure and the group-theoretic decomposition of `ℤ̂ˣ` gives the cyclotomic `ℤ̂`-extension. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming continuousMulEquivOfCompactToT2 → continuousMulEquivOfCompactToT2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean index 0cfd62f832..33eafb0c3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedRestriction /-! # Geometric restriction from the cyclotomic unramified field @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean index fba9a9b8aa..9e179931ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedGeometricRestriction +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality /-! # Cyclotomic unramified local--global compatibility @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean index ed027e51d8..0671f4c145 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicAbstractFixedFieldArtin /-! # Finite restriction of cyclotomic fixed-field reciprocity @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 94b7b09898..6ee23493f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -3,18 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicTorsionFixedField -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.InfiniteBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.IntermediateField.Algebraic -import Mathlib.FieldTheory.Normal.Closure -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.FieldTheory.SeparableClosure -import Mathlib.GroupTheory.Index +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 @@ -30,6 +32,8 @@ All fields in this file are the actual mathlib intermediate fields in Galois group is introduced. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming continuousMulEquivOfCompactToT2 → continuousMulEquivOfCompactToT2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean index 4105bb8386..45dec48cdb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean index bb025b4ea0..59bae469a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean @@ -3,17 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.FixedFieldLattice -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions +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 @@ -28,6 +30,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean index 494ba40138..f45b96c175 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore /-! # Finite places in the compatible Galois realization @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean index a799827302..84bbec9798 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationSubextension /-! # Norm quotients in the compatible Galois realization @@ -13,6 +15,8 @@ This module identifies the abstract fixed fields with the embedded copies of reciprocity data to the original finite Galois extension. -/ +@[expose] public section + open scoped NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean index d896df497c..dcf43033a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealizationCore + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean index fb5c1906f2..326363b6bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlaceIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.Continuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SPlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness -import Mathlib.Algebra.BigOperators.Finprod + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean index 803cea0b1e..39f5d59878 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.NormQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace /-! # Finite local families of ideles @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean index 1c1f24198e..238d1d9a88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicLocalField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibHilbertProductFormula /-! # Comparison of finite-place Hilbert factors @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean index 76d5829ae2..2bb5257ed2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison /-! # A coherent Hilbert pairing family in a small number field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean index 554dfc1023..3d9e039706 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.LocallyCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import Mathlib.NumberTheory.LocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean index 13407acf36..af8fd6cb9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean index b4ff857ef8..3a82fdd3a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.UnramifiedNormalization + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean index 4b2cbfd159..ca75e79775 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality + +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 @@ -14,6 +16,8 @@ This module identifies localized completions associated with conjugate extension conjugation invariance of the resulting finite-place Artin map. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean index 51ca3e899c..cd68e82cd6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.Comparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdealMap -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue + +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 @@ -24,6 +26,8 @@ This module constructs the local Artin map for a chosen extension of a finite pl transports it through the actual decomposition group into the global Galois group. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean index 1843c8a885..3d84f3729b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.FinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.NormRestriction + +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 @@ -17,6 +19,8 @@ This module identifies the image with the chosen decomposition group and the ker chosen local norm subgroup. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean index 967be19b81..4f5c710dfe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.TowerRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.AdicCompletionComparison + +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 @@ -13,6 +15,8 @@ This module compares localized completions in a square of number fields with dif fields and transports restriction through the corresponding decomposition groups. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean index 5054899368..ec53d9099d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.CrossLocalRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction + +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 @@ -13,6 +15,8 @@ This module proves norm--restriction naturality for finite-place Artin maps in a of number fields and their chosen completed local extensions. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean index d69767c82b..9af083a875 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation /-! # Restriction in a finite-place Artin tower @@ -12,6 +14,8 @@ This module restricts finite-place extensions through an intermediate field and restriction naturality for the corresponding global Artin homomorphisms. -/ +@[expose] public section + open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean index 41f7f293f7..7e5697bbc6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.ChosenLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean index e874926b78..008107c167 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -3,17 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.CyclicPrimeSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.FrobeniusLift -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup -import Mathlib.GroupTheory.Nilpotent -import Mathlib.Topology.Algebra.ContinuousMonoidHom +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 @@ -28,6 +30,8 @@ valuation. The proof uses the actual valuation-conjugacy correction in `absoluteValueDecompositionGroup_map_restrictNormalHom`. -/ +@[expose] public section + open AlgebraicNumberTheory.Valuations open AlgebraicNumberTheory open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean index 510e874546..a00b256c59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Cohomology.CofinitelySplitFiniteExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Norm + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean index 4074c84641..d77be02493 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinFiniteSupportApproximation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteLocalGlobalArtinCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.TopologicalGlobalNormResidue + +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean index 67c91eba1c..9e54499ad8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.HasseNormPrinciple -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean index 8dba666700..ead6bc1aa8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean index cae42f44e3..88d404b3f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean @@ -3,24 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean index 2b6735db9e..4404263570 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Conjugation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import Mathlib.FieldTheory.KummerExtension + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean index b19d2c56e4..bf3b7ca510 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceLocalGlobal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean index ef264984bf..c6325b85a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.Core /-! # Finite-place local--global Kummer comparison @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean index 83b968ef6d..ba3e6ab882 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin /-! # Finite support of finite-place Hilbert symbols @@ -16,6 +18,8 @@ theorem for those Artin factors; no second ramification-support construction is needed here. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean index e3262811c9..05fed5447c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceComparison /-! # Finite-place local--global Kummer transport @@ -16,6 +18,8 @@ as separate declarations so the eventual root-character comparison does not rebuild their instance towers. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean index 39acbed180..4b9e829efa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters -import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters +public import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic /-! # Hilbert symbols at infinite places @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean index ce72214029..2dc8ac982e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean index 6814a9d9f9..34c878fd32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeUnit + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean index 65bcd396b8..3387b034bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRamification -import Mathlib.Analysis.Complex.Order + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean index 8572703ccc..e9d1b0de16 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegativeRoot + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean index 2cc743b415..4e0976664c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceCharacter -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealSquare -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean index d0f4d31d13..31f8617dff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlacePositive + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean index da7890e4ca..1967b26584 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceNegative /-! # Complete infinite-place Kummer root-character comparison -/ +@[expose] public section + open scoped NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean index e6d8f7505a..48ac7bbc13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlace -import Mathlib.NumberTheory.NumberField.Completion.InfinitePlace + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index 52d96d3406..60355852eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicIdeleClassValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.IdeleClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.MaximalUnramifiedReciprocity + +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 @@ -30,6 +32,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean index 15935aed6e..ec9240bc49 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue /-! # The global norm-residue symbol for finite Galois extensions @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean index 912f888907..553d9d82cc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormProof + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index e52ab8e013..01960aa4ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.AbstractFixedFieldGlobalNormResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality /-! # Naturality of the global norm-residue symbol @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean index e03104adc0..2be119123a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.FinitePlaceAdicCompletionCongrEquiv +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFiniteFactorNaturality /-! # Hilbert-pairing families under equivalences of number fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean index f77b0facc5..459bb19dba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport /-! # Naturality of the finite Hilbert factor @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean index 1706ff0018..ea891f30f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.InfinitePlaceRealComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean index e7ae460cf1..1316b03613 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertFamilyAlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteHilbertFactorNaturality -import Mathlib.Algebra.BigOperators.Finprod + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean index 0961945648..93255c17b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPoints -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm + +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 @@ -13,6 +15,8 @@ Fixed-point comparisons for finite-index closed subgroups and their actual abstract fixed fields. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index ce05c8f7e9..7502fc6211 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing -import Mathlib.Algebra.Colimit.DirectLimit -import Mathlib.FieldTheory.Galois.Profinite + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean index c5e8a92e50..2aca6a5240 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitAbstractFixedField /-! # Finite extensions in the rational idele-class representation @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean index 241702daa5..eaabc63fb0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtension /-! # Galois actions on rational fixed-field idele classes @@ -12,6 +14,8 @@ Naturality of the fixed-field comparison for automorphisms and the finite-extension Galois action. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean index 811b40a737..fc37bffe44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionAction /-! # Norms on rational fixed-field idele classes @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean index 6c98b274f0..0f1755edfe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevelCore /-! # Tensor comparison and injectivity at finite rational levels @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean index 48c59d7135..6b3306f392 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitCore -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup -import Mathlib.GroupTheory.QuotientGroup.Defs + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean index 10ebb0139a..861c7cb094 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm + +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 @@ -15,6 +17,8 @@ theorem. Keeping these commands in their own leaf prevents the endpoint proof from rebuilding the helper environment. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean index 500d8eb90f..ca16b29372 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormStatement /-! # Proof of ordinary norm comparison in finite towers of rational fixed fields @@ -14,6 +16,8 @@ finite product calculation into separate commands. The public theorem is a thin wrapper around those providers. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean index f36d6df659..1cf9fabe32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteTowerNormCore /-! # Ordinary norms in finite towers of rational fixed fields @@ -17,6 +19,8 @@ module so that the normal-closure and coset-product proof elaborates in a fresh command environment. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean index a12e52b86b..e5d872513b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescentCore /-! # Finite-level and direct-limit fixed-point descent endpoints @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean index 17560acbc8..51c3984691 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.Herbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFiniteLevel + +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 @@ -16,6 +18,8 @@ actual tower base change is Galois-fixed, hence descends to an idele class of the intermediate field. -/ +@[expose] public section + noncomputable section namespace GlobalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean index fbac793daa..bc765a3248 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitFixedPointDescent -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean index 57dffd5b80..a54edd91b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitExtensionNorm +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient /-! # Finite norm quotients for rational fixed fields @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean index d90cf884a1..e0109fea7d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.IdeleClassDirectLimitNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index 52f97f7c50..9eb11ff657 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicZHatBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import Mathlib.FieldTheory.Galois.Profinite + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean index 5f827c0ddf..fc3ca7146f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtinCompatibility /-! # Descent of the infinite global Artin homomorphism @@ -15,6 +17,8 @@ This file descends that homomorphism to the idele class group and retains its ordinary quotient topology. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean index 155622e3a5..d3bc4c0c01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormOneCompact -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.PositiveArchimedeanSection -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean index 72a39af954..d9c6628a5e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.PlaceEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean index c07e0c8938..da30ba78cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RationalComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceOverfield -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.NumberFieldComplexification -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.RamifiedOverextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.OverextensionArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ComplexificationArtin.InfinitePlaceCompatibility + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean index e3a2838fca..fbbf8a7de1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNormComponents -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import Mathlib.Algebra.BigOperators.Group.Finset.Lemmas -import Mathlib.Algebra.Group.Hom.Instances + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean index 57b90d483a..c48040ff2b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianizationNaturality +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormTowerConductor /-! # Abelianized restriction over intermediate fields @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean index d08f2c2d12..1b406188ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean index e59f07c293..1c380d78eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift + +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 @@ -16,3 +18,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean index b6962df355..81c2dffe27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicAuxiliaryField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index 8f7f136ed0..85a0a8527b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.FinitePadicCyclicData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicUnramifiedLocalGlobalCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.OnePlaceBaseNorm + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean index 9237aad9d8..8734e97856 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.SeparableClosurePadicLift /-! # Finite p-adic cyclic data for local-global Artin compatibility @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean index 2e7493762d..a2af78e86e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceCyclotomicFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.PadicCyclicClosure + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean index 1a478db4ef..9aa27ca618 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula -import Mathlib.Algebra.BigOperators.Finprod + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean index 535e8b9413..1e89dcd39c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianKernel + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean index e49eaccf22..f05a04651e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfiniteGlobalArtinSurjectivity + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean index c000b45622..8bb49bfb28 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.IdentityComponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ClosedFiniteIndexClassFieldOriginalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MaximalAbelianGlobalArtin + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean index 3bc72472c1..0420884301 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm /-! # Ideles in the ordinary idele-class norm quotient @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean index 7c835481b8..b8c94c16d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.SinglePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.IdeleNorm + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index 734a1b20eb..f5fdedb631 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -3,23 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalHilbertSymbol.FinitePlaceCharacterComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.QuadraticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean index 6d12c9fac2..f5edd8fbb0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteLocalFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.OnePlaceNormKernel + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean index 766c8fa701..f8b3549332 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalProduct /-! # The rational cyclotomic product formula in arithmetic normalization @@ -17,6 +19,8 @@ Artin maps and proves the finite principal-idèle product formula in that normalization. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean index fed835ba4c..15e6ba2c3c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv /-! # Rigidity of the rational cyclotomic character @@ -14,6 +16,8 @@ prime-power reductions. In particular, if every reduction of every automorphism of the full rational cyclotomic field has square one. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean index 83fa6816d7..397c115af5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FiniteIdeleArtin -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 5fb529f5a8..10a3ef6df6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -3,30 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrincipalLocalUnit -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial -import Mathlib.NumberTheory.NumberField.Cyclotomic.Galois +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 @@ -37,6 +39,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean index 1cec00cff9..a87ea85153 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 210e20b32f..899966c375 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin -import Mathlib.Algebra.BigOperators.Finprod + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin +public import Mathlib.Algebra.BigOperators.Finprod /-! # Away-from-p factors of a rational cyclotomic principal idele @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean index 079183cdcc..d5b5b3e4f6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalAwayProduct /-! # The ramified prime factor of a rational cyclotomic principal idele @@ -13,6 +15,8 @@ character specification reduces the claim to the ramified chosen-Artin formula proved in `RationalCyclotomicFinitePlaceArtin`. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean index eb04054a68..4de527f4f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicPrincipalPrimeFactor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicZHatRigidity /-! # The rational cyclotomic principal-idele product formula @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index e88e5621a7..ca3a064b94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianLocalConductorComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicFinitePlaceArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv + +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 @@ -27,6 +29,8 @@ cyclotomic character then detects that the full local Artin symbol is trivial. -/ +@[expose] public section + open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean index 6bd356afbd..0e8ff80673 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.CyclotomicPrincipalIdele -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicCharacterRigidity + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean index b17c06ddf3..89cbe00e70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational /-! # Prime factorization of a nonzero rational number @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index 52b7236789..c5213e62e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalPrimeFactorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.NormalClosureNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.Tower -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerAlgEquivNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.TowerBaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean index 823e644232..9dc53532aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity /-! # Rational quadratic reciprocity from global class field theory @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean index 9ad4ddf956..b694286aee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidue -import Mathlib.FieldTheory.KrullTopology -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean index 8fcccd064a..a4aa23c6d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.NormConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalNormResidueAbelianization -import Mathlib.FieldTheory.KrullTopology -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -24,6 +26,8 @@ constructed actual global symbols, rather than unrelated abstract isomorphisms between finite groups. -/ +@[expose] public section + open scoped IsMulCommutative NumberField open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean index 8a765c8dbf..1fa6dc6b19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -3,31 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport -import Mathlib.Algebra.Algebra.Shrink -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified -import Mathlib.FieldTheory.Fixed -import Mathlib.SetTheory.Cardinal.Finite +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 @@ -37,6 +39,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean index f975c966b5..7ea44384d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean index 2eda6917ba..f8ccf49115 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean index 8739cfa09c..d10780d955 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean @@ -3,21 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalCyclotomicArithmeticReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Final -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport +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 @@ -25,6 +27,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean index f6b2b57398..cb8b69de15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuationInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.UnramifiedCompositumSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.DegreeFromChosenPrimes + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean index c282f5a9e9..13341ff6cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup /-! # The common local cyclotomic target @@ -14,6 +16,8 @@ At a ramified prime `p`, the structured local embedding of `L` has order `((p^f - 1) * c) * p^e`; crucially, it uses the same exponent `e`. -/ +@[expose] public section + noncomputable section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean index 676f407535..cfd61b84dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLeftFactors /-! # The global cyclotomic factor inside the common local target @@ -13,6 +15,8 @@ of the order, into the common `p`-adic cyclotomic target used by the synchronize valued compositum construction. -/ +@[expose] public section + noncomputable section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean index 715e1f2901..e5b8ca27dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.CompositumEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumCyclotomicTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation + +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 @@ -18,6 +20,8 @@ or transported-algebra instances. Rational linearity is added separately in the global-factor file by `map_ratCast`. -/ +@[expose] public section + noncomputable section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean index 281c4c9152..0c9a32dac1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumValuedEmbedding + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean index 00f9b04084..653221ad81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumLocalizationEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalPadicPrimePowInertiaBound /-! # The fixed-conductor local inertia bound for the auxiliary compositum @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean index c50940a11b..3b21cf82d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.GlobalCompositumGlobalEmbedding +public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation /-! # A valued global embedding of the auxiliary compositum @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean index bfbf295a65..277f0bef27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding + +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 @@ -18,6 +20,8 @@ local cyclotomic embedding, and the ramification comparison to replace the full the exact `p`-primary factor `φ(p ^ n)`. -/ +@[expose] public section + noncomputable section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean index 036ccca83d..a875c3527e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean @@ -3,21 +3,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 -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.Cyclotomic.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization + +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 @@ -25,6 +27,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 158a289257..29fe9f433a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.RationalRayClassFieldCyclotomic /-! # Arithmetic reciprocity for rational cyclotomic ray class fields @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index 6c5f619c4a..197f8ba696 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.RationalCyclotomicRayNorm + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean index 18713b5476..db704cc708 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Rational -import Mathlib.NumberTheory.Cyclotomic.Gal + +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 @@ -17,6 +19,8 @@ the degree/index equality showing that the ray class field is `ℚ(μ_m)`. -/ +@[expose] public section + open scoped NumberField Cyclotomic noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean index 490036fbd1..06b51a1965 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import Mathlib.FieldTheory.Galois.GaloisClosure -import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.FiniteRamifiedPrimes -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.LocalCyclotomicEmbedding -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean index 3b40b5ba5f..1e8a6e4f5e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Setup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified + +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 @@ -25,6 +27,8 @@ compositum, triviality of both restrictions implies triviality of the original inertia automorphism. -/ +@[expose] public section + noncomputable section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean index beb1dea50b..c8e80f20ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean index c71d0e8047..c419103ef7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All /-! # Kummer theory Public root for the reusable Kummer-theory layer used by abstract class formations. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean index 325f85ff62..030a59bfa7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean index a7eeece31b..3f214a669f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.CyclotomicPrimeBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitKummerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior + +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 @@ -16,3 +18,5 @@ Root characters, radical quotients, finite and infinite generation, the local unramified unit criterion, and the perfect Kummer pairing for actual field extensions. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean index ade303c0c7..dd49776dc5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct -import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.TensorProduct +public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots /-! # Prime cyclotomic base change @@ -19,6 +21,8 @@ The two degrees are therefore coprime, and is an actual field, Galois of degree `p` over `K(μ_p)`. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean index a7743ff72a..e540fb5d8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.FinitePlaces -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters -import Mathlib.Algebra.Group.Hom.Basic -import Mathlib.Algebra.Group.Subgroup.Ker + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean index 5534f209ba..83ef1ac4cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SimpleExtensionLocalBehavior -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified + +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 @@ -25,6 +27,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean index 3d43781555..085838d5a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean index ce22fa85d3..55d20da142 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean index 25fff70ae1..c1180b3182 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.EnlargedSUnitRestriction -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean index c7b5c6daa5..def19a3781 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FullSUnitKummerExtension -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.FiniteRadicalSupport /-! # Restriction from an enlarged S-unit Kummer extension @@ -13,6 +15,8 @@ The concrete embedding and Galois restriction map, its fixing subgroup, and the fields attached to kernel elements. -/ +@[expose] public section + open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean index f1e13e544c..82f49857f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitLocalPowerKernel /-! # Finite support for Kummer radicals @@ -12,6 +14,8 @@ A chosen finite enlargement of places containing representatives of every class Kummer radical. -/ +@[expose] public section + open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean index 3c1f3a55f7..95db6c7528 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates /-! # The full S-unit Kummer extension @@ -14,6 +16,8 @@ Construction, finite generation, Galois structure, cardinality, and coordinates all `S`-unit roots. -/ +@[expose] public section + open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean index 045691a649..3e445a95f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.SUnitPowerQuotient +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Approximation /-! # The local-power kernel of S-units @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean index 807947deb5..95bdb7f0a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SUnit.LogLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex -import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic + +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 @@ -15,6 +17,8 @@ The finite `n`-th-power quotient of an `S`-unit group, its cardinality, and expl coordinates. -/ +@[expose] public section + open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean index c9d23bb6af..0bed458d39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -3,37 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.FinitePlaceDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlock -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockEquivApply -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockInducedSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.ChosenPlaceIntegralBlockTensorSmul -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.CompletionTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Spine -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Action -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Equiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.OutsideIntegralInduced.LocalInduction.Inclusion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.CompletionToIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.IdealToCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.LocalNorm -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified + +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 @@ -46,6 +48,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean index af34ea64f8..4f91c47b0a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean index 4296175f98..03a6ecfdc6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All + +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 @@ -41,3 +43,5 @@ Absolute and profinite reciprocity: - `LocalClassFieldTheory.absoluteLocalArtinMap` - `LocalClassFieldTheory.profiniteLocalReciprocity` -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean index 5770c7859b..84f4c686ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean @@ -3,28 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean index a252d6bfea..e81f635f0c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean @@ -3,31 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean index c170cf907a..fab5c7a08c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology + +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 @@ -23,6 +25,8 @@ Hilbert 90 for the algebraic localization, and therefore applies also at archimedean places. -/ +@[expose] public section + open AlgebraicNumberTheory.Valuations open HilbertRamification open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean index 5967d55eee..f356ad1d74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ArchimedeanHilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.InfinitePlaceTensorBlock -import Mathlib.Basic.Real.Sign -import Mathlib.NumberTheory.NumberField.Completion.Ramification -import Mathlib.RingTheory.Complex + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean index eb302c4c29..92e5bfdf75 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean index 2d2742b6b7..9146454304 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.CohomologyBridge -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Hilbert90 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValuationHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean index e2723cbcf9..f0b2f7e758 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisInfiniteProduct /-! # Filtered Lifting Sequence -/ + +@[expose] public section namespace LocalClassFieldTheory /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean index 00f12f973c..ee83d327ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean index 6c8adabe90..31bd2fcc02 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisFiniteQuotient + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean index d86b1b3f26..93b668066f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean index b58d6d9ccb..5dea0fdb3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.FamilyClassAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.TensorNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean index 460f65e693..87ae73b7ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean index cfecaad665..b0bd8aca2a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean index c54bd0eb50..8e6b4ab2fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean index bd893d26b8..0b3d3c326e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean index bd63a599a4..d38f311dba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product /-! # Finite families of local idele blocks @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean index 8b2c3f0d4d..f3a5f883c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.Instances -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Family.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product + +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 @@ -29,6 +31,8 @@ of the finite family of localized class-formation blocks: * the Herbrand quotient is the product of the local degrees. -/ +@[expose] public section + open scoped BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean index f7ac69d11a..5c14a16517 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization /-! # Local blocks of the idele group @@ -19,6 +21,8 @@ For finite extensions this is the entire metric completion by `absoluteValueExtension_finiteLocalization_eq_top`. -/ +@[expose] public section + open scoped TensorProduct noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean index 3daa086201..fbe4ac8b7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy -import Mathlib.Algebra.Group.Pi.Units + +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 @@ -23,6 +25,8 @@ identifications are the concrete source of the induced-module covariance in the induced local-block calculation. -/ +@[expose] public section + open scoped TensorProduct noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean index 877a9d813f..93698e550a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Tensor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +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 @@ -33,6 +35,8 @@ the local-block norm calculation, and it is also the bridge between the local co calculation and multiplicative weak approximation. -/ +@[expose] public section + open scoped BigOperators TensorProduct noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean index 345eef7cc2..ace5e47038 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean index 7d0ac7a2e9..a6a64a0570 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv /-! # Algebra for localized completion cohomology @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean index 657775b97c..5245432b67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.CompMulEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean index 200159c744..e80de73f7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean index ae8703e4d1..b092deeb30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Quotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean index 69c8cf2337..1d8c4379b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Finite /-! # Degree-zero localized Herbrand cardinality -/ +@[expose] public section + open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean index 08c1238ae6..80167bcf4e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.H0 + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean index d09d9e6186..16aab01563 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.Trivial /-! # Localized-units Herbrand quotient -/ +@[expose] public section + open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean index 49bb930c77..6179cf978c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Cardinality.HMinusOne + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean index 9aadf07524..858d23a6c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalBlocks.Induced -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization -import Mathlib.FieldTheory.Galois.Infinite + +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 @@ -29,6 +31,8 @@ class-field axiom then gives: * the cardinality and Herbrand quotient equal the local degree. -/ +@[expose] public section + open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean index eaed1a9410..9ffc583184 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.HerbrandEquiv + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean index d02c48c46d..4bd9cb2b0b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Algebra + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean index 18d5859aee..ff6c6ed7f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.LocalizedCompletionCohomology.Generator + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index c202330e67..9d01e203c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FieldUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean index fdf2264eb4..8ce8e8d564 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import Mathlib.FieldTheory.Galois.NormalBasis -import Mathlib.LinearAlgebra.Quotient.Pi + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean index 7176d24ddb..d6da5ea8cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisRecursiveLifting /-! # Normal Basis Cohomology -/ + +@[expose] public section namespace LocalClassFieldTheory open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean index 1138866e40..f0ec216a05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean index 83eef412fb..32a58be152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation -import Mathlib.GroupTheory.GroupAction.Quotient + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean index 06b1a28409..2368b35c0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.PrincipalUnitGraded -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGaloisAction -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean index 3bbd4ea5ed..5ef32d6104 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean index fbd2e77377..9768b2144a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.FilteredLiftingSequence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisGradedLifting + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean index f1fc5dd2cb..97b6ed8be4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean index 80cc2e3839..26714631aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -3,14 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean index 79cd5bdbd6..ec63b35ccb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.ValueGroupCohomology + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean index e90d6ba060..c20ae8882d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Data.ZMod.QuotientGroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Valuation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean index ff8ec74813..6039b82f48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean index 0fffde5d98..5dad4f0cd7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor + +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 @@ -17,3 +19,5 @@ Public focused entry point for finite local reciprocity, local conductors, the local Artin map, and the unconditional finite local existence order isomorphism. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean index 41f609744d..0d6547b78f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean index 2b7d9f14a1..30a95a0b96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean index bfe6b21a83..cbd27a01e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.PrincipalUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.StandardSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.CyclotomicNorm.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean index 68fab938b5..88e889d44d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -17,6 +19,8 @@ the norm subgroup is exactly the subgroup generated by `p` and the separate before being combined in the final theorem. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming quotientUnitHom → quotientUnitHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean index 3b6cb5f46f..efe13ecb56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits /-! # Standard p-adic norm-subgroup intersections @@ -14,6 +16,8 @@ normalized valuation `-1`. This file records the corresponding orientation of the standard unramified/principal-unit intersection lemma. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean index 93eb861ef8..a69d11abec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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` @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean index 1895aa8952..be80599c24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean @@ -3,37 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean index 958c208b86..0cc5041e8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean @@ -3,37 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.KummerNormOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedLubinTateDiagonal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields + +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 @@ -45,3 +47,5 @@ isomorphisms. The canonical standard Lubin--Tate construction now also provides a characteristic-independent finite abelian factor with its exact norm subgroup. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean index ac6219a545..2be4583986 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -16,6 +18,8 @@ ordinary norm-subgroup order embedding is surjective, hence an order isomorphism. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean index 1dbab39fdd..42993a428f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CharacteristicZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -16,6 +18,8 @@ fixed separable closure and open finite-index subgroups of the local multiplicative group. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean index 9e85b0e825..c5d0c5a7a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.Cyclotomic.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean index 1caa14875c..d125c6a4c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean @@ -3,167 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupSurjectivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 @@ -173,6 +175,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean index 492f4d2bc9..23c1d8f77b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean index 5fd05ae517..32e630e37e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology + +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 @@ -22,6 +24,8 @@ No second Frobenius is introduced. The canonical lift on this field is the existing `arithmeticFrobeniusOfUnramifiedValuation`. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean index e8659f2055..64b8ec6378 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.CyclotomicKummerDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex + +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 @@ -19,6 +21,8 @@ group exactly `Kˣⁿ`. Hence `H`, transported to the coefficient group, is open for the norm topology. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean index b53bdc0aea..856e8b970b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianClassification + +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 @@ -16,6 +18,8 @@ the characteristic-zero and equal-characteristic existence arguments use these definitions. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index 6caa9ecb66..c890de9250 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants -import Mathlib.FieldTheory.LinearDisjoint + +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 @@ -19,6 +21,8 @@ inverse unit action on the Lubin--Tate level therefore glue to one automorphism of their compositum. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean index 482a2edaf9..276d28a073 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean index 00adf3aacc..35338827f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean index c8dec5b2cb..e1d22417e6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LocalAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity + +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 @@ -18,6 +20,8 @@ of native open finite-index subgroups. Surjectivity is the remaining local existence-theorem input. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean index e7bed398c7..7746fcfd31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.RingTheory.Norm.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.RingTheory.Norm.Basic /-! # Transport of finite-extension norm subgroups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean index f131d0a6f8..3c5053c0f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean index 72fe41ed3e..41d9ea7268 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean index f95059972b..4c06f6d597 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnshrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.FiniteAbelianIntermediateFieldAlgEquiv + +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 @@ -14,6 +16,8 @@ closures together transport finite abelian intermediate fields, preserving their inclusion order. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean index b4ec02d4c5..2f5ea024e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianNorms + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean index 645987637d..d216fd1c9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkIntermediateFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv + +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 @@ -15,6 +17,8 @@ separable closure. Its finite-dimensional and abelian Galois properties are transported along the base-field equivalence. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean index d9ba8a1cda..fc17b33afb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean index d43fcc6485..0164563536 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure -import Mathlib.FieldTheory.IntermediateField.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkSeparableClosure +public import Mathlib.FieldTheory.IntermediateField.Basic /-! # Intermediate fields under a small change of base field @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean index 61a0e569bc..b11ff76d93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MathlibFieldClassification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkChosenFiniteAbelianNorms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkOpenSubgroups + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean index a4d7ad53b6..0e4d646ba9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -15,6 +17,8 @@ induces an order equivalence between their open finite-index subgroups of units. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean index f9366db713..def44b6d23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport -import Mathlib.FieldTheory.IsSepClosed + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport +public import Mathlib.FieldTheory.IsSepClosed /-! # Separable closures over the small local-field representative @@ -14,6 +16,8 @@ The existing separable closure of `K` is also a separable closure of compatible equivalence with Mathlib's chosen separable closure of `Shrink K`. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean index 4f9162bc4b..764b438338 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -16,6 +18,8 @@ Lubin--Tate factor. Reverse inclusion of norm subgroups supplies the embedding. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean index eb11cdbb83..c9fa8d9a10 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardSubgroupIntersection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 @@ -22,6 +24,8 @@ Unlike the earlier transported Laurent-series construction, this source is characteristic-independent. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean index 703385dffc..5ae99989e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.NormTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteAbelianSubextension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean index df0483ac6b..0f5eb2347a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.LubinTateUniformizerDiagonal /-! # The unramified--Lubin--Tate diagonal field @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean index dee21bfb50..d2b668dc5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ValuationContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 @@ -19,6 +21,8 @@ subgroup from fixed coefficients to the ordinary multiplicative group of the local field. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean index bcde32a818..96c17a5d93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean index 61bacc1c54..5963cba735 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkFiniteAbelianFields /-! # Returning finite abelian intermediate fields from the small base @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean index d27dd227e4..bf9d7453ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean @@ -3,61 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean index d47a90c9c8..f8fc88e3d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta -import Mathlib.RepresentationTheory.Rep.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean index 012e12e0c9..5d82ad8a45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean index 721fe95af9..c2b73e73b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean @@ -3,13 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FieldRepresentation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean index 5b09dff58f..1d1b8d6255 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean @@ -3,64 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ValuationSemilinear + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index a4716d70da..945308dc30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean index 8fca294f92..00b506a6ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData /-! # Concrete prime-norm evaluation @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index 9f5afa677f..7352724f26 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -3,15 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean index 483faaf790..78e0c0d274 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity /-! # Conjugation naturality of finite local reciprocity @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean index 28f135a2f7..492332a368 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean @@ -3,72 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldContinuousNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteGaloisRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.HenselianValuationBase -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableFixedFieldNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum + +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 @@ -76,3 +78,5 @@ Lower acyclic aggregate for the finite reciprocity implementation. Filtered specializations import this module without depending on the public aggregate that later re-exports them. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean index 5d0e3b70c6..c659343c7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean index 371d05ae7e..c3a82ccdd0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean @@ -3,140 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupOrderEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core + +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 @@ -147,6 +149,8 @@ extensions used in finite local reciprocity to the upper ramification groups used in the Hasse--Arf development. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean index ef53fb3b8c..321b229156 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.InertiaUnramifiedExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean index 2827d2c10b..0b3bac536e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean index be471ed8bc..537734b1d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean @@ -3,11 +3,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 -import Mathlib.Algebra.Order.Floor.Ring -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean index de5eea3447..4d14227316 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristicDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.EqualCharacteristicStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean index 51650045aa..2ed4c73b1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean index bfd30c9130..a516db0e5a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.StandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardDominatingExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean index 746d8d4f74..c311ee29a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified /-! # Finite local extensions fixed by inertia are unramified @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean index 31017db2d3..bc113233d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.AbstractUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean index ef9432e405..a82d541600 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean index 0975c53595..1da44e13bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyRigidity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.OrderOfElement + +public import Mathlib.GroupTheory.OrderOfElement /-! # Rigidity from a cyclic quotient and subgroup data @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean index c13bcbfebf..69ce4a0fbf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.FieldTheory.IntermediateField.Algebraic -import Mathlib.Topology.Algebra.ContinuousMonoidHom + +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 @@ -17,6 +19,8 @@ closure lets the common norm-kernel and tower conditions compare two Artin families on every Galois subgroup. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean index cbf1182054..8d2fa653a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean index 11d97bea45..e7b5b479e5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.ClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.FiniteGaloisSubextension + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean index 5b2850ab91..f6ad0a8979 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean @@ -3,15 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Analysis.Normed.Unbundled.SpectralNorm -import Mathlib.Topology.Algebra.Module.FiniteDimension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.Main + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean index dc8de12cda..f88b8c35a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.SeparableClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean index 722e060995..6b45905c6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteSubgroupResidueDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean index f0a9c839a9..c3f730dc6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields -import Mathlib.FieldTheory.Finite.Extension -import Mathlib.FieldTheory.Galois.Profinite + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean index cbda6c94ad..d67d9008ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index b1f6fcec51..d8d3d31cae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalResidueDatum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbstractFixedField + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index 36717ad347..60e0310a56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean index b108603d4e..91664f3df8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean index 57542dbeeb..83b7926aa7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean @@ -3,25 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean index 903486eb4a..98455fa330 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport -import Mathlib.GroupTheory.Abelianization.Defs + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport +public import Mathlib.GroupTheory.Abelianization.Defs /-! # Ambient embedded norm-residue values @@ -15,6 +17,8 @@ after identifying the abelianization of an abelian Galois group with the group itself. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean index 3247a2c413..341ff05b39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean @@ -3,10 +3,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 -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitnessComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean index 681d737f6b..9ef2570335 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport + +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 @@ -14,6 +16,8 @@ compatible field equivalences, and evaluates abstract fixed-field norm-residue symbols on transported prime norms. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean index 6f03bf5d51..1f09308da5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeWitness /-! # Ambient prime symbol setup @@ -14,6 +16,8 @@ prime witness with the Frobenius target transported back to the original embedded Galois group. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean index 0a32f7a444..cc15770dfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport + +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 @@ -14,6 +16,8 @@ This module identifies the ambient abelianized Frobenius target associated with intrinsic lift and proves its compatibility with quotient equivalences. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean index ba31fdf9f5..4eeb5deb9a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -3,13 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientNormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeNormTransport + +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 prime witnesses -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget + +@[expose] public section This module constructs a valuation-one prime witness for each abelianized Galois element using the corresponding intrinsic Frobenius lift. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean index b461ae0a55..5fed43ef6c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeSymbolSetup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean index 958f509daf..5fdee79e19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean index eb7e11d54e..3269f84632 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean index 88147c3466..0d17deb26d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence /-! # Embedded extension quotients @@ -13,6 +15,8 @@ This module identifies extension subgroups transported through an embedded finit extension and constructs the resulting ambient quotient equivalence with the actual Galois group. -/ +@[expose] public section + noncomputable section namespace 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 index b42d34983e..4ce9efa6e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient /-! # Embedded inertia comparison @@ -13,6 +15,8 @@ This module transports extension inertia between an intrinsic finite extension a realization inside an ambient separable closure. -/ +@[expose] public section + noncomputable section namespace 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 index 8865de2055..01f3ef7618 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldNormResidueNaturality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +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 @@ -15,6 +17,8 @@ This module compares cohomological finite norm quotients with ordinary field-nor records their compatibility with fixed-field norm-residue symbols. -/ +@[expose] public section + noncomputable section namespace 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 index ca7eb18607..71a12674d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient /-! # Intrinsic fixed-field specialization @@ -13,6 +15,8 @@ This module specializes the embedded subgroup and inertia comparisons to actual fields and packages the intrinsic Frobenius quotient. -/ +@[expose] public section + noncomputable section namespace 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 index d61c64113d..d73a38fd7a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldLocalData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -14,6 +16,8 @@ This module compares the intrinsic absolute Galois base of a finite extension wi realization as a fixing subgroup in an ambient separable closure. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index d77c2f4707..6b02f03d30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Fields + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean index 0bfd060f95..f1c9cd34bf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport.Groups /-! # Embedded Frobenius fixed fields @@ -12,6 +14,8 @@ import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.L The transported Frobenius subgroups determine equivalent fixed fields. -/ +@[expose] public section + noncomputable section namespace 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 index d61cd999ef..a3c9d8301f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean @@ -3,14 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.EmbeddedInertiaComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.FixedFieldSpecialization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.BaseComparison.IntrinsicBaseEquivalence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv + +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 @@ -18,6 +20,8 @@ This module transports inertia, Frobenius elements, and fixed fields across an e equivalence of separable closures. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean index 70879ea7dc..75bcd45a8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.PrimeComparison /-! # Intrinsic Frobenius Artin comparison @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean index 1c3af1a242..76393f2beb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusQuotientTransport /-! # Intrinsic Frobenius closure comparison @@ -13,6 +15,8 @@ This module compares the intrinsic and ambient Frobenius closures after the quotient transport has been constructed. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean index 6180887eca..cc406c543e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusClosure /-! # Intrinsic Frobenius fixed-field transport @@ -13,6 +15,8 @@ This module transports Frobenius-fixed subgroups and fixed fields through the intrinsic-to-ambient closure equivalence. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean index 254ca01a7a..7f84a58466 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.EmbeddedFrobeniusTransport /-! # Intrinsic Frobenius quotient transport @@ -13,6 +15,8 @@ This module constructs the intrinsic-to-ambient quotient transport and maps Frobenius elements before the closure comparisons. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index 347acd19c8..bbd07b1a68 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -3,15 +3,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 -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean index 409fda8ebe..bd7e45b05f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -3,16 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.IntrinsicFrobeniusFixedField + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index a305ee5b6a..7f00fb1ecc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean index da5464bbbe..c25780663f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldRelativeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Main -import Mathlib.FieldTheory.Galois.Notation + +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 @@ -17,6 +19,8 @@ from the closed-subgroup class formation to actual fixed fields in a single Galois ambient field. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index ace36bb45f..ef5c90540e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.FieldTheory.PrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean index 67442dc732..2a96b496bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbsoluteUnitsFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Valuation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean index 09e18b6837..bc021a0a36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -3,11 +3,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 -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality + +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 @@ -19,6 +21,8 @@ naturality then becomes the actual restriction homomorphism `Gal(L/K) → Gal(E/K)`. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean index 45e72ae3f2..b82eb6431d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean index b22a164ee3..b1b6b4cf79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -3,11 +3,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 -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction + +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 @@ -21,6 +23,8 @@ to install the auxiliary `Algebra E F` and scalar-tower instances attached to an inclusion `E ≤ F`. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean index de91dfcc97..3ca501e04c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.IsSepClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient + +public import Mathlib.FieldTheory.IsSepClosed +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient /-! # Intrinsic absolute Galois data @@ -14,6 +16,8 @@ representation, and its distinguished abstract base field using the chosen separable closure. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean index e85754fc6b..922f1d2bf8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean index 17844f604c..eb9bcdb25a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.AbstractFixedFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index d006403f1d..c344fea72b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueActionIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean index 607af68f53..667631323f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalClassFieldAxiom -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.LocalHenselianValuation + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean index 588dcddaa9..7aeed278ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.OrderReversal -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConjugationNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity + +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 @@ -21,6 +23,8 @@ existence results without renaming them or wrapping them in an existence structure. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory.LocalCFT diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean index 09862e2b79..2f4d01404f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity + +public import Mathlib.GroupTheory.Abelianization.Defs +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity /-! # The actual abelian local Artin map @@ -15,6 +17,8 @@ provides both the algebraic homomorphism and its continuous refinement for the native topologies. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean index 7b19545be6..08b5d4a02d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntermediateFieldNormResidueNaturality + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean index b7a29feb35..183af27b4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteFrobenius -import Mathlib.FieldTheory.AbsoluteGaloisGroup -import Mathlib.FieldTheory.Galois.Infinite -import Mathlib.FieldTheory.IsSepClosed + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean index 59017e9ce4..96b0482791 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFrobenius /-! # Residue Absolute Frobenius -/ + +@[expose] public section namespace LocalClassFieldTheory open ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean index 07484c9f39..b435f83d2c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueDatum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean index e5f407fda0..e2e5fa633d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAbsoluteDegree -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean index 536c6e803c..bb6be29b91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicClosureDegree -import Mathlib.FieldTheory.PurelyInseparable.Basic -import Mathlib.RingTheory.Valuation.Integral -import Mathlib.RingTheory.Valuation.ValuationSubring + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean index 2a04d47ac3..d0e669bbbc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ResidueAlgebraicallyClosed -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Degree.Fields -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean index 6b6c8ad59e..f03920b754 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction /-! # Semilinear naturality of finite local reciprocity @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean index 95faabc006..3d42436350 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -3,12 +3,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 -import Mathlib.FieldTheory.PrimitiveElement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SeparableUnitsNorm + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean index 2183964d3d..d46b94a93d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.PrimitiveElement -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.RingTheory.Norm.Transitivity -import Mathlib.RingTheory.AlgebraTower + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean index 0680b1b174..0d726c3719 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -3,13 +3,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 -import Mathlib.RingTheory.Norm.Transitivity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GaloisExtensionQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.FiniteNormQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean index 3678891b85..b52fc9fba6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheory.Reciprocity.Construction.UnitCohomologyAxiom /-! # Tate Transport -/ + +@[expose] public section namespace LocalClassFieldTheory open ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean index 5c111e0574..92e924d778 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -3,16 +3,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 -/ - -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteExtensionClassFieldAxiom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology -import Mathlib.FieldTheory.KrullTopology -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Group.TopologicalAbelianization -import Mathlib.Topology.Algebra.Group.Units -import Mathlib.Topology.Algebra.OpenSubgroup +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index d5aa1bad64..ec0a4ce6e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteResidueFinrankTransfer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean index 04edc532bc..dea106f8ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Main -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius + +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 @@ -19,6 +21,8 @@ inclusion follows from finite local reciprocity because the norm quotient and the valuation quotient have the same finite cardinality. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean index c70ec2fc3f..59ca28e566 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -3,17 +3,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 -/ - -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.SeparableClosureEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.ConcreteReciprocityPrimeNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.TopologicalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedReciprocity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean index ee33939e84..644eaedec9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients /-! # Unramified reciprocity @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean index 4cf3c7eada..427847d26c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean index b587975bd1..34c3da708d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.SemilinearNaturality /-! # The selected separable valuation under a semilinear equivalence @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean index 840ba0d994..a3edfb0ea5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean index 6fcfe4b1aa..a0a6e55346 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Cohomology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Uniformizer + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index 5d6d21bdcb..7c06b42a5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -3,15 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.IntegerUnitsHerbrand -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.ClassFormation.NormalBasisCohomology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.Norm + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean index 4432866dcd..19e6632146 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.ResidueNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean index ec161dd83e..146afebe31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean index 230dcea38a..1bc444c3a0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean index 97ed7f086b..cdce8c75ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -3,13 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean index 3fe8ce2d0f..7b2f0b0b09 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean index 8a9ea03c96..c6d0d7d38c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -3,12 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean index eb711ff882..76f82eb3cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -3,12 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean index 5822438247..ad4cc6d9b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -3,15 +3,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 -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.NormSide -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Trace -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Unramified.PrincipalUnits.Lift + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean index c3f3f722b9..aaebc668ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.UnramifiedNormSubgroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients /-! # Actual unramified norm quotient uniformizer @@ -17,6 +19,8 @@ uniformizer side of the local reciprocity construction, kept below valuation quotient API. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean index 12119e6edd..97fe72ecc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.GroupTheory.Abelianization.Defs -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Conductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison + +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 @@ -21,6 +23,8 @@ degree. Finite local reciprocity and the degree formula then force the ramification index to be one. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean index dfb25a6a10..7a20468233 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean index 84164e0288..0f1bcbb5a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions /-! # The absolute local Artin map from compatible finite quotients @@ -14,6 +16,8 @@ assembles those maps into the absolute Artin map and records its finite-stage compatibility. -/ +@[expose] public section + noncomputable section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean index d72036c148..b3fee7d064 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity /-! # Actual finite values of the absolute local Artin map @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean index bf52d4083f..82185e7fd1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData /-! # Transition maps between absolute finite quotients @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean index 4cecfcc008..3e35b93bc5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits + +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 @@ -18,6 +20,8 @@ identified, as a topological group, with the actual Galois group of that subextension. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean index dfdf463ff0..8aa312e0cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.AbsoluteAbelianization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData /-! # Compatibility names for the absolute abelianization @@ -14,6 +16,8 @@ The field-generic construction is owned by the established local names as definitional wrappers for downstream users. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean index 7dc81419a3..8f8392d655 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion /-! # Comparison with the abstract profinite completion @@ -17,6 +19,8 @@ open-quotient completion and the abstract completion are canonically isomorphic as topological groups. -/ +@[expose] public section + noncomputable section open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean index c07f91ac2f..881308dac1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtinRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotientTransitions -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteFiniteQuotients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbstractProfiniteCompletionComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteReciprocityDiagram -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr + +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 @@ -24,3 +26,5 @@ Public aggregate for the topological profinite completion, compatible finite Artin maps, the absolute local Artin map, and the profinite local reciprocity equivalence. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean index 8b008efe83..5adc5d2c3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletionCriteria -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.Classification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData + +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 @@ -19,6 +21,8 @@ pullbacks are cofinal among the open finite-index subgroups of the local multiplicative group. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean index 58c39b5920..73ca1317de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality /-! # Finite reciprocity as an isomorphism of diagrams @@ -16,6 +18,8 @@ file packages the canonical finite-stage identifications as natural isomorphisms. -/ +@[expose] public section + noncomputable section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean index 0758362798..fbf71046f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition -import Mathlib.Data.ZMod.Basic -import Mathlib.Tactic + +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 @@ -18,6 +20,8 @@ group. Consequently the canonical map from `Kˣ` to its completion by open finite quotients is injective. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean index fd31efda15..3e6ad231c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean @@ -3,11 +3,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 -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.OpenSubgroup + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean index cec594bf27..b3a55fb588 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.ProfiniteCompletion /-! # Bijectivity criteria for maps out of the open-quotient completion @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean index c538f6609e..5aa50abdb4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.FiniteAbelianQuotientKernels -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.LocalMultiplicativeCompletion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.AbsoluteGaloisAbelianization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Infinite.TopologicalAbelianizationCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.IntrinsicAbsoluteData -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence + +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 @@ -22,6 +24,8 @@ is supplied by the arithmetic cofinality consequence of the finite local existence theorem. -/ +@[expose] public section + noncomputable section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean index 31425ec10f..009b35f4ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean @@ -3,10 +3,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 -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.Group.TopologicalAbelianization + +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 @@ -15,6 +17,8 @@ commutator subgroup onto the corresponding closure. It therefore descends to a continuous multiplicative equivalence of topological abelianizations. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean index 1bfa5a627f..c4cef3a732 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean index eab382097f..4d8ca3b310 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean @@ -3,22 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.PowerResidueTameFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean index b452fb340e..69f268d360 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import Mathlib.FieldTheory.KummerExtension -import Mathlib.FieldTheory.Separable -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic -import Mathlib.RingTheory.Ideal.Quotient.Operations -import Mathlib.RingTheory.Norm.Basic + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean index 3f18281b4c..23dfb8d056 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration /-! # Divisibility of simple Kummer extensions @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean index 49375d91f1..103b837c47 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean index 06767b7cb4..dd4128b94c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerExponentTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean index b71bb57463..e4ea56ae6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MaximalLocalKummerPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbolLaws -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 2898a9650c..67c6d41908 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.MaximalKummerNorm /-! # Nondegeneracy of the local Hilbert pairing @@ -15,6 +17,8 @@ symbol therefore descends to a nondegenerate pairing on the local power-class group. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean index 3912189441..ed124b35df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue /-! # Local Hilbert symbols @@ -19,6 +21,8 @@ Galois. The Hilbert symbol is the root quotient of the local Artin automorphism, transported back to `μₙ(K)`. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean index 1778255d8d..dad122e0d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol /-! # Kernel laws for the local Hilbert symbol @@ -16,6 +18,8 @@ This also makes the induced character on the concrete norm quotient injective. -/ +@[expose] public section + noncomputable section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean index d3d6a8aa1d..f8ef75f153 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairingNondegeneracy -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean index 360b586580..9cbd54b23e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertSymbol /-! # The maximal local Kummer pairing @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean index df7e3f84b9..4e9a692acb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.FiniteField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertPairing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean index bd78a90e82..ee0bf97cc5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport /-! # Transport of Hilbert pairings across field equivalences @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean index 75fa5b760a..07609cb3a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean index 59650aec8f..ca2fa42936 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicUpperFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.PadicMultiplicativeArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFixedFieldComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact + +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 @@ -34,3 +36,5 @@ standard levels and for the transported Laurent-series model. The lower `LubinTate` public root and all modules below it remain independent of `LocalClassFieldTheory`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean index 140d52e8bc..fa288cf2dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison + +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 @@ -16,6 +18,8 @@ packages the zeroth and terminal cases, then combines them with the positive ceiling-step comparison. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean index fab88c3067..e1cc4cbedc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRestriction -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.TransportedNormSubgroupExact -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean index 1eed6f2498..f79ba0e281 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Core + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean index 8bca2d78b7..8dd8f3dfaa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedUpperRamification +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction /-! # Towers of transported equal-characteristic Lubin--Tate levels @@ -16,6 +18,8 @@ restriction homomorphism and its compatibility with the unchanged underlying Galois automorphisms. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean index 9b1b617392..2319c7615d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicRealFilteredComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedArtinComparison /-! # Real filtered reciprocity on transported Lubin--Tate levels @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean index 207ab0b477..57505e9452 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean @@ -3,83 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core + +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 @@ -90,6 +92,8 @@ so the general base-field transport theorem identifies the two upper ramification filtrations. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean index 44ee9b3e78..9c1f912e8d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardArtinComparison +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.EqualCharacteristicTransportedLevelTower /-! # Restriction kernels for transported upper ramification groups @@ -15,6 +17,8 @@ level restriction, so the same kernel description holds for the transported target-field algebra. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean index 8133007f5c..a5bd7631ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +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 @@ -17,6 +19,8 @@ explicit finite-level Artin map `a ↦ [a⁻¹]` with the actual upper ramification group `G^k`. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean index 1ba0c7672f..7306f71340 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LubinTateTransport /-! # Exact principal-unit transport from the Laurent model @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index 2536280d9a..e936c7f0d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -3,12 +3,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 -import Mathlib.Algebra.CharP.Subring -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean index 7183c0e4fb..1488c83645 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean index a41913a963..58166aee4c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormIndex + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean index 1802bcc034..5ed9b57ad8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.NormRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean index 1c84ba7217..1461a8434c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.NormSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower + +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 @@ -25,6 +27,8 @@ pointwise comparison between the standard Artin map and the explicit power-series action. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean index 395550095c..4057b3f1d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormSubgroupExact -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction + +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 @@ -36,6 +38,8 @@ changed-uniformizer construction, and the zero-index comparison needs only the independently known uniformizer norm. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean index 0e76512623..0c94c3de24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardFilteredArtinComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.StandardLubinTate -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean index ac93ac45e3..ec889b34b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.UnramifiedConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup + +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 @@ -17,6 +19,8 @@ Lubin--Tate level over the canonical local-field package, this gives index `(q - 1) * q ^ n`. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean index 3e34687304..4995530d6f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.StandardSubgroupIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean index 99fd11cf03..6c269ca18d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean @@ -3,13 +3,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 -import Mathlib.GroupTheory.Index -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean index a576ef2cf2..47bbc14e80 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.LubinTateApplication.LaurentPrincipalUnitTransport /-! # Exact transported Lubin--Tate norm subgroup @@ -13,6 +15,8 @@ equal-characteristic Lubin--Tate norm containment to the sharp standard subgroup formula. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean index f95cebd7db..1466fb53ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.All +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean index 30ca2323d8..8571aea0ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All + +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`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean index 4dd244bc66..a36f795ce3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean index 9584ef7714..efe1f8994d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean index 6e299faa6c..d1a554f84e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean index 6cc1b7e44a..40d6639a9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean index 3836504e3c..85988cdb1e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean index 1208477628..f9c2fcf9ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index 686e5f6bd4..959fdc3ec2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -3,26 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import Mathlib.Analysis.Normed.Unbundled.RingSeminorm +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` @@ -33,6 +35,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean index 4309ef1ad0..bcaacb0312 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean index 7d78fc961b..ec477c1525 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All + +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 @@ -22,3 +24,5 @@ field-facing existence theorem from The equal-characteristic construction is organized by its mathematical stages below `LubinTate.EqualCharacteristic`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean index 41f8cd5ca7..17e3c1b3b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean index 525f968ed9..f0152b7060 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All + +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 @@ -26,3 +28,5 @@ Each mathematical stage has a reader-facing aggregate below `LubinTate.EqualCharacteristic`; declarations remain in the matching namespace. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean index bb20899bb6..7394933831 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean @@ -3,37 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean index 23c42ea894..be1566a3f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean @@ -3,40 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index efa71d76e7..c26066da86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean index f10707969f..17f5ef36ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean index 26fccf3a44..373f385148 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean index a0197c5060..db7a67d18e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import Mathlib.FieldTheory.IsSepClosed + +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 @@ -22,6 +24,8 @@ This is the changed-uniformizer algebra used in the proof of the completed theta theorem. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean index 9d90f365bd..680178c215 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean index 1fed14f9ce..748dc7083d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity /-! # The completed theta-intertwining theorem: the completed Frobenius lift over the Laurent base @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean index 52fb39ebbe..bd39a2282f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift /-! # The completed theta-intertwining theorem: continuity of the standard completed Frobenius lift @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean index 80bc5d9f07..189850d6a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean index 79b842276b..9a92cf283d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField /-! # The completed theta-intertwining theorem: the canonical base algebra on the fixed field @@ -13,6 +15,8 @@ Frobenius action. Naming it prevents repeated fallback searches through generic scalar-action instances in later norm calculations. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean index c60c61bb60..2ee57070fa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis /-! # The completed theta-intertwining theorem: coefficient descent in the completed fixed field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean index bd21923d1c..3947ccde95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration + +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 @@ -14,6 +16,8 @@ Together with the fixed-field generation theorem this gives the exact extension q^n`. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean index 87d0fff291..c432c3a8b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent /-! # The completed theta-intertwining theorem: generation of the completed Frobenius fixed field @@ -13,6 +15,8 @@ direct theta value identify the fixed field with its simple Laurent-base extension. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean index 1b420f4ac1..6473beb489 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive /-! # The completed theta-intertwining theorem: the fixed primitive completed power basis @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean index 446241669d..a1dc31a1da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean index cc78e45e58..7fc2803013 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree /-! # The completed theta-intertwining theorem: the fixed-field prime element and its norm @@ -16,6 +18,8 @@ primitive Eisenstein polynomial, and the chosen sign convention gives `N(-pi_delta) = aT`. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean index fed330ef47..7addc2530b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction /-! # The completed theta-intertwining theorem: a prescribed Frobenius lift on the completed level @@ -16,6 +18,8 @@ endomorphism is surjective because that bracket is again a primitive generator. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean index 5d9feab8a5..72b924b68c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import Mathlib.Analysis.Normed.Unbundled.SpectralNorm -import Mathlib.FieldTheory.SplittingField.Construction + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean index 1b7c39d377..a0595fd94c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean index 112910f365..9ed35251a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import Mathlib.RingTheory.Polynomial.Eisenstein.Basic -import Mathlib.RingTheory.PowerSeries.Ideal + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean index 3485f9e7d1..c7144625f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction + +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 @@ -22,6 +24,8 @@ division point. The proof analytically evaluates the recursive identity and follows the source torsion orbit until the finite bracket terminates. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean index 051b5a2253..9aee9f77c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity + +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 @@ -21,6 +23,8 @@ coefficients are the unique contracting solutions forced by commutation with normalization `u⁻¹T -> T` used in Corollary the Lubin–Tate endomorphism commutation law. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean index ab8185d885..1a14d9ab4f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean index 33b52b79f5..334104389e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean index 27557f042a..b8f1574e88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse + +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 @@ -20,6 +22,8 @@ and proves that `theta(lambda)` is primitive target `uT`-torsion at the same division level. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean index ba7af64dc5..99d663658e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket + +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 @@ -21,6 +23,8 @@ the same linear coefficient and satisfy the same contracting coefficient recursion. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean index add8c0b904..6cf0d872ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity + +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 @@ -20,6 +22,8 @@ semilinear Frobenius lift. The first theta identity then reduces fixedness to on the completed division point. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean index 84d5985ccf..466b20a7b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity + +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 @@ -14,6 +16,8 @@ Frobenius repeatedly to the formal identity `theta^φ ∘ e_T = e_(uT) ∘ theta`. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean index 6cc49a1329..1a1554f6b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries + +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 @@ -21,6 +23,8 @@ analytic evaluation at division points are developed in the corresponding companion modules. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean index f7dc7991e7..cf78663546 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean index cbb8b8c5c6..e662c4cefd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean + +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 @@ -14,6 +16,8 @@ coefficients. This file records the resulting nonarchimedean local isometry on the maximal ideal. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean index 613de128d1..8614e5a1b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean index 0b082ce7d2..2efa2e41b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization + +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 @@ -15,3 +17,5 @@ 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`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean index a42a11b071..12d1a55626 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import Mathlib.RingTheory.PowerSeries.PiTopology + +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 @@ -18,6 +20,8 @@ ring, and obtains local compactness of `k((T))`. This supplies the genuine Lubin--Tate construction. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean index 29995569dc..bdc4503170 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits /-! # Equal-characteristic Laurent-series model @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean index 076ba04fc8..069774c818 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean index 97fcb8b0aa..dec135d338 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean index 16b0990ea4..9cd1cf4ba4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean @@ -3,23 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.UnitQuotientGalois + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean index 226d3e85c8..05912caf65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction /-! # Ambient Lubin--Tate division groups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean index 4bb6d6f4e7..80c239ce4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import Mathlib.FieldTheory.IsSepClosed + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean index ba3ef678f4..e73853b3f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean index 0447381ca8..126551ab56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import Mathlib.Algebra.Module.RingHom -import Mathlib.Data.Fintype.EquivFin -import Mathlib.LinearAlgebra.FreeModule.Basic + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean index f1f96f5101..faf181f064 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -19,6 +21,8 @@ multiplication then show that any two parameter automorphisms commute on the power-basis generator, hence everywhere. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean index 55838aaf0e..68d324c3af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import Mathlib.FieldTheory.Galois.Basic + +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 @@ -24,6 +26,8 @@ the multiplicative composition law for the bracket action, not merely the root-counting argument below. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean index c4fa9a41b7..ea7f69fb5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion + +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 @@ -16,6 +18,8 @@ with the primitive division polynomial and gives the exact degree `(q - 1) q^n`. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean index 5b3405ff47..93a4ae6323 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.SplittingField.IsSplittingField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms + +public import Mathlib.FieldTheory.SplittingField.IsSplittingField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms /-! # Towers of equal-characteristic Lubin--Tate level fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean index d3635bddf9..6f89da8119 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import Mathlib.RingTheory.Norm.Basic + +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 @@ -14,6 +16,8 @@ polynomial has constant coefficient `T`. The power-basis norm formula therefore gives the norm identity `N(-λ) = T`. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean index 9f24cb1c47..ca8b673b45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import Mathlib.FieldTheory.Finite.Basic + +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 @@ -16,6 +18,8 @@ polynomial. This is the source of the finite-level Galois action; no automorphism or normality is assumed here. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean index ef09112093..1db49ab93b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import Mathlib.RingTheory.Polynomial.Eisenstein.Basic -import Mathlib.RingTheory.PowerSeries.Ideal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean index 46e21f981c..f0bc24b97d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial /-! # The uniformizer norm identity: primitive equal-characteristic division points @@ -16,6 +18,8 @@ records that exact-level property. No irreducibility or Galois assertion is used here. -/ +@[expose] public section + noncomputable section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean index ccd3d90e87..23bc6be906 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean @@ -3,79 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedCompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedPolynomialEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusContinuity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldCoefficientDescent -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPowerBasis -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectBracketAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracket -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectLubinTateBracketRecursion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectTargetLevelEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaIteration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.DirectThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaAtCompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ThetaLocalInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.RealIndexSteps -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.AmbientDivisionTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.PrimitiveTorsion + +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 @@ -86,6 +88,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean index c28d069134..d3ff765b5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean index 4934e18162..a0bd32a7da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.AmbientBracketAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean index db79c5a169..7269326097 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction + +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 @@ -17,6 +19,8 @@ construction will be specialized to a separable closure when forming the Lubin--Tate level fields. -/ +@[expose] public section + noncomputable section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean index e18ac13e4e..16dc49e114 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FreeRankOne -import Mathlib.LinearAlgebra.GeneralLinearGroup.Basic -import Mathlib.GroupTheory.QuotientGroup.Basic + +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 @@ -18,6 +20,8 @@ polynomial indexed by `n` for division level `m = n + 1`; every statement below keeps this shift explicit. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean index 811c915ffa..fe1fbba8e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateEndomorphism /-! # Equal-characteristic Lubin--Tate action @@ -13,6 +15,8 @@ from `EqualCharacteristicLubinTateEnd` into the action of `(κ⟦T⟧ / T^n)ˣ` on the `T^n`-division points. -/ +@[expose] public section + noncomputable section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean index a1cf661d1d..92db0a3241 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentModel -import Mathlib.Algebra.CharP.Algebra -import Mathlib.Algebra.CharP.Frobenius + +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 @@ -25,6 +27,8 @@ Thus the unit action used below is the genuine Lubin--Tate action, not ordinary scalar multiplication in the ambient field. -/ +@[expose] public section + noncomputable section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean index 766b81f59d..99bed2f21a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius + +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 /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean index 326dddd548..ddb9f61c8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius + +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 /-! # Frobenius in equal-characteristic Lubin--Tate theory Public aggregate for coefficient Frobenius, Laurent-series Frobenius, and the completed unramified field. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean index ca01435459..a8870c9284 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import Mathlib.RingTheory.PowerSeries.Basic + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius +public import Mathlib.RingTheory.PowerSeries.Basic /-! # The equal-characteristic completed-unramified construction: equal-characteristic Frobenius on the completed unramified ring @@ -23,6 +25,8 @@ This is an equal-characteristic specialization of the general local-field constr general. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean index 0d48ed0ac9..c4f91189b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import Mathlib.RingTheory.PowerSeries.Evaluation + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField +public import Mathlib.RingTheory.PowerSeries.Evaluation /-! # The equal-characteristic completed-unramified construction: the completed maximal-unramified field in equal characteristic @@ -24,6 +26,8 @@ equivalence; it is not a theorem-shaped replacement for later theta evaluation or norm-subgroup arguments. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Polynomial PowerSeries PowerSeries.WithPiTopology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean index 131624fd5d..568b1a861f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.PowerSeries.Basic -import Mathlib.Algebra.BigOperators.NatAntidiagonal + +public import Mathlib.RingTheory.PowerSeries.Basic +public import Mathlib.Algebra.BigOperators.NatAntidiagonal /-! # LubinTate the contracting Frobenius equation: the contracting Frobenius equation @@ -24,6 +26,8 @@ This file records that source-producing recursion directly. No completeness or external existence assumption is needed. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean index 2af7e03438..5ae9408b61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent -import Mathlib.FieldTheory.Finite.Extension -import Mathlib.FieldTheory.Galois.Profinite -import Mathlib.LinearAlgebra.Basis.Basic -import Mathlib.LinearAlgebra.Dimension.Free + +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 @@ -27,6 +29,8 @@ unramified field in the equal-characteristic completed-unramified construction. postulate an abstract unramified extension. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean index 9f2b3874a3..55325b3910 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean index 8a2e76d1e3..3d44bc6c75 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.StandardSubgroupNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitQuotientCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport + +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 @@ -26,3 +28,5 @@ calculation. The exact norm-subgroup equality, which uses finite local reciprocity, is exported by `LocalClassFieldTheory.LubinTateApplication`. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean index ed4de9fe7e..2a2028afec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldAlgebra + +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 @@ -15,6 +17,8 @@ lands in the completed theta-intertwining theorem fixed field. This leaf packag codomain restriction for the finite-dimensional comparison. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean index 3aedb4a012..5cb1aca90b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldSurjective /-! # LubinTate the explicit norm-subgroup computation: the standard level is the higher-unit fixed field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean index 49694e7f4f..9138a3f2e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitLevelMapFixed + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean index 846d0d29ef..7134809fc4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedFieldDegree + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean index 9b8911f30b..283f5ca9da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedField + +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 @@ -14,6 +16,8 @@ Frobenius attached to `a` acts trivially on the standard primitive `(n+1)`-division point. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean index 1f60c3f002..53a9eac7f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAutomorphisms + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean index 9712d317cb..f88660b3f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.DivisionModuleEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean index b1376969d5..233c0cb199 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UnitTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitFixedFieldEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.CompletedFrobeniusFixedNorm + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean index c576337fcd..a993021931 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +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 @@ -15,6 +17,8 @@ so the later inclusion and index arguments do not repeat expensive fallback typeclass searches. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean index f985f27ab3..9b51efc596 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnitsNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean index 007fa4c603..9ff5eb04c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.LevelAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization + +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 @@ -15,6 +17,8 @@ valuation factor of the norm-subgroup calculation from the later openness and index arguments. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean index bae03b322f..d64e96d491 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentUniformizerNormalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.FiniteParameters + +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 @@ -23,6 +25,8 @@ from the unramified norm-index formula, and the normalized Laurent uniformizer t the same cardinality for `K^x / ( U^(n+1))`. -/ +@[expose] public section + noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean index 4112a7814b..ee6dfb3b0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.UniformizerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.NormSubgroup.HigherUnits -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.CompletedLevel.ChangedUniformizerNormalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean index f9a1fc61ab..2cacd64de7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean index 86b34e9c2f..86130c199e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean index 94e138323b..864ad1a20a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.LowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean index f144e855da..9c1f14fd0c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.PrimitivePoint -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean index 0195f2f7d5..5263826a8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic + +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 @@ -14,6 +16,8 @@ the chosen primitive division point with the corresponding truncated Lubin--Tate bracket. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean index 0ec3feb33e..5c42b8401c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.DisplacementValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -16,6 +18,8 @@ chosen complete valuation, both by visible unit-parameter coefficients and by their exact cardinalities. -/ +@[expose] public section + noncomputable section open scoped LaurentSeries Pointwise PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index c0585ef0a1..3406364c70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.GaloisAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Existence.LaurentLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import Mathlib.RingTheory.Discriminant -import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean index 9f773d82ef..25c28763a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Ramification.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean index 579d9b7141..d2876bcb36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean index d02e73d719..53af8fff1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaFirstIdentity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean index 4e638507f8..4bd9c8f7db 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.LaurentSeriesFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.ContractingEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.FormalModule.LubinTateAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CoefficientFrobenius -import Mathlib.FieldTheory.IsAlgClosed.Basic -import Mathlib.RingTheory.PowerSeries.Basic + +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 @@ -28,6 +30,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean index 787f5c994c..cba7ff05f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Frobenius.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean index 68f0cc704b..0dd043d326 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaUniqueness + +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 @@ -21,6 +23,8 @@ unique contracting solutions forced by commutation with `Y^q + bar_pi Y`. -/ +@[expose] public section + noncomputable section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean index be1f2accbe..27829699b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaCoefficients -import Mathlib.RingTheory.PowerSeries.Expand + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean index 1e783f88a5..b6a2866a24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacteristic.Theta.ThetaSeries + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean index f7ccccccf1..d8f7f59c91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean @@ -3,36 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean index bff12acad2..46f5275528 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean @@ -3,36 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HigherUnitLevelEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LocalUpperRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification + +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 @@ -43,3 +45,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean index 0433c0e6a3..b726a42bab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal + +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 @@ -24,6 +26,8 @@ corresponding ramification index; no equality between the two levels and no higher-unit hypothesis is used. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean index 8df211a599..6054199c25 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ParameterCongruence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean index b821a1eb8a..0547fab78c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap + +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 @@ -35,6 +37,8 @@ an actual finite-level intertwining equivalence; no such equivalence is assumed here. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean index e5b3c0dbe9..2005d0a313 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import Mathlib.RingTheory.AdicCompletion.Topology -import Mathlib.RingTheory.PowerSeries.Evaluation -import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean index 96d3c6e675..47ba3d57dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation /-! # Valuations of standard Lubin--Tate iterates at a primitive point @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean index f7294370d5..ecd9046605 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries -import Mathlib.Algebra.Polynomial.Monic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries +public import Mathlib.Algebra.Polynomial.Monic /-! # Standard Lubin--Tate division polynomials @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean index 26076726a4..a05f0d9eb8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters /-! # Principal-unit filtration on finite Lubin--Tate parameters @@ -14,6 +16,8 @@ filtration. For `1 ≤ k ≤ n + 1`, that image has cardinality `q ^ (n + 1 - k)`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean index fb7f8c3a74..49534cd03e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import Mathlib.GroupTheory.Coset.Card + +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 @@ -22,6 +24,8 @@ the standard Lubin--Tate action on the chosen primitive point to this finite parameter quotient. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean index 874b71a551..821b9ef3cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian + +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 @@ -16,6 +18,8 @@ valuation-ring unit representatives, and preserves the expected cardinality `q ^ (n + 1 - k)`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean index adfc349435..d130529199 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamificationFormula +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.UpperRamification /-! # Herbrand formula for finite Lubin--Tate levels @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean index f4d3301b9f..72074f948c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedPrimitiveEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedLevelCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -38,6 +40,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean index 2b9639c14e..841407283a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import Mathlib.FieldTheory.Galois.Abelian + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import Mathlib.FieldTheory.Galois.Abelian /-! # Abelian standard Lubin--Tate level fields @@ -20,6 +22,8 @@ identification as a multiplicative equivalence and transport commutativity to the Galois group. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean index ae8e652084..6580b38ac4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.FiniteParameters -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean index 7794907469..e123ee2756 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import Mathlib.FieldTheory.SplittingField.IsSplittingField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms +public import Mathlib.FieldTheory.SplittingField.IsSplittingField /-! # The tower of standard Lubin--Tate level fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean index 95a4ff3b95..aa13761426 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean index d7492242af..4b814c9e34 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.StandardLocalField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.HerbrandFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelFieldTower + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean index 49f8902d89..c1415d9e17 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean index d4805ea4d2..e1b743de81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.GaloisParameterFiltration -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean index 046ad04882..4780700902 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.NormUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +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 @@ -18,6 +20,8 @@ The higher-principal-unit contribution is intentionally left to the later norm calculation. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean index 173ee34892..502a5aa4bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import Mathlib.RingTheory.Norm.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer +public import Mathlib.RingTheory.Norm.Basic /-! # Norm of a primitive standard Lubin--Tate point @@ -15,6 +17,8 @@ uniformizer. The power-basis norm formula therefore gives `N(-lambda) = pi`. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean index 917879ff91..0afe330449 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import Mathlib.RingTheory.Ideal.Quotient.Operations + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import Mathlib.RingTheory.Ideal.Quotient.Operations /-! # Parameter congruences for standard Lubin--Tate polynomials @@ -24,6 +26,8 @@ of the characteristic and does not assume an equivalence between the two levels. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean index a1a4c47fad..31bd4a465b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition + +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 @@ -23,6 +25,8 @@ The action is faithful precisely modulo the higher principal-unit subgroup action from valuation-ring units to the standard finite unit parameters. -/ +@[expose] public section + noncomputable section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean index 29455a07ac..7ba0842434 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.CompletedIterates -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelValuation -import Mathlib.RingTheory.MvPowerSeries.Inverse -import Mathlib.RingTheory.PowerSeries.Inverse + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean index 7cd478dc39..11ad9c57f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial -import Mathlib.RingTheory.Polynomial.Eisenstein.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.DivisionPolynomial +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic /-! # Eisenstein property of the standard primitive division polynomials @@ -26,6 +28,8 @@ irreducible over the valuation ring. The argument is independent of the characteristic of `F`. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean index f8506b1e0a..fce68a0c44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveEisenstein -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.RingTheory.Polynomial.GaussLemma -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean index ba89445fea..67061fb279 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveRoot /-! # Primitive Lubin--Tate torsion points @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean index 4c8602fb97..fb0f5b99a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveTorsion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import Mathlib.RingTheory.Finiteness.Cardinality -import Mathlib.RingTheory.Discriminant -import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral + +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 @@ -27,6 +29,8 @@ fundamental identity forces the normalized additive valuation of `λₙ` to be one. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean index 67d9de5812..221353e03c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups + +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 @@ -20,6 +22,8 @@ with the pre-existing `𝒪[K]`, `principalUnits`, and `LocalFieldTheory.fieldPr interfaces. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean index 9de793af06..03c7ff4a95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LowerRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean index d2a6c6baf7..f1ad305836 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean index 77bc51e339..053b582eec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries + +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 @@ -24,3 +26,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean index c6df142ff2..d113590de9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series /-! # Coefficient equations for a fixed uniformizer @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean index dc104968d4..4819b0490d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient -import Mathlib.RingTheory.MvPowerSeries.Trunc + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient +public import Mathlib.RingTheory.MvPowerSeries.Trunc /-! # Finite-degree stabilization for Lubin--Tate intertwining defects @@ -22,6 +24,8 @@ side, truncation of multivariable substitution depends only on the same truncation of the outer series. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean index b9551f330b..281c2f2e6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.LinearTerm -import Mathlib.RingTheory.MvPowerSeries.Substitution + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean index 16e0f804e1..ae7e76ef1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.MvPowerSeries.Order -import Mathlib.RingTheory.PowerSeries.Substitution + +public import Mathlib.RingTheory.MvPowerSeries.Order +public import Mathlib.RingTheory.PowerSeries.Substitution /-! # Prescribed linear terms for multivariable power series @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean index 8f7fba9f41..c7c5054509 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Reduction /-! # Recursive coefficients for Lubin--Tate intertwiners @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean index cd2e36a0a1..e2e0867f81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCoefficient /-! # Recursive monomial corrections for Lubin--Tate intertwiners @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean index 5fa763bd4f..4cdb517384 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.DegreeStabilization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveCorrection /-! # Finite-degree approximations to Lubin--Tate intertwiners @@ -21,6 +23,8 @@ intertwining equation are established below after the finite-degree construction. -/ +@[expose] public section + noncomputable section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean index 2efa4d39ea..1182e3b7f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Intertwiner -import Mathlib.FieldTheory.Finite.Basic -import Mathlib.RingTheory.MvPowerSeries.Expand + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean index b7c489b4e6..ec29e35405 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import Mathlib.RingTheory.PowerSeries.Basic + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import Mathlib.RingTheory.PowerSeries.Basic /-! # Lubin--Tate power series @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean index efe2653ce8..f3efa0f9d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries -import Mathlib.RingTheory.FormalGroup.Basic + +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 @@ -22,6 +24,8 @@ variables, after substituting an intertwining family, and after one-variable power-series composition. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean index 116977a799..bc43a544c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.CoefficientEquation /-! # The standard Lubin--Tate series @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean index 86130c5f96..71ab790df4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean @@ -3,30 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean index 2fa5337f44..bb00acdfb1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean @@ -3,33 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean index 3bed51b449..0c0753aeb5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import Mathlib.RingTheory.WittVector.Compare -import Mathlib.RingTheory.WittVector.Complete -import Mathlib.RingTheory.WittVector.FrobeniusFractionField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint + +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 @@ -27,6 +29,8 @@ uses mathlib's equivalence `W(ZMod p) ≃+* ℤ_[p]`, and `φ` is `WittVector.frobenius`. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean index 3e02b38766..b4ec519ce9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean index bc96e5c1f2..9ef02f7257 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean index 24c200b4a2..447e652ce4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +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 @@ -15,6 +17,8 @@ This module extends the multiplicative and changed-standard Lubin--Tate series t unramified Witt ring and records their coefficients and residue reductions. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean index 1b222f9d80..3965b10ac2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import Mathlib.RingTheory.PowerSeries.Expand -import Mathlib.RingTheory.PowerSeries.Order -import Mathlib.RingTheory.PowerSeries.Trunc + +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 @@ -16,6 +18,8 @@ This module computes how a degreewise correction changes the semilinear substitu constructs the unique coefficient that kills that defect. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean index e384850700..fbe6b6a654 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection /-! # Changed-uniformizer intertwiner construction @@ -12,6 +14,8 @@ This module builds compatible finite-degree approximations, assembles the change intertwiner, proves its functional equation, and establishes uniqueness. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean index 2a1c498186..1ea9ac7ef8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms /-! # Changed-uniformizer scalar compatibility @@ -12,6 +14,8 @@ This module proves that the changed-uniformizer intertwiner commutes with every endomorphism and identifies its coefficientwise Frobenius twist. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean index 05d7cdbd7f..1b906ff820 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveAction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.RecursiveIntertwiner -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction + +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 @@ -17,6 +19,8 @@ This module constructs the completed multiplicative and changed-standard scalar commutation. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean index 714708c171..03e5ae008e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.FiniteAbelianCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedStandardLevelTransport + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean index 3f91302afa..ed3b494657 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardCompositum /-! # Fixed field of the finite changed-uniformizer Artin candidate @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean index 73ac00e865..b8faaf4e0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardResidue +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedResidueFrobenius /-! # Frobenius orientation in the completed standard/changed compositum @@ -19,6 +21,8 @@ coefficient Frobenius and relative residue arithmetic Frobenius are the same arithmetic Frobenius of the finite unramified extension. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean index d2052122b0..783ee4f5e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean index 11354d4521..d0fe10ef64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedStandardFixedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean index 2a42a2c3be..d74c37845e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerThetaFixed -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedFrobeniusFixed + +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 @@ -23,6 +25,8 @@ the fixed-field theorem for Witt Frobenius puts that coefficient in finite changed level, with no comparison hypothesis. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean index 005c58a817..493e48111a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.Polynomial.Eisenstein.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean index e36e5d153f..1b6e22f11a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation /-! # Fixedness of completed p-adic changed-uniformizer theta values @@ -16,6 +18,8 @@ unit itself. The unit and inverse-unit actions cancel, so the actual convergent theta value is fixed. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean index edcbefcc6d..d8bc0463b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift +public import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology /-! # Semilinear evaluation for completed p-adic Frobenius lifts @@ -19,6 +21,8 @@ image of the genuine completed multiplicative primitive point with its actual multiplicative unit translate. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean index 430260fd78..07261007d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveAction /-! # Frobenius lifts on completed p-adic Lubin--Tate levels @@ -19,6 +21,8 @@ the theorem that every completed unit-parameter root generates the completed level. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean index 6874cce29b..0255414600 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries -import Mathlib.FieldTheory.SplittingField.Construction -import Mathlib.RingTheory.AdicCompletion.Topology -import Mathlib.RingTheory.PowerSeries.Evaluation -import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology + +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 @@ -29,6 +31,8 @@ existing mathlib/LCFT objects. No parallel p-adic field, integer ring, or completion is introduced. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean index 92658601aa..ba64c4fc0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAutomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveIrreducible -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean index 3cdd3052df..54765ad401 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import Mathlib.RingTheory.Polynomial.Eisenstein.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import Mathlib.RingTheory.Polynomial.Eisenstein.Basic /-! # Irreducibility of the completed p-adic primitive polynomial @@ -15,6 +17,8 @@ the completed maximal unramified field. In particular it remains irreducible over the completed-unramified fraction field. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean index 8a63b6eaad..fcfec6c1ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedChangedUniformizerPrimitive -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean index 6779900cf6..02f3b01027 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedPrimitiveUniformizer -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusEvaluation + +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 @@ -16,6 +18,8 @@ Frobenius lift induces the arithmetic Frobenius `x ↦ x ^ p` on the residue field. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean index 6205ed2594..9621218a40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedFrobeniusLift -import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean index 4c51b873a4..62cf8a58b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerCoefficient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean index 8d6bbe6b71..2e6e74f3be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Finite.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField + +public import Mathlib.FieldTheory.Finite.Basic +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedUnramifiedField /-! # Fixed points of p-adic completed-unramified Frobenius @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean index e38c9d9446..aa5291041e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean index 5d0713c136..ebbb03406c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot + +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 -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean index 8941485a3b..93b7d8ff71 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel -import Mathlib.RingTheory.AdicCompletion.Topology + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.CompletedLevel +public import Mathlib.RingTheory.AdicCompletion.Topology /-! # Coefficient maps and analytic evaluation on completed p-adic levels @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean index 3fc95a166e..57edd42e5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.ChangedUniformizer /-! # The completed multiplicative primitive point @@ -15,6 +17,8 @@ changed-uniformizer torsion bounds and constructs the actual unit action on that point. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean index 86efb1d344..38eaa8f629 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean index 6aabda18e2..658ace0ff0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedCoefficientEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedPrimitivePoint -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.CompletedScalarEndomorphism -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelPrimitiveRoot -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.CompletedSeries -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.DefectCorrection -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.IntertwinerConstruction -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.ChangedUniformizerIntertwiner.ScalarEndomorphisms + +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 @@ -23,6 +25,8 @@ Frobenius, root, and level-embedding identities used by the completed Lubin--Tate tower. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean index 1de84b3d58..29c1b97229 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.PrimitiveDisplacement -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeIntertwiner -import Mathlib.RingTheory.AdicCompletion.Topology + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean index e784a96b1d..af9b6849f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeEvaluation.FiniteLevelEvaluation -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.LevelAbelian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 @@ -17,6 +19,8 @@ identifies the genuine finite-level Galois action with the cyclotomic power action. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean index f8415b3bfc..90d3bf75ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.StandardFormalGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.MultiplicativeSeries + +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` @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean index bd91276edc..0ce3719898 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule.Series -import Mathlib.RingTheory.PowerSeries.Binomial + +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` @@ -20,6 +22,8 @@ attached to the multiplicative formal group and the canonical prime uniformizer of `ℚ_p`. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean index bbf2e02549..0b79261bfe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean index 70336ae036..243908db94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean index 9a2ee2ba7d..a7958bf30e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean index 33b975ba81..cb5ccf0a0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicInertiaBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicLocalizationCanonicalValuation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean index 3b3894f543..0ffb02121f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean index 0dac7c13b5..a74fa94f94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.ChosenInertiaCoverage -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.InertiaGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.Dedekind.PadicValuationInertia + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean index ee424d2215..61ccdba61c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean @@ -3,12 +3,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 -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import Mathlib.NumberTheory.NumberField.Ideal.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean index a475c0abc5..270ce1b995 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.UnramifiedRationals -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean index a84bc8211e..38e85460a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -3,15 +3,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 -import Mathlib.NumberTheory.Padics.HeightOneSpectrum -import Mathlib.RingTheory.DedekindDomain.Dvr -import Mathlib.RingTheory.Localization.AsSubring -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.RationalPrime -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization + +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 @@ -29,6 +31,8 @@ by 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean index 53633bdd6e..1714ab1419 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.HilbertRamification.PadicCyclotomicRamificationIndexBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.RamificationIndexComparison + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean index a291770ec3..70f9de82c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean index 116ac0c395..89413afafc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic.Cyclotomic.Unramified.CanonicalExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring + +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean index 4e005d8bf2..08f9867c27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants /-! # Comparing exponential and canonical ramification indices @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean index 35c5b4bf47..0a1b7f0da0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean index c6918fcdaa..e60db44731 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.KroneckerWeber -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean index dba3c0edc3..66f1982020 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean @@ -3,54 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean index b2b377a165..9bf2cc5eb9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean index fe3a251451..9d0f172c61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PublicHigherUnitComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean index 56fd93b390..e273841a7b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified /-! # Finite support of the conductor @@ -14,6 +16,8 @@ upstairs. This does not identify an arbitrary defining ray modulus with the minimal conductor. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean index 29dab402b5..a76737217a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean index 215d804a92..45742c847d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRayClassFieldLe.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization /-! # The conductor of a ray class field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean index ffb41b78ab..98439b8b12 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean index 34f8e86162..a1abec8b7b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.IntegerRingComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.Filtered.FiniteAbelian -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import Mathlib.NumberTheory.RamificationInertia.Galois -import Mathlib.RingTheory.Ideal.Quotient.HasFiniteQuotients.Basic + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean index 91861e4b6d..05f8c0462b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean @@ -3,54 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInEveryRayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteUnramified -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorTameCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorFiniteExponentIsLeast -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRayClassFieldLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.AbelianConductorRealRamification -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsRayCongruentOfLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.NarrowRayClassGroupEquivNarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryNarrowModuliEqOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.OrdinaryRayClassGroupEquivClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsUniqueAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.FractionalIdealNormPrimeExponent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageLeArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealArtinKerEqNormRangeSupPrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitOneAdd -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitZero -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeInertiaDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEq -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupRealizationEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealPrimeTo + +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 @@ -59,3 +61,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean index 40676a0bbb..d49c57a94e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.EmbedsInRayClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldModulusMonotone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassFieldReciprocity + +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 @@ -15,6 +17,8 @@ which Frobenius-normalized realization is chosen. It does not assert uniqueness of the embedding itself. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean index cacd51db36..b1cd99cc5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison /-! # The full conductor as a minimal modulus @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean index 870b13623e..6b137b3a43 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsAbelianConductor.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.EmbedsInRayClassFieldIffConductorLe +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor /-! # Existence of the abelian conductor @@ -15,6 +17,8 @@ class field contains that extension. The older theorem name 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean index aaae306556..dbd7c0dd48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean index 757e41731f..b5208dc9e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsUniqueAbelianConductor.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsAbelianConductor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.IsAbelianConductorUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean index 0fffc007d4..5dfab08514 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm /-! # Prime exponents of a fractional-ideal norm @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean index db140f6408..fce1c1a06e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsAbelianConductorUnique.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsAbelianConductor /-! # Uniqueness of the conductor @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean index 008ec1a0ab..de35695363 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.IsRayCongruent +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitAntitone /-! # Ray congruence under enlargement of the modulus @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean index deafa0b1f9..de1e2746a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean index 9ba4b394b4..f236922449 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryNarrowModuliEqOfNoReal.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean index 2692c6dfe6..143ef0538f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.OrdinaryClassGroupComparison -import Mathlib.RingTheory.ClassGroup.Basic + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean index e6e6f68e95..06201cf7e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean index 78287e4026..67eb6b151f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup /-! # Degree of a ray class field @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean index 6533fd8f1b..d722543412 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection /-! # Ray class fields increase with the modulus @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean index 60a250c21b..2811384a48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely + +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 @@ -16,6 +18,8 @@ isomorphism identifies complete splitting with triviality of the corresponding ray class. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean index 86dae2133e..3dc311cab2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupExistence /-! # Ray class reciprocity @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean index c6e94fe4ae..a1748ca6ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupFinite.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 @@ -15,6 +17,8 @@ quotient by a finite-index congruence subgroup, so it is finite for every modulus. -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean index b1b1aabf72..8b422e6b65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayPrimeGeneration + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean index e0db0b1753..6e9ceab96f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealNormImageEqArtinKer + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean index e2bee92299..67cf5a437b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import Mathlib.Data.Finsupp.Order + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean index a8f324b18c..f73a63837f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassIdealModulusProjectionPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.PrimeGeneration -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean index c93c36df4f..90ce9603c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealArtinKernelComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormQuotientComparison + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean index 625d4e9fea..70198b94da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassIdealNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicIdealNormArtinKernel + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean index 4370179e1e..fcb80e1783 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv /-! # Degree of the class field of a ray-class subgroup @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean index 848462b179..6985247128 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassGroupHomExtFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.ArithmeticUnramifiedPrimeArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean index 1c89271f6f..52c0dd518c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison + +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 @@ -16,6 +18,8 @@ uses ideal classes; the proof transports the existing idelic reciprocity construction to that interface. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean index 35842bdd07..a31dd5a574 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding /-! # Inclusion of ray-class subgroup class fields @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean index 2467cd7b1a..191e5426fd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean index eb5ab6f39a..bd4a751db2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean index 7f3a73aaa6..fc335574f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv /-! # Quotient form of ray-class subgroup reciprocity @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean index a078aaccca..b8a14194af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupQuotientEquiv + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean index 9b4735c11c..6e8d65d691 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEq.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupFieldAntitone + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean index 6ec2e61b6f..535de6765b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassSubgroupRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayClassSubgroupEmbedding -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.FiniteAbelianClassFieldContainment + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean index bfdc7a709e..a41539810a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean index 8231fecb6a..8b6d0d294b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic -import Mathlib.RingTheory.Ideal.Quotient.Defs + +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 @@ -15,6 +17,8 @@ An element of the `n`-th higher-unit group is an integral unit congruent to where the condition reduces to being an integral unit. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean index 6a1d37dbbc..c994bc3296 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayLocalHigherUnitMembership -import Mathlib.RingTheory.Ideal.Operations -import Mathlib.RingTheory.LocalRing.Basic -import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic -import Mathlib.Tactic.Ring + +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 + 𝔪ᵛⁿ` @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean index 242280fc46..a1d9545177 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Topology /-! # Openness of local higher-unit groups @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean index 536ff53a9c..1c0c703010 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayLocalHigherUnitGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean index 7ec2e53ba4..d6e28d82f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import Mathlib.Algebra.Group.Subgroup.Lattice + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup +public import Mathlib.Algebra.Group.Subgroup.Lattice /-! # Membership in the ray-principal ideal subgroup @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean index a44f2444e3..2503b3d252 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayPrincipalIdealSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.RayClass.Ideal + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean index 67037bab33..e36a3721e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean @@ -3,33 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean index b08571059c..7e5a74e3de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean @@ -3,33 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAlgEquivTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIsArithmetic -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusRestrictTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplittingPositivePrincipal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldUnique -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.NarrowRayRealizationIsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldEmbedsInBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldLeBig -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallBigHilbertClassFieldIffOfNoReal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.OrdinaryRayRealizationIsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrimeSplitting -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldPrincipalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUniqueUpToEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique + +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 @@ -37,3 +39,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean index 1c4e5498b5..75245cab11 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusIndependentOfPrime -import Mathlib.NumberTheory.NumberField.Basic -import Mathlib.NumberTheory.RamificationInertia.Unramified -import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean index e2e0376510..358bb6acaf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusOrder + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean index 86ca2a6169..1ae03ffba0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import Mathlib.NumberTheory.RamificationInertia.Unramified -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Frobenius + +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 @@ -17,6 +19,8 @@ This is the equality, rather than merely conjugacy, needed to avoid choosing an upstairs prime. -/ +@[expose] public section + open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean index 55ae2e6d74..e066b2fa12 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt /-! # Arithmetic Frobenius satisfies the residue-field congruence @@ -14,6 +16,8 @@ map. It is therefore the precise bridge to `IsArithFrobAt` that downstream ramification arguments can use. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean index df26703304..6954bca6df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import Mathlib.FieldTheory.Finite.Basic -import Mathlib.NumberTheory.RamificationInertia.Unramified -import Mathlib.RingTheory.Frobenius + +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 @@ -16,6 +18,8 @@ subgroup. The arithmetic Frobenius therefore has order equal to the residue degree at `w`. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean index a5f1a65baa..bcaf089f25 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.GlobalArtin + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean index 813a2b122b..b3bee01fdc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.BigHilbertClassFieldMathlibArtin + +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 @@ -19,6 +21,8 @@ Hilbert class field. The displayed compatibility with arithmetic Frobenius fixes the Artin normalization of the isomorphism. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean index ef9e2c1bfd..60e68e2d36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean index 35d96ac14e..a3f85dfc48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldExists.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean index d2c838d42c..a95474f561 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean index 606a244fd4..c8965b5d16 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusEqOneIffSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldArtinEquiv + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean index 5609470c85..3ceb853452 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.RayPrincipalIdealMembership -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldPrimeSplitting + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean index 5ff48c9b4c..a1bb68a02f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField /-! # Uniqueness of the big Hilbert class field inside a separable closure @@ -12,6 +14,8 @@ Maximality among finite-prime-unramified abelian extensions determines one intermediate field of the fixed separable closure. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean index afcee2037f..d1539c41dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.NarrowRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.BigHilbertClassFieldNarrowRayRealization + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean index ded04be8ff..9ffabf0da6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndRayClassFields.ExistsRayArtinModulusProjection -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldOrdinaryRayRealization + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean index 9ed217a9ca..be91e872dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallBigHilbertClassFieldIffOfNoReal.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField -import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean index 4261ce9aa5..18ecd6bbce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassOfFinitePrime -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.ArithmeticFrobeniusAt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.SmallHilbertClassFieldMathlibArtin + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean index 889c3c19c4..e0df88a6e1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import Mathlib.NumberTheory.NumberField.ClassNumber -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean index 3a306581a8..c1aa8238c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldEmbedsInBig.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean index 024e4f506a..a6f70be245 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldExists.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean index 0df873ba17..2f9e600ec1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsBigHilbertClassField + +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 @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean index 2a8b4b01f5..025120982f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.OrdinaryRayClassModulus -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassFieldRealization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldArtinEquiv + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean index e28adea283..16af9ca076 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeFractionalIdeal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.FinitePrimeSplitsCompletely -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -17,6 +19,8 @@ its fractional ideal class is trivial. Both sides use Mathlib's native ideal-theoretic objects. -/ +@[expose] public section + open scoped NumberField noncomputable section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean index 3129a4322f..f405f127e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean index d099de2bac..e28232701a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField /-! # Uniqueness of the small Hilbert class field inside a separable closure @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean index 6abfaa067f..ded9985322 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAndHilbertClassFields.IsSmallHilbertClassField +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHilbertClassFields.SmallHilbertClassFieldUnique /-! # Small Hilbert class fields are isomorphic @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean index 87a4bfe81a..37b589c68b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean index 50a22d6496..91c9d9be95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianGlobalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceLocalGlobalNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinNormKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceCompletionLocalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.FinitePlaceRayArtinLocalValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.MaximalAbelianGlobalArtin + +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 @@ -21,3 +23,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean index ba538d4536..a99758c984 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibGlobalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.MathlibFrobeniusHilbertComparison + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean index 019f0a0da1..79dd5df1a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsAndRayClassFields.RayClassGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv /-! # Quotient form of finite abelian global reciprocity @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean index d40743336b..075bf0eeb7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityQuotientEquiv + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean index 2661b924c5..ce398b53bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import Mathlib.Algebra.Algebra.Equiv -import Mathlib.FieldTheory.KrullTopology -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean index 9d23611933..e982a9e1d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.NumberField.AdeleRing -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean index 93d308f1f4..62906aa800 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Construction -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean index 1cab944013..a9d0315969 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.FinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.ArithmeticNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceArtin.Core -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization -import Mathlib.Algebra.Algebra.Equiv -import Mathlib.FieldTheory.KrullTopology -import Mathlib.NumberTheory.NumberField.Completion.FinitePlace + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean index c6ca757576..f08e304e70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FiniteAbelianReciprocityData -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.FinitePlaceTensorNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.PublicRayClassComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.RayFrobeniusRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.LocalGlobalArtinCompatibility.Factorization + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean index 38841cf306..b69b19dd8d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IsMaximalAbelianGlobalArtin +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFieldTheory.TopologicalGlobalReciprocity /-! # The maximal abelian global Artin map @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean index 542af22afb..b5f6de1198 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/TopologicalGlobalReciprocity.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClassFieldTheory.IdeleClassConnectedQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.MathlibAbsoluteGaloisBaseEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.AlgEquivIdeleClassTopology -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.ConnectedComponentQuotientCongr -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.ClassGroup.MathlibTopologyComparison -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.MathlibTopologicalGlobalReciprocity -import Mathlib.FieldTheory.AbsoluteGaloisGroup + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean index 4fffc59d26..2a709fc436 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean @@ -3,28 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean index af4077a0fe..2f316f72dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean @@ -3,26 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexStrictMono -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexDifference -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionAtLowerIndexNatOfJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.IsUpperRamificationJumpInt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupZeroEqInertia -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealAndUpperRamificationGroupNormal -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAfter -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean index 1c825c9e20..ae461d219b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -25,6 +27,8 @@ lower groups and the Herbrand value are defined explicitly in data. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean index c97d60e09d..3177af113a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexDifference.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex +public import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf /-! # Herbrand-function increment at integral lower indices @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean index 8be526db82..9817359bed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexNatOfJump.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsLowerRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HasseArf -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean index c47df794c7..3320b97e00 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionAtLowerIndexStrictMono.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunctionAtLowerIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.Order.Monotone.Basic -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean index d589fa1e67..015455b945 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -16,6 +18,8 @@ growth is consequently available without exposing that filtration in the public theorem statement. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean index f067326cf1..9b55462533 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.NumberTheory.LocalField.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean index 6b1410bd29..bdc59e6a50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction /-! # Herbrand values at natural lower indices -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean index 7a82001424..7aa3fbeb6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.HerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.InverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.NumberTheory.LocalField.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean index c7ecf270b9..3049a5fbb3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/IsUpperRamificationJumpInt.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf -import Mathlib.Algebra.Group.Subgroup.Ker -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean index 1a19d5eca4..3471fbcc1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupAntitone.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup /-! # The lower ramification filtration decreases @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean index 05e61d62a1..477c0d334a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupAntitone -import Mathlib.FieldTheory.Fixed -import Mathlib.RingTheory.Filtration -import Mathlib.RingTheory.Localization.FractionRing + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean index 518a737473..38dbe622d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupNormal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup /-! # Normality of lower ramification groups @@ -13,6 +15,8 @@ decomposition group: conjugation preserves the maximal-ideal powers that define the filtration. -/ +@[expose] public section + namespace ClassFieldTheory universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean index 4e545ebe90..5017c6082c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupZeroEqInertia.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.LowerRamificationGroup /-! # The zeroth lower group is the inertia group @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean index 2c1ccacb6e..a20fe23d8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealAndUpperRamificationGroupNormal.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNormal /-! # Normality of real lower and upper ramification groups @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean index 43fa043f8b..203a4421af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.Valuation.Extension -import Mathlib.RingTheory.Valuation.ValuativeRel.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean index 9a2dabe770..45a5917b1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNat.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean index eae17ccefa..68a3057d3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupNormal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.RealLowerRamificationGroup /-! # Normality of real lower ramification groups @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean index 1372268966..aa8d43e061 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAfter.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.IsUpperRamificationJump -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone + +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean index 3b1c869f78..c2bd7ec9a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupAntitone.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.HerbrandFunctionInverseHerbrandFunction -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupCanonical + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean index 068cfd11aa..0e2da9b1cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupCanonical.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.InverseHerbrandFunctionHerbrandFunction /-! # Upper groups at Herbrand indices @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean index 71aee566cb..dafca4599a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.UpperRamificationGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.LowerRamificationGroupEventuallyBot -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.RealLowerRamificationGroupNat -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupAntitone -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.HasseArf + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean index d38c51a432..3743dab1fa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean @@ -3,39 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean index f87ecb24b6..befe4889d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean @@ -3,39 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqOneIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassInv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassPow -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassEqIff -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMul -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingSymbolMulRight -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingArtinNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.RootQuotientChoiceIndependence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingInverse -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingNormCriterion -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingPerfectExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingFiniteSupport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.FinitePlaceHilbertBadSetFinite -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.GlobalHilbertPairingSupportBound -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraCopiesOfSimpleFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormProduct -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIffSimpleRadicalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraNormIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerRadicalDegreeEqPowerClassOrder -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraOneNormSurjective -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite + +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 @@ -43,3 +45,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean index c672a39692..c76cc8465c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet +public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.SUnitPreparation.FiniteRadicalSupport /-! # Finiteness of the possible bad finite places @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean index bfa3f00036..491c15bbd7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertProductFormula /-! # Finite support of every local Hilbert-pairing family @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean index b74a4cca67..d5cf72c194 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.FinitePlaceHilbertBadSet -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.PowerResidueReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertComparison + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean index c7974404fd..9e3583b932 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import Mathlib.GroupTheory.FiniteAbelian.Duality -import Mathlib.RingTheory.RootsOfUnity.EnoughRootsOfUnity -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -16,6 +18,8 @@ When the power-class group is finite and the field contains a primitive order. Hence a nondegenerate pairing gives an equivalence with that dual. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean index 1b1e325b46..67d2aea3d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMul.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol /-! # Multiplicativity of Hilbert-pairing symbols @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean index fcbe4b1d05..a78a202042 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingSymbolMulRight.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean index e43bb304a9..286d3e8e49 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertProductFormula.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingFiniteFactor -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalHilbertPairingProperties -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.GlobalInfinitePlaceHilbertSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.FinitePlaceAdicHilbertProductFormula -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.HilbertProductFormulaAlgEquiv -import Mathlib.Algebra.BigOperators.Finprod + +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 @@ -29,6 +31,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean index 95088fe388..6ae4bedd8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFactorDegree -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace -import Mathlib.Algebra.Algebra.Pi -import Mathlib.Data.Fintype.EquivFin + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean index 959f89103f..d0e7d20bda 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteEtale.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteFree -import Mathlib.RingTheory.Etale.StandardEtale -import Mathlib.RingTheory.Localization.Away.Basic + +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 @@ -16,6 +18,8 @@ the base field. This includes reducible polynomials: the algebra need not be a field. -/ +@[expose] public section + namespace ClassFieldTheory open Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean index c87993cc23..20bc3ffa8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFiniteFree.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import Mathlib.RingTheory.AdjoinRoot + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.AdjoinRoot /-! # Finite freeness of a Kummer algebra @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean index 19ac685385..298f77df67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraFinrank.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import Mathlib.RingTheory.AdjoinRoot + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra +public import Mathlib.RingTheory.AdjoinRoot /-! # Rank of a Kummer algebra @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean index 24adbd230c..5339c906ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIffSimpleRadicalNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.CanonicalKummerNorm + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean index e6ff9cd5cd..dd36c63f4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.KummerNormPowerClassDegree -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -16,6 +18,8 @@ have smaller index. Over a nonarchimedean local field containing the field generated by an `n`-th root of `a`. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean index 6ac3f6a4d2..a596534c61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean index 8575eeda32..b878555006 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean index 49c2e67bcc..5ead45334b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraProductDecomposition.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale -import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra -import Mathlib.RingTheory.AdjoinRoot -import Mathlib.RingTheory.Etale.Field + +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 @@ -17,6 +19,8 @@ When the exponent is invertible, the possibly reducible algebra extensions. This applies in particular when `a = 1`. -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean index 7d3ffbfa45..3c8f67476e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraUniformFieldFactors -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFinrank -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraFiniteEtale -import Mathlib.LinearAlgebra.Dimension.Constructions + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean index 6bf2796a8b..5a94bc3d0a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebra -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.KummerAlgebraProductDecomposition -import Mathlib.FieldTheory.KummerExtension -import Mathlib.FieldTheory.SplittingField.Construction + +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 @@ -16,6 +18,8 @@ If the base field contains the `n`-th roots of unity, every field factor of factors in the finite product decomposition are isomorphic over the base. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean index a3fd12ac79..c0f3a80a25 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.KummerAlgebraNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite -import Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -19,6 +21,8 @@ particular, the class of `a = 1` has order one even when the algebra has rank `n`. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean index 4692217fe8..b5e6aa3fcb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.MathlibHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidue -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.Topology.Algebra.ContinuousMonoidHom + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean index 407934d983..98aa4dd691 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExists.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean index 8560e1bbc0..a70c12f67d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.LocalHilbertExponentCompatibility -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean index c4142baacc..a895615552 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingInverse.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import Mathlib.Algebra.Group.Hom.Basic + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing +public import Mathlib.Algebra.Group.Hom.Basic /-! # Inverting the values of a local Hilbert pairing @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean index e50ddef249..e7e4d4939b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingNormCriterion.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.HilbertPairingSymbol -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsKummerNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing + +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 @@ -17,6 +19,8 @@ norm condition. The Kummer algebra is the canonical Mathlib quotient closure. -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean index f5afe8690f..bc2ae4d08c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingPerfectExists.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.IsLocalHilbertPairing -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.HilbertPairingPerfect -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.LocalHilbertPairingExists -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols.PowerClassGroupFinite -import Mathlib.NumberTheory.LocalField.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean index 9875975786..d325f19824 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqIff.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass /-! # Equality of power classes @@ -12,6 +14,8 @@ Two representatives have the same power class precisely when their ratio is an `n`-th power. -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean index e09db7f597..83a7a3dcb6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassEqOneIff.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass /-! # Power-class laws and representatives @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean index af106f4107..9bd7962d49 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassGroupFinite.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClassGroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Kummer.SmallHilbertPairingTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean index 8a5e5cd8b1..84c3042e2b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassInv.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean index fa4cafacda..261dc16c6f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassMul.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean index 9573e753aa..b443c5dd5b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/PowerClassPow.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymbols.PowerClass + +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean index dbed9da73a..dc5cc989b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/RootQuotientChoiceIndependence.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots /-! # Independence of the chosen Kummer root @@ -14,6 +16,8 @@ When the base field contains the `n`-th roots of unity, the 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean index 3c534286fd..87fad532f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/KroneckerWeber.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.Cyclotomic.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.AbelianGaloisEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.SmallModel -import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Core + +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 @@ -17,6 +19,8 @@ integer `n` and a `ℚ`-algebra embedding of `L` into `ℚ(ζₙ)`. The positiv condition excludes the degenerate order-zero cyclotomic construction. -/ +@[expose] public section + namespace ClassFieldTheory universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean index 16724ce9d7..eb461468ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean index b3520769c2..69c3dcfe92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean @@ -3,27 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistence -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocity -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamily -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedNormalization -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivMk -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupFiniteIndex -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupIsOpen -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupRingEquiv -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FieldNormSubgroupTower -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.MemFieldNormSubgroupIff + +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 @@ -31,3 +33,5 @@ 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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean index 36119ef010..1377f483d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupFiniteIndex.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface + +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 @@ -15,6 +17,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean index b89b94657b..9a18c474a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupIsOpen.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface + +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 @@ -15,6 +17,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean index cf5796aaa4..800037ec6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.NormSubgroupRingEquiv -import Mathlib.Algebra.Group.Subgroup.Map + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean index 6f9f775fbc..0148abc217 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.RingTheory.Norm.Transitivity + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import Mathlib.RingTheory.Norm.Transitivity /-! # Norm subgroups in a tower @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean index f5b914d772..a71421a1da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalExistenceOrderIso + +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 @@ -17,6 +19,8 @@ of `Kˣ`. No implementation-specific class-formation object appears in the statement. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean index 97c4aa9a4c..a470fc3f87 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.OpenFiniteIndexSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.ShrinkLocalClassification -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.Order.Hom.Basic + +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 @@ -21,6 +23,8 @@ also records that the order isomorphism sends each extension to its actual field-norm subgroup. -/ +@[expose] public section + noncomputable section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean index e43bc5b1e9..36a052ad2c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.Topology.Algebra.ContinuousMonoidHom + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean index c6ef379769..f97cf7b5a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean index df8fedd6e9..1db98416ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Valuation.Discrete.Basic -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean index 4094d23222..2b3adda2fb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.Existence.FiniteUnramifiedField -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyRigidity -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilySubgroupKernel -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FiniteAbelianFamilyUnramifiedCompositum -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedFamilyExt -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Valuation.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -25,6 +27,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean index 7f95f29c62..b6d6d80888 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.NormResidueNaturality -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Valuation.Discrete.Basic -import Mathlib.RingTheory.Valuation.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean index 53f72b6def..e1474d3b2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityIndex.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface + +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 @@ -15,6 +17,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean index a9fc4f4d58..3ef570f15c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean index 656c647e74..eb073d2263 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.MathlibInterface -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityQuotientEquivOfArtin -import Mathlib.FieldTheory.KrullTopology -import Mathlib.Topology.Algebra.Constructions -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean index c4ebeec652..5558710f9d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormQuotient -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.FieldTheory.KrullTopology -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.Valuation.ValuativeRel.Basic -import Mathlib.Topology.Algebra.Constructions -import Mathlib.Topology.Algebra.Group.Quotient + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean index 411089ebb9..4a405e210b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.GeneralTowerNaturality /-! # Tower compatibility of finite local reciprocity @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean index 53cde6ad83..4dfa2c9b23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FiniteAbelianLocalExtension -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFieldTheory.FiniteAbelianLocalReciprocityUnramifiedHomExt -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedResidueUniqueness -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean index c53b9cfc0a..1f27584592 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormComparison -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean index 809e11a63f..1adaf6e656 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.FieldNormSubgroup -import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.UnramifiedNormalization -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean index 9e48073c5e..72ede1eb05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm /-! # Membership in the field-norm subgroup @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean index 91924676f4..e34cf83abf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean index c872f92aff..2e20c587c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CyclicHasseNormTheorem -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecomposition -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.CompletionTensorNormDecompositionCanonical -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.GlobalNormIsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.ComplexInfinitePlaceAllNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.InfiniteNormIffPositive -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.NegativeOneNotInfiniteNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.UnramifiedInfinitePlaceAllNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean index b8208de0db..3ea9060100 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean index cf422d2fd9..d9f10d2963 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.ExtendingAbsoluteValue -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Extension.LocalNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean index 5c3b265725..a46a295152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces /-! # Norms at a complex infinite place @@ -14,6 +16,8 @@ nonzero base-field element is a determinant norm from the whole archimedean tensor algebra. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean index c478d01e48..dd04e007b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CyclicHasseNormTheorem.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm -import Mathlib.Algebra.Group.DivInvMonoid -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.ClassFieldAxiom.MathlibNormInterface + +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 @@ -19,6 +21,8 @@ condition of being a norm after base change to every finite and infinite completion of `K`. -/ +@[expose] public section + open scoped NumberField namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean index 7d3fae8864..81e9752d8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/GlobalNormIsEverywhereLocalNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassFieldTheory.IsFieldNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsEverywhereLocalNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.TensorNormBaseChange + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean index 474c43b8a3..78db17b2cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean index 40c65f80e9..1f565a6057 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.InfinitePlaceTensorNorm -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.Reciprocity.InfinitePlaceArtin + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean index 5c64939409..2ade1435da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/TensorNormBaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +public import Mathlib.RingTheory.Norm.Basic +public import Mathlib.RingTheory.TensorProduct.Basic /-! # Determinant norm and scalar extension @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean index cb1e156d80..9fa4620f87 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace -import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness + +public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorems.IsNormAtInfinitePlace +public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory.GlobalClassFields.AbelianConductorExactness /-! # Norms at an unramified infinite place @@ -14,6 +16,8 @@ archimedean tensor algebra is surjective when the base place is unramified in the extension. -/ +@[expose] public section + open scoped NumberField TensorProduct open NumberField diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology.lean index 85ba1611e7..19f90df0b8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean index 5c89ba88a5..1369b031cb 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.GaloisCohomology -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean index d2185ad288..328dcc833b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -3,12 +3,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 -import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic -import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean index 99d6643924..d906d573ff 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.NormalBasisLattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean index 7d79eb25f5..c2d2fd4475 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison -import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic -import Mathlib.RepresentationTheory.Homological.GroupHomology.FiniteCyclic + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean index 5496812b8a..0f97458cde 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.BinaryProduct -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Index -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean index 1e4638bf29..1c3c48a2b6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean @@ -3,18 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Algebra.BigOperators.Group.Finset.Basic -import Mathlib.Data.Set.Finite.Range -import Mathlib.GroupTheory.Coset.Card -import Mathlib.GroupTheory.GroupAction.Basic -import Mathlib.GroupTheory.Index -import Mathlib.GroupTheory.OrderOfElement -import Mathlib.GroupTheory.QuotientGroup.Basic -import Mathlib.GroupTheory.SpecificGroups.Cyclic + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index 9ef41c8a43..55dcbc7dcc 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv -import Mathlib.Algebra.GroupWithZero.Action.Prod + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean index 541d95906b..f088c65e01 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison -import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.TateComparison +public import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic /-! # Cardinality -/ + +@[expose] public section namespace CyclicCohomology /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean index 56dfb81dfa..fb8f514fc6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Cardinality /-! # Core -/ + +@[expose] public section namespace CyclicCohomology /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean index 8b705f5a56..dffcb4bf91 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -20,6 +22,8 @@ coordinates be applied to their actual images inside idele groups without introducing comparison assumptions. -/ +@[expose] public section + noncomputable section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean index 6802df26d1..ff38c81b06 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness /-! # Cardinal consequences of a Herbrand quotient @@ -15,6 +17,8 @@ quotient equal to a natural number `n`, then its degree-zero cardinality is cardinality is at least `n`. -/ +@[expose] public section + noncomputable section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean index ba726587e0..b1a056e1f0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Induced /-! # Low-degree Tate cohomology of products @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean index 9c1502e9dd..b0eae03e53 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean index 50a9f74d1b..c8281b2f67 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core -import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions -import Mathlib.Logic.Equiv.Fin.Rotate + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index 7f8c1c989c..afba350a65 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -3,12 +3,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 -import Mathlib.FieldTheory.Galois.NormalBasis -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean index 830a198a27..e8b851574c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.LatticeHerbrand -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean index 871cebaf9f..fcb8e7a49d 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Module.ZLattice.Basic -import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient -import Mathlib.LinearAlgebra.Matrix.Gershgorin + +public import Mathlib.Algebra.Module.ZLattice.Basic +public import Mathlib.LinearAlgebra.FreeModule.Finite.Quotient +public import Mathlib.LinearAlgebra.Matrix.Gershgorin /-! # Permutation-stable sublattices @@ -17,6 +19,8 @@ vector by a lattice point and average all these approximations equivariantly over the finite group. -/ +@[expose] public section + noncomputable section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index 44d272d934..523676578e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.Lattice -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permutation.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 @@ -13,6 +15,8 @@ This file connects the complete permutation sublattice with its orbit-stabilizer Herbrand quotient calculation. -/ +@[expose] public section + open scoped BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean index c9a51d3b9c..1aa5e263a9 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.EquivariantEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandFiniteness -import Mathlib.Data.ZMod.QuotientGroup -import Mathlib.GroupTheory.GroupAction.Quotient -import Mathlib.SetTheory.Cardinal.Finite + +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 @@ -21,6 +23,8 @@ orbits. It also records invariance under passage to a finite-index stable subgroup. -/ +@[expose] public section + open scoped BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean index d090c2066d..b08a4454e5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientTower + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean index ff3c0f87c7..192f604f0b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean index fb8507a3b6..80eb3dd606 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Core -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.PrincipalUnits.QuotientReps -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean index 9230684fce..f49f7d9e10 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.HerbrandLowDegree.Product /-! # Herbrand quotients of finite products @@ -13,6 +15,8 @@ decompositions of low-degree Tate cohomology, giving the corresponding product formula for Herbrand quotients. -/ +@[expose] public section + open scoped BigOperators noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean index 7a8831d0dc..aafc44414b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/IntegralRepUniverse.lean @@ -3,6 +3,8 @@ Copyright (c) 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 @@ -13,5 +15,7 @@ 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 index d7787df3a1..c1096ed27a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean @@ -3,13 +3,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 -import Mathlib.RepresentationTheory.Homological.GroupCohomology.FiniteCyclic -import Mathlib.RepresentationTheory.Invariants -import Mathlib.Topology.Algebra.Group.ClosedSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean index 8c7313998c..1989865817 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RepresentationTheory.Homological.FiniteCyclic -import Mathlib.RepresentationTheory.Homological.TateCohomology.Basic + +public import Mathlib.RepresentationTheory.Homological.FiniteCyclic +public import Mathlib.RepresentationTheory.Homological.TateCohomology.Basic /-! # Boundary-degree Tate cohomology for finite cyclic groups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean index 443300f836..28eb65a78e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Main -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean index 8d535c41a6..75c68687a3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RepresentationTheory.Invariants -import Mathlib.FieldTheory.Galois.Basic + +public import Mathlib.RepresentationTheory.Invariants +public import Mathlib.FieldTheory.Galois.Basic /-! # Invariant units @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean index 08bdd09274..b727586e94 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage /-! # Degree-zero Tate cohomology and the norm quotient @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean index cf956f7099..38e4b7cb11 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateComparison -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.Invariants + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean index 25f82f72dd..b5457d9789 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Finite -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Quotient -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.QuotientTower -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.RestrictionKernel -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean index f75eaf7b44..943bdbf451 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -3,13 +3,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 -import Mathlib.Algebra.MonoidAlgebra.Lift -import Mathlib.Algebra.Module.BigOperators -import Mathlib.GroupTheory.Abelianization.Defs -import Mathlib.RingTheory.TwoSidedIdeal.Kernel -import Mathlib.RingTheory.TwoSidedIdeal.Operations -import Mathlib.Tactic.NoncommRing + +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 @@ -19,6 +21,8 @@ that the group-ring identities can be reused in the proof of Witt's transfer theorem. -/ +@[expose] public section + open scoped Pointwise noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean index b29b734b6c..24cbbb8830 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.DoubleCoset -import Mathlib.GroupTheory.Sylow + +public import Mathlib.GroupTheory.DoubleCoset +public import Mathlib.GroupTheory.Sylow /-! # Finite group theory for the splitting corollaries @@ -25,6 +27,8 @@ is contained in the normal core of `H`; therefore it is trivial when `H` is core-free. -/ +@[expose] public section + noncomputable section universe uG diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean index cb63d1ba7e..4fde4d173c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.Abelianization.Defs -import Mathlib.GroupTheory.QuotientGroup.Basic + +public import Mathlib.GroupTheory.Abelianization.Defs +public import Mathlib.GroupTheory.QuotientGroup.Basic /-! # Quotients represented by a supporting subgroup @@ -15,6 +17,8 @@ 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] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean index 28cc9230b5..d81ce6e70b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.Index + +public import Mathlib.GroupTheory.Index /-! # Quotients in subgroup towers @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean index f9cf0d218d..225e57e6dd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/RestrictionKernel.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Algebra.Group.Subgroup.Ker + +public import Mathlib.Algebra.Group.Subgroup.Ker /-! # Images of subgroups in restriction kernels @@ -12,6 +14,8 @@ 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` diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean index fdb764da78..c78a8442b3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Witt + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean index 1627793cd3..9a483749e6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation -import Mathlib.Algebra.MonoidAlgebra.MapDomain -import Mathlib.GroupTheory.Transfer + +public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation +public import Mathlib.Algebra.MonoidAlgebra.MapDomain +public import Mathlib.GroupTheory.Transfer /-! # Transfer and relative augmentation quotients @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 4d597c3ed5..964312570f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -3,18 +3,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 -/ - -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Augmentation -import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.RelativeAugmentation -import Mathlib.GroupTheory.Finiteness -import Mathlib.GroupTheory.Transfer -import Mathlib.GroupTheory.Torsion -import Mathlib.GroupTheory.FreeGroup.GeneratorEquiv -import Mathlib.LinearAlgebra.Dimension.Localization -import Mathlib.LinearAlgebra.Dimension.Torsion.Finite -import Mathlib.LinearAlgebra.FreeModule.Finite.CardQuotient -import Mathlib.LinearAlgebra.FreeModule.PID -import Mathlib.LinearAlgebra.Matrix.Adjugate +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean index 5cf1caaf07..9de6c8c0f1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean index 0975983ea5..f3f4c393af 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerDelta -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean index 264689782f..de53ea75a6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianCyclicFactors -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerFixedField + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean index 0ad3ff8cd2..6b3064920c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -3,11 +3,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 -import Mathlib.GroupTheory.FiniteAbelian.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerGlobalOperator + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean index ce3f61d5b2..0252a164a5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing /-! # Kummer Cyclic Operator -/ + +@[expose] public section namespace KummerTheory open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean index 2c5dd54163..66ea197381 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerAbelianAssembly -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean index dad5cc05ab..68bd11f6f3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.IntegralRepUniverse +public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.NormKernelVanishing /-! # Kummer Fixed Field -/ + +@[expose] public section namespace KummerTheory open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean index 5adc49ca33..90e48725fb 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerCyclicOperator /-! # Kummer Global Operator -/ + +@[expose] public section namespace KummerTheory open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean index 6d095fe824..fca52f53bd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean @@ -3,28 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.CyclotomicField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalUnitKummerUnramified -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtensionNorm + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean index 7714f337d3..3462e420b1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacterEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicTorsionField + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean index d1b8d3218f..2384a2edc0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteOrder -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Swap -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean index 4c52ba055e..7fb4a29f1f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition -import Mathlib.GroupTheory.Torsion + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean index edb9f1955f..0576ade3f5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientMk /-! # The cyclotomic profinite-unit torsion quotient -/ +@[expose] public section + open scoped Topology noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean index 316578178b..247db5bc10 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather /-! # The profinite-unit product decomposition -/ +@[expose] public section + open scoped Topology noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean index 73c8979c7e..07db821170 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Decomposition + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean index 8105329903..b48f859185 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Local + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean index c64a9c6b37..cde5659e5b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FreeCoordinate + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean index 0041c3ea52..e7c3ef5c6c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.CyclotomicQuotient + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean index af8f42387d..1b3cdd6d82 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.FiniteFree + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean index fc2580b895..f7f30f7881 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean index e18b036298..91503abee3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.Gather + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean index d09e3afb73..1a83fb5619 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.DenseTorsion + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean index 4310d90d7e..c2dfb7c3cb 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.ProfiniteUnitDecomposition.TorsionQuotientEquiv /-! # Evaluation of the torsion-quotient equivalence -/ +@[expose] public section + open scoped Topology noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean index bbc7d345a0..e8204085dd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits -import Mathlib.NumberTheory.Cyclotomic.CyclotomicCharacter -import Mathlib.NumberTheory.NumberField.Cyclotomic.Galois + +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 @@ -21,6 +23,8 @@ No abstract copy of either the Galois group or its expected target is introduced here. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean index 49a65417db..039b359cad 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter -import Mathlib.FieldTheory.Galois.Profinite + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicCharacter +public import Mathlib.FieldTheory.Galois.Profinite /-! # The rational cyclotomic character equivalence @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean index dd02552732..b2b47745d5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.Cyclotomic.Basic + +public import Mathlib.NumberTheory.Cyclotomic.Basic /-! # The rational cyclotomic closure @@ -18,6 +20,8 @@ the whole cyclotomic field. This supplies the field-theoretic source for the rational cyclotomic calculation. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean index b421c0a4b7..172515f5ce 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cyclotomic.RationalCyclotomicField -import Mathlib.FieldTheory.Galois.Profinite -import Mathlib.GroupTheory.Torsion + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean index fe6c0f90b8..06d47c89cc 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Abelian -import Mathlib.NumberTheory.Cyclotomic.Basic + +public import Mathlib.FieldTheory.Galois.Abelian +public import Mathlib.NumberTheory.Cyclotomic.Basic /-! # Concrete cyclotomic fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean index 5b378edc0c..b80eebd384 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteGeneration +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension /-! # extension-side round trip @@ -14,6 +16,8 @@ For an abelian Galois intermediate extension `E/K` of exponent dividing to the actual radical subgroup of `E` recovers `E` itself. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean index a7e78ff204..e0227bbd5c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalQuotient /-! # finite Kummer character isomorphism @@ -23,6 +25,8 @@ isomorphism half of The finite Kummer character equivalence; it does not assert lattice correspondence between radical subgroups and abelian extensions. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean index 5901a32250..4b0416c307 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration /-! # finite Kummer dual separation @@ -17,6 +19,8 @@ equivalence `R ≃ Hom(G, μₙ)` is injective. No lattice correspondence or infinite Kummer endpoint is asserted here. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean index 2bdf001d65..e448f2f511 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.FiniteAbelian.Duality -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv + +public import Mathlib.GroupTheory.FiniteAbelian.Duality +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv /-! # finite actual-field form @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean index 61c21f075d..1dfd941fb5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.FiniteAbelian.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension + +public import Mathlib.GroupTheory.FiniteAbelian.Basic +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension /-! # finite radical support @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean index d1fc56ef2e..6f4412e277 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/GaloisCohomology.lean @@ -3,14 +3,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 -import Mathlib.RepresentationTheory.Homological.GroupCohomology.Hilbert90 + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean index f99fe59abf..cf5614d7b6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv + +public import Mathlib.Topology.Algebra.ContinuousMonoidHom +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteCharacterEquiv /-! # continuity of Kummer characters for infinite extensions @@ -20,6 +22,8 @@ ambient-power quotient `Δ / (Δ ∩ Kˣⁿ)`. No surjectivity or lattice corre asserted here. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean index c8e72f43b7..9833928a50 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration /-! # infinite actual-field form @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean index d7609d998e..aab2371eac 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteSupport +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite /-! # infinite inverse inclusion @@ -16,6 +18,8 @@ theorem at that stage shows that the original radical already belongs to `Δ₀`, hence to `Δ`. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean index 658d5c7fee..ad25f3756b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Profinite -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.ExtensionRoundTrip -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteInverse -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.InfiniteContinuity + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean index ab50051794..0880088b3a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.MaximalKummerSubgroup -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.KummerCorrespondenceFormula + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean index fd4f3ba829..d17077192f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean index 629fd86f21..a9116da96e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RestrictedFinite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex /-! # The maximal Kummer subgroup @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean index 02d4c743f7..e2c08138ec 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.IsSepClosed -import Mathlib.FieldTheory.Galois.Abelian -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration + +public import Mathlib.FieldTheory.IsSepClosed +public import Mathlib.FieldTheory.Galois.Abelian +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteGeneration /-! # the radical-extension construction @@ -21,6 +23,8 @@ primitive-root hypothesis is used later to make the resulting Galois group abelian of exponent dividing `n`. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean index d3d65252d8..f1a036fda3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Infinite -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters + +public import Mathlib.FieldTheory.Galois.Infinite +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RootCharacters /-! # Ambient radical quotients @@ -19,6 +21,8 @@ powers in the ambient group `Kˣ`, in the ambient group, rather than the general smaller subgroup of `n`-th powers of elements of `D.carrier`. -/ +@[expose] public section + namespace KummerTheory section RadicalQuotient diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean index d0da4099b1..ea107d8da0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.FiniteDualSeparation +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.RadicalExtension /-! # finite restricted Kummer pairing @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean index 946fd39f6e..12c4d4c8aa 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RootCharacters.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.GaloisCohomology + +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean index 56a494af7d..8188dc7775 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPreparation.PrimePowerKernelCoordinates /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean index 07ecaa3b23..46ebee2b63 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean @@ -3,13 +3,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 -import Mathlib.Algebra.Group.Equiv.TypeTags -import Mathlib.Algebra.Module.ZMod -import Mathlib.Data.Finsupp.Fintype -import Mathlib.Data.ZMod.Basic -import Mathlib.FieldTheory.IntermediateField.Basic -import Mathlib.RingTheory.LocalRing.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 @@ -17,6 +19,8 @@ Linear-algebraic coordinates for kernels of surjections between finite free modu (p ^ v)`. -/ +@[expose] public section + open scoped IsMulCommutative noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean index 498b1a85c3..a84c6a98d6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.LocalMaximalKummerExtension /-! # Simple Kummer extensions @@ -14,6 +16,8 @@ Kummer theory. For `b : Kˣ`, it chooses an embedded field the `n`-th roots of unity, this is a finite cyclic Galois extension. -/ +@[expose] public section + noncomputable section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean index ad9221c11c..9a5f0b35d6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient -import Mathlib.GroupTheory.Coset.Card -import Mathlib.RingTheory.Polynomial.Cyclotomic.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean index f452acfbde..fcf2f26474 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.CyclotomicTorsionQuotient -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerUnits -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean index abde8eec49..278ebb9aef 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger -import Mathlib.GroupTheory.Torsion + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger +public import Mathlib.GroupTheory.Torsion /-! # The torsion quotient in the cyclotomic decomposition @@ -15,6 +17,8 @@ second factor. This file proves the topological-group calculation which turns that decomposition into a `ℤ̂`-extension. -/ +@[expose] public section + open scoped Topology noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean index c4ffc3058b..0b0d418623 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Topology.Neighborhoods -import Mathlib.Algebra.Group.Subgroup.Ker -import Mathlib.GroupTheory.Index -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerCore + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean index 618deb46ad..a4656e0e15 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean @@ -3,14 +3,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 -import Mathlib.Data.ZMod.Basic -import Mathlib.Topology.Instances.ZMod -import Mathlib.Topology.Algebra.Ring.Basic -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.TopologicalGeneration + +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 /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean index 333fd925ea..f347529a45 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteInteger -import Mathlib.Data.ZMod.QuotientRing -import Mathlib.NumberTheory.Padics.RingHoms + +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 @@ -14,6 +16,8 @@ This file constructs the canonical map `ℤ̂ → ∏ p : Nat.Primes, ℤ_p` from the compatible finite reductions. -/ +@[expose] public section + open scoped Topology noncomputable section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean index 6f36fb7ad1..da5f90c1a8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct -import Mathlib.Topology.Algebra.Group.Units + +public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.ProfiniteIntegerPrimeProduct +public import Mathlib.Topology.Algebra.Group.Units /-! # Units of the profinite integers @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean index 778f5e266b..5ece261be2 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/TopologicalGeneration.lean @@ -3,11 +3,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 -import Mathlib.Topology.Algebra.ClopenNhdofOne -import Mathlib.Topology.Algebra.ContinuousMonoidHom + +public import Mathlib.Topology.Algebra.ClopenNhdofOne +public import Mathlib.Topology.Algebra.ContinuousMonoidHom /-! # Topological Generation -/ + +@[expose] public section namespace ClassFormation /-! diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean index 5112a62f6d..74ed1d3e53 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients + +public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconnectedQuotients /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean index 5217d6825c..bd1a5c6cda 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology/TotallyDisconnectedQuotients.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Topology.Algebra.ClopenNhdofOne -import Mathlib.Topology.Algebra.Group.Quotient + +public import Mathlib.Topology.Algebra.ClopenNhdofOne +public import Mathlib.Topology.Algebra.Group.Quotient /-! # Totally disconnected quotient groups @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ProCGroups.lean b/LeanPool/ClassFieldTheory/ProCGroups.lean index 42d121ea9d..e2d39d3bd8 100644 --- a/LeanPool/ClassFieldTheory/ProCGroups.lean +++ b/LeanPool/ClassFieldTheory/ProCGroups.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions + +public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean b/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean index 9285975b17..5eabf8c7cb 100644 --- a/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean +++ b/LeanPool/ClassFieldTheory/ProCGroups/InducedFunctions.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Group.Action.Basic -import Mathlib.Algebra.Group.Pi.Basic -import Mathlib.Algebra.Group.Subgroup.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean index df48174de2..5aca40e61f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean index 27fe852345..edf0e97eb9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean index d3aa7bb05f..6fcd3862b3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean index 97404beade..16e7b27d19 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean @@ -3,15 +3,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 -import Mathlib.Data.Nat.Factorization.Basic -import Mathlib.Data.Nat.Prime.Basic -import Mathlib.Algebra.EuclideanDomain.Basic -import Mathlib.Algebra.Order.Field.Power -import Mathlib.Analysis.SpecialFunctions.Log.Base -import Mathlib.NumberTheory.Padics.PadicVal.Basic -import Mathlib.Topology.Algebra.Order.Field -import Mathlib.Tactic + +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 @@ -24,6 +26,8 @@ the logarithm and exponential estimates for the convergence and valuation behavi logarithm and exponential series. -/ +@[expose] public section + namespace LocalFieldTheory.DiscreteValuationField open Filter diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean index a76ac105ba..59e3b2ccb1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.FieldUnitLogExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean index 2022d1317f..74ac52a8fe 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import Mathlib.NumberTheory.Padics.PadicVal.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic +public import Mathlib.NumberTheory.Padics.PadicVal.Basic /-! # Valuations of natural-number denominators @@ -15,6 +17,8 @@ and finite residue field, this file constructs the ramification index the natural-number valuation formula used in the logarithm and exponential theorems. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean index e2145efb16..72c8ada67e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms /-! # Extending the logarithm to the field-unit group @@ -14,6 +16,8 @@ distinguished rational prime has logarithm zero. This file isolates that algebraic construction. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean index 5614210f39..5fd0141c33 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition /-! # Uniqueness of logarithms on local-field units @@ -13,6 +15,8 @@ that an extension of the principal-unit logarithm is determined by its value on a uniformizer. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean index 88111fdb6f..8d43a17799 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -3,11 +3,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 -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean index 55cefc8a6c..10316a1357 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean @@ -3,11 +3,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 -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpAdditivity + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean index 0af695a991..da469ae93f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog /-! # Topology of exponential and logarithm @@ -15,6 +17,8 @@ here we prove that the endpoint exponential and logarithm maps are continuous for the valuation topology. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean index 692951e947..ca5c87f75e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean index 1b23aaacb3..3a29a5113f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean @@ -3,14 +3,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 -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.SeriesTerms + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean index 924c15595e..c7266eb02a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean index 0f03d935bd..325b98dae3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoicePositions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition -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.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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean index 44966f17a7..b772cc034e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ProductArgument /-! # Basic factors in the formal logarithm product argument @@ -12,6 +14,8 @@ This module packages the three possible nonzero monomial factors and their finite choice spaces. -/ +@[expose] public section + noncomputable section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean index d22841b82a..61b82bcc86 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.BasicFactors /-! # Coordinate equations for basic-factor choices @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean index 6dd1802abb..468d7e13e3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ExplicitChoiceCounts /-! # Realizing formal-product choices by position sets @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean index 6ba7a74254..eeeaf526ec 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.ChoiceCountSystem /-! # Explicit counts for basic-factor choices @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean index 0812c23ed7..73bca469e0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.PowerSeries.Log -import Mathlib.RingTheory.PowerSeries.WellKnown + +public import Mathlib.RingTheory.PowerSeries.Log +public import Mathlib.RingTheory.PowerSeries.WellKnown /-! # Formal logarithm and exponential composition @@ -14,6 +16,8 @@ This module develops the formal composition identities between Mathlib's logarithm and exponential. -/ +@[expose] public section + noncomputable section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean index 5a5b4069d6..470386178e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCoreBase.PowerSeriesComposition -import Mathlib.Algebra.BigOperators.Ring.Finset -import Mathlib.Data.Finset.Finsupp + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean index d47ab4e430..f804077278 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalCore + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean index e05df85af2..561c354bfa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean index 4e6dd9c81d..08139a8b9b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.LogConvergence + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean index c332c0f2ce..f9fefce807 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean @@ -3,14 +3,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 -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.ExpConvergence + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean index a7fd57571b..4ccd2860c5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.InverseEstimates + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean index 33029436e6..212d085eb8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Equivalences + +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 @@ -13,3 +15,5 @@ import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSer The logarithm maps deep principal units to maximal-ideal powers. Its inverse identities assemble into the underlying and multiplicative equivalences. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean index 366353afa1..ad6ec99a41 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitExp + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean index 0ae1bc6843..1f37942e56 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.PrincipalUnitLog.Core + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean index c7eced033a..df97f5d4e8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -3,16 +3,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 -import Mathlib.Topology.Algebra.InfiniteSum.Nonarchimedean -import Mathlib.Topology.Algebra.Valued.WithZeroMulInt -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.FormalProduct -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean index 5145803d36..c7194303f0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpComposition +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpContinuity /-! # Exponential and logarithm on deep principal units @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean index fa2acb4958..b072771303 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean @@ -3,39 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitPowerIndexFormulas -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FiniteCoefficientLaurent -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicValuationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PolynomialRootProximity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationAddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.WithZeroValuationTopology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean index 2bb1196a79..367064ae8c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Basic.lean @@ -3,16 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import Mathlib.Algebra.CharP.Algebra -import Mathlib.Algebra.CharP.Lemmas -import Mathlib.Data.Rat.Cast.CharZero -import Mathlib.Data.Rat.Lemmas -import Mathlib.FieldTheory.Perfect -import Mathlib.NumberTheory.LocalField.Basic -import Mathlib.NumberTheory.Padics.PadicNumbers -import Mathlib.RingTheory.Algebraic.Integral +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 41c83b35d6..74be439609 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -3,28 +3,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 -/ - -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion -import Mathlib.Analysis.Normed.Module.FiniteDimension -import Mathlib.RingTheory.LaurentSeries -import Mathlib.RingTheory.Localization.Away.Basic -import Mathlib.RingTheory.PowerSeries.Evaluation -import Mathlib.Topology.Algebra.LinearTopology -import Mathlib.Topology.Algebra.Valued.WithZeroMulInt -import Mathlib.LinearAlgebra.Dimension.Basic +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 @@ -35,6 +37,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean index 83ef4e58ab..0b687fb138 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.NormFiltration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean index 5570c59c61..b31e566f27 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm /-! # Base-unit norm images in field towers @@ -14,6 +16,8 @@ image obtained after applying the lower norm. The only theorem used is field norm transitivity. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean index 359d05efe9..947cbe3098 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm /-! # Field-norm subgroups under algebra equivalence @@ -13,6 +15,8 @@ therefore identifies the corresponding norm subgroups of the base unit group. -/ +@[expose] public section + noncomputable section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean index 87e163d6fe..ed9a0643b3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -25,6 +27,8 @@ This file connects the principal-unit decomposition proved in 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean index d713ad9c1d..0c193597ac 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.ContinuousFieldUnitLog -import Mathlib.GroupTheory.SpecificGroups.Cyclic -import Mathlib.Topology.Instances.ZMod + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean index a3ff3bdc2f..332dbcc97b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Algebra.Group.Hom.Basic -import Mathlib.Algebra.Group.Subgroup.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure + +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 @@ -17,6 +19,8 @@ the field-unit structure theorem. Both the natural-cardinality form and the lit form involving the normalized local absolute value are recorded. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean index 1fe79d4abf..019234179a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean index 959ed1dcaf..24dce4f57b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean @@ -3,16 +3,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 -import Mathlib.Algebra.Algebra.ZMod -import Mathlib.Algebra.Field.ZMod -import Mathlib.LinearAlgebra.Basis.Basic -import Mathlib.LinearAlgebra.Dimension.Free -import Mathlib.LinearAlgebra.FiniteDimensional.Defs -import Mathlib.RingTheory.Finiteness.Basic -import Mathlib.RingTheory.LaurentSeries -import Mathlib.RingTheory.Localization.Away.Basic -import Mathlib.RingTheory.RingHom.Finite + +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 @@ -21,6 +23,8 @@ This file starts the remaining equal-characteristic descent in the local-field s coefficientwise map from `F_p((X))` to `k((X))`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean index bb1c4e2d75..b5ae14312f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.Padics.RingHoms -import Mathlib.Topology.Homeomorph.Lemmas -import Mathlib.Basic.Denumerable + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean index d3a934068b..accf064832 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.IwasawaIndexing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitInverseLimitSurjectivity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.EqualCharacteristicLaurent -import Mathlib.LinearAlgebra.Finsupp.LinearCombination -import Mathlib.LinearAlgebra.Finsupp.VectorSpace -import Mathlib.NumberTheory.Padics.ProperSpace + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean index cb626c9524..91e78f1150 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -3,25 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap -import Mathlib.Analysis.Normed.Module.FiniteDimension -import Mathlib.FieldTheory.PrimeField -import Mathlib.LinearAlgebra.Dimension.Basic -import Mathlib.NumberTheory.Padics.WithVal -import Mathlib.RingTheory.SimpleRing.Basic -import Mathlib.Topology.Algebra.Field -import Mathlib.Topology.Algebra.UniformRing + +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 @@ -31,6 +33,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean index 368b1ed9de..36c4eead39 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index ad665f22ab..b84f7fbf99 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.DeepPrincipalUnits +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice /-! # First principal units in mixed characteristic @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean index b8e1dad393..8bc2618cab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice /-! # Deep principal units in mixed characteristic @@ -13,6 +15,8 @@ topology and transports integral-basis coordinates through the deep exponential--logarithm equivalence. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrictNontriviallyNormedField → mrangeRestrictNontriviallyNormedField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean index 14c4f7fd23..d2bac71d03 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -3,17 +3,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 -/ - -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicQp -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicModuleStructure -import Mathlib.RingTheory.DedekindDomain.IntegralClosure -import Mathlib.LinearAlgebra.Dimension.Torsion.Finite -import Mathlib.Topology.Algebra.Module.Compact +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 @@ -25,6 +27,8 @@ the mixed-characteristic field-unit structure theorem. The comparison is made f 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean index 21f912899b..1b67ba9374 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean index 02fd81ed27..1905744ee8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Units +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup /-! # Basic -/ + +@[expose] public section namespace LocalFieldTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean index 9a543b58bd..b936571453 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -3,15 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +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. diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean index 0be6cccd50..e28ec676c9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients /-! # Norm Filtration -/ + +@[expose] public section namespace LocalFieldTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean index 6c245c46b8..39651e8a1b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.LogExpSeries.Homomorphisms -import Mathlib.NumberTheory.Padics.RingHoms -import Mathlib.RingTheory.Polynomial.Cyclotomic.Roots -import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing + +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]` @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean index dd393e638f..c6c5c27206 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean @@ -3,12 +3,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 -import Mathlib.NumberTheory.Padics.RingHoms -import Mathlib.Topology.Algebra.Module.Basic -import Mathlib.LinearAlgebra.Pi -import Mathlib.LinearAlgebra.Isomorphisms -import Mathlib.RingTheory.Finiteness.Finsupp + +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 @@ -18,6 +20,8 @@ continuity of the p-adic scalar orbit, forces compatibility with every p-adic scalar. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean index d8674035db..e7847fc1d2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicLinearOfContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitFactors -import Mathlib.Algebra.Module.PID -import Mathlib.NumberTheory.Padics.ProperSpace + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean index 2114fe5224..169c65ec85 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PowerIndex -import Mathlib.NumberTheory.Padics.RingHoms + +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` @@ -14,6 +16,8 @@ This is the free p-adic factor in the local-field structure theory, the local-fi formula. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean index 073e5087b4..83072bb346 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.MixedCharacteristicStructure.IntegralLattice -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension + +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 @@ -18,6 +20,8 @@ valuations and makes the comparison usable when transporting valuation extensions. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean index ec05065b4c..5fd687e865 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Polynomial.Splits -import Mathlib.Data.Finset.Max -import Mathlib.RingTheory.DiscreteValuationRing.Basic + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean index e69a489dd4..9acde7f437 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean index 7d5f6edd1c..c6e06062be 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core /-! # Compact surjectivity criterion for the principal-unit inverse limit @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean index db41d21dd2..7715e9c506 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean index e594a3623c..6b088785d9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Module.MinimalAxioms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison + +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 @@ -14,6 +16,8 @@ The coordinatewise p-adic action is transported across the canonical adic/prodis comparison, producing its linear and topological forms on first principal units. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean index e7020c4240..7ced1ca864 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology /-! # Adic and prodiscrete principal-unit models @@ -12,6 +14,8 @@ The adic topology on first principal units agrees with the prodiscrete topology by the inverse limit of finite quotient coordinates. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean index 39512a7e0c..3a4b5f7cc0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicProdiscreteComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.ProdiscretePadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.WithZeroValuationTopology + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean index d5622aac5d..e13a49557b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean @@ -3,15 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Algebra.Module.MinimalAxioms -import Mathlib.Algebra.Module.ZMod -import Mathlib.NumberTheory.Padics.RingHoms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.PadicReductionContinuous -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.QuotientTransition + +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 @@ -20,6 +22,8 @@ Reduction of p-adic integers therefore supplies canonical module structures, com the transition maps. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean index 99960b0097..46cc5ea00d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core + +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 @@ -19,6 +21,8 @@ finite coordinate, and compatibility of reduction transports the action to `U^1`. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean index fccf7291ee..2845590165 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes /-! # Topology of the principal-unit inverse limit @@ -12,6 +14,8 @@ This module identifies first principal units algebraically and topologically wit inverse limit of their finite principal-unit quotients. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean index 147808b96e..8ed65152b8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/PadicReductionContinuous.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.Padics.RingHoms -import Mathlib.Topology.Algebra.Group.Basic -import Mathlib.Topology.MetricSpace.Ultra.Basic + +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 @@ -14,6 +16,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean index e64a5ee03a..19fb2ee9c2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Algebra.Module.MinimalAxioms -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.FiniteQuotientPadicModule + +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 @@ -13,6 +15,8 @@ Coordinatewise scalar multiplication makes the prodiscrete inverse limit a topol module over the p-adic integers. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean index f28f90223d..5136d1f165 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.TopologyModelTypes /-! # Transitions between principal-unit quotients @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean index 2276d4913f..26773c0995 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.InverseLimitCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models /-! # Type-level topology models for principal units @@ -14,6 +16,8 @@ represented by distinct wrapper types so that their topologies cannot be confuse selection. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean index 2bc3d26ba6..e0ba5e6623 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.DenominatorValuation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnitPadicAction.AdicPadicModule /-! # Principal-unit topology from a normalized valuation @@ -14,6 +16,8 @@ inherited topology agrees with the canonical adic model, so the p-adic action an continuous on the original principal-unit carrier. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean index 2df552e0df..ac45234eaf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean index 9b17719ca0..2eda7d94dd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration -import Mathlib.Algebra.Group.Units.Equiv + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean index 8eee01fac8..a8faadbe59 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -3,19 +3,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 -import Mathlib.RingTheory.Ideal.Quotient.Index -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerDecomposition + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean index df15db28bc..907a7f7b32 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField -import Mathlib.Algebra.CharP.Lemmas -import Mathlib.Algebra.Group.Units.Hom + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean index a6f5e35db8..6a551f1708 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.AutomorphismTransport /-! # Residue Quotient -/ + +@[expose] public section namespace LocalFieldTheory open ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean index f8f84c7b4b..c45f41821d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Finite.Basic -import Mathlib.RingTheory.RootsOfUnity.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean index 85237f1d24..cf4546fecb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.TeichmullerLift -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean index eef986602d..2f1cee00f6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots -import Mathlib.Algebra.CharP.Lemmas + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.ResidueRoots +public import Mathlib.Algebra.CharP.Lemmas /-! # Teichmuller Lift -/ + +@[expose] public section namespace LocalFieldTheory open ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean index 019e895423..68fe2b3701 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal /-! # Additive valuations in finite complete-DVF extensions @@ -16,6 +18,8 @@ ideal identity `m_K · O_L = m_L ^ e`. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean index 59ef0444bd..4f494da998 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationInvariants /-! # Ramification ideals in finite complete-DVF extensions @@ -14,6 +16,8 @@ The base maximal ideal maps to the `e`-th power of the target maximal ideal, whe in the ambient valued-extension context; no extension marker is involved. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean index 3f123fef10..0e685def34 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core /-! # Canonical ramification invariants @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean index 82b8b580c2..b924e4675d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.GroupTheory.Index -import Mathlib.GroupTheory.QuotientGroup.Basic + +public import Mathlib.SetTheory.Cardinal.Finite +public import Mathlib.GroupTheory.Index +public import Mathlib.GroupTheory.QuotientGroup.Basic /-! # Units -/ + +@[expose] public section namespace LocalFieldTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean index 55722255b1..7a1fcc4b0c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean index 81754497c7..632c6c2981 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal -import Mathlib.RingTheory.AdicCompletion.Topology + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean index bc65530bbe..e70add3d3d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic -import Mathlib.Algebra.Order.Group.Cyclic -import Mathlib.Algebra.Group.Int.TypeTags -import Mathlib.Data.Int.WithZero -import Mathlib.RingTheory.Valuation.Archimedean -import Mathlib.RingTheory.Valuation.RankOne + +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 @@ -18,6 +20,8 @@ multiplicative valuation ranges, together with normalized uniformizer results for `ℤᵐ⁰`-valued valuations. -/ +@[expose] public section + noncomputable section universe u x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean index f4fb600432..2eb4a57ecf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Arithmetic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup -import Mathlib.Data.Int.WithZero + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean index 78b6b82985..cd6f84e0b2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean index 88513d7261..4f8576a977 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology /-! # Multiplicative-range restriction for local fields @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index ac6793889c..a45206d4b0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete -import Mathlib.RingTheory.AdicCompletion.Topology -import Mathlib.Topology.Algebra.Valued.LocallyCompact -import Mathlib.Topology.Algebra.Valued.NormedValued + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean index b539a31e6d..83c0abcf9a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic /-! # Restricting a valuation to its multiplicative range @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean index b27e6c45ac..cdbc4d8a51 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import Mathlib.Order.Filter.AtTopBot.Tendsto + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation +public import Mathlib.Order.Filter.AtTopBot.Tendsto /-! # Valuation estimates for logarithm and exponential series @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean index 668a5e1dd9..be37b610e6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValueGroup /-! # Integer valuations from complete-DVF uniformizers @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean index 5d6ef92acc..b778b7156e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Basic /-! # Valuation-subring units inside field units @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean index a772b72a1d..d9c9df0284 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNormBase -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal + +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 @@ -15,6 +17,8 @@ and relates the value of an embedded base uniformizer to the ramification index. -/ +@[expose] public section + noncomputable section universe u v x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean index 60b674d901..d0cc4c844a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients -import Mathlib.Data.Int.ModEq + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.Norm.Quotients +public import Mathlib.Data.Int.ModEq /-! # Value Group -/ + +@[expose] public section namespace LocalFieldTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean index 09254724dc..9aad78a5e7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CyclicValueGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.SeriesValuationEstimates -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.IntegerValuationUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.CompleteRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.UniformizerIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.RangeRestrictedTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuationSubringUnitMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.LocalFieldRangeRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.ValuationSubringUnits.ValuedExtensionUnitMap + +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 @@ -23,6 +25,8 @@ complete discrete valuation back to the topology obtained directly from `Valued.mk' v`. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrictNontriviallyNormedField → mrangeRestrictNontriviallyNormedField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean index ab71f5b343..6428b4b4e5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.ContinuousQuotientEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.PowerIndex + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean index b718378243..21fc7f52cd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Topology.Algebra.Group.Quotient -import Mathlib.Topology.Algebra.ContinuousMonoidHom + +public import Mathlib.Topology.Algebra.Group.Quotient +public import Mathlib.Topology.Algebra.ContinuousMonoidHom /-! # Continuous equivalences of quotient groups @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean index eb024873dc..69c191e2de 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/IntegerMultipleSubgroup.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Group.Int.TypeTags -import Mathlib.Data.ZMod.QuotientGroup -import Mathlib.Tactic + +public import Mathlib.Algebra.Group.Int.TypeTags +public import Mathlib.Data.ZMod.QuotientGroup +public import Mathlib.Tactic /-! # Integer multiple subgroups @@ -21,6 +23,8 @@ The declarations retain the established 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean index 74865a9adf..b62b9cef2e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Algebra.Group.Subgroup.Ker -import Mathlib.Algebra.Group.Hom.Basic -import Mathlib.Algebra.Group.Subgroup.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory.IntegerMultipleSubgroup -import Mathlib.RingTheory.RootsOfUnity.Basic + +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 @@ -18,6 +20,8 @@ Reusable kernel, quotient, product, and additive-transport formulas for kernel are mathlib's `powMonoidHom`, `MonoidHom.range`, and `MonoidHom.ker`. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean index 4aacc58f8a..6d21d81c0a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean @@ -3,38 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.MultiplicativeDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormSubgroupFunctoriality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PowerClassFiniteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.SeparableNormValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ShrinkTransport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnitTopology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UnramifiedFrobenius -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean index a63e9ae790..199993f556 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean @@ -3,14 +3,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 -import Mathlib.Algebra.Module.Equiv.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean index 9539b314b3..29dab8f6d0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean @@ -3,14 +3,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 -import Mathlib.NumberTheory.LocalField.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean index ec43403aab..3284ac0692 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import Mathlib.Algebra.Order.Hom.Units -import Mathlib.NumberTheory.LocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean index 179bc3bfaf..92616206dc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuedTopology -import Mathlib.Analysis.Normed.Unbundled.SpectralNorm -import Mathlib.RingTheory.Valuation.Extension + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean index 78eea4a7fb..9ea5e27b62 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index b7d58f62af..d1549b55e5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -3,18 +3,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 -import Mathlib.FieldTheory.Galois.IsGaloisGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitActions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean index abcaa70929..2b7e45a2e1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +public import Mathlib.SetTheory.Cardinal.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients /-! # Ideal Quotients -/ + +@[expose] public section namespace LocalFieldTheory noncomputable section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean index f5d66b1ee2..acff5520a0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormContinuity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ProfiniteUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import Mathlib.Topology.LocallyConstant.Basic + +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 @@ -17,6 +19,8 @@ noncanonical uniformizer internally, the resulting parameter-free map lets downstream separation arguments avoid carrying a uniformizer parameter. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean index 75b7413185..e657317fad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean @@ -3,19 +3,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 -import Mathlib.LinearAlgebra.Determinant -import Mathlib.RingTheory.Norm.Transitivity -import Mathlib.RingTheory.Valuation.Integral -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuativeExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean index 115bdd05be..dd55f946cf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import Mathlib.Analysis.Normed.Module.FiniteDimension -import Mathlib.Topology.Instances.Matrix + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean index 5036c784bc..6437bfbfcd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NormUnits -import Mathlib.Algebra.Group.Subgroup.Basic -import Mathlib.Data.Finset.Basic -import Mathlib.GroupTheory.OrderOfElement -import Mathlib.GroupTheory.QuotientGroup.Basic -import Mathlib.LinearAlgebra.FiniteDimensional.Basic -import Mathlib.RingTheory.Norm.Basic + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean index c55daa97a1..50773e023c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormQuotient /-! # Functoriality of finite-extension norm subgroups @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean index 4568d7f279..b18ba5b09d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower /-! # The normalized integer valuation of a local field @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean index 09af235d63..7cb7755d31 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.NormalizedIntegerValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex + +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 @@ -16,6 +18,8 @@ for maximal Kummer extensions and the characteristic-zero local existence theorem. -/ +@[expose] public section + open _root_.LocalFieldTheory.DiscreteValuationField.LocalField renaming chosenFirstPrincipalUnitStructureEqualCharacteristic → chosenFirstPrincipalUnitStructureEqualCharacteristic diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean index e2be0e0977..dd2110f3d6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean index 0fb20f204c..2e4c6fa3ed 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -3,16 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.RingTheory.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean index 27306bef1d..4f480c3a2a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean index 965285305a..c993980aa8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic -import Mathlib.Topology.Algebra.ClopenNhdofOne -import Mathlib.Topology.Algebra.Group.Units + +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 @@ -17,6 +19,8 @@ registering additional global instances, and packages the valuation-ring unit gr profinite group. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean index a85cc5f991..dd52a18a3d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean @@ -3,25 +3,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 -/ - -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Finite.GaloisField -import Mathlib.LinearAlgebra.Dimension.DivisionRing -import Mathlib.NumberTheory.RamificationInertia.Inertia -import Mathlib.NumberTheory.RamificationInertia.Ramification -import Mathlib.RingTheory.Ideal.Norm.AbsNorm -import Mathlib.RingTheory.RamificationInertia.Basic -import Mathlib.RingTheory.SimpleModule.Basic -import Mathlib.RingTheory.DedekindDomain.IntegralClosure -import Mathlib.RingTheory.Trace.Basic -import Mathlib.RingTheory.Valuation.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ResidueUnits +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean index ff61b3c828..81a3115b81 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.NumberTheory.RamificationInertia.Galois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +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 @@ -15,6 +17,8 @@ Restricts field automorphisms to residue-field automorphisms and identifies the resulting kernels and stabilizers with inertia subgroups. -/ +@[expose] public section + namespace LocalFieldTheory noncomputable section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean index 0792f18d1b..d59eb8f08c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean @@ -3,17 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.Algebra.Category.ModuleCat.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.AdditiveEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnits + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean index 8ff5f8e0c7..49f4b6dc5a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean @@ -3,15 +3,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 -import Mathlib.FieldTheory.SeparableClosure -import Mathlib.RingTheory.Ideal.Norm.RelNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean index 9fd5ebbbc5..e00c25028a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Small -import Mathlib.Algebra.Field.Shrink -import Mathlib.Topology.Instances.Shrink + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean index 1da9600a1a..95f675d9ad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import Mathlib.Logic.Small.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean index fb2e5b36ee..14e3a89074 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.PrincipalUnitQuotients /-! # Standard open subgroups of a nonarchimedean local field @@ -13,6 +15,8 @@ contains a standard subgroup built from a uniformizer and a sufficiently deep principal-unit group. -/ +@[expose] public section + noncomputable section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean index 8eab4d861a..a8260dbc1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UniformizerPrincipalQuotient.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.StandardOpenSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.ValuationExactSequence + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean index b1037a51dc..6118d47001 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic /-! # The unit subgroup of a nonarchimedean local field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean index 8868c54304..b2c90e7745 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.FieldTheory.Finite.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean index e18759e55e..2b4e80440f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldNorm -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Norm + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean index ad641c55aa..26a2894e1b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Valuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import Mathlib.Algebra.Group.Hom.Basic -import Mathlib.Algebra.Group.Subgroup.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean index 2b671cdf84..667f7342aa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean @@ -3,16 +3,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 -import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic -import Mathlib.RingTheory.Valuation.Extension -import Mathlib.Topology.Algebra.Valued.ValuativeRel + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean index b3d84d0049..3bb33c391d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Topology.Algebra.Valued.ValuativeRel + +public import Mathlib.Topology.Algebra.Valued.ValuativeRel /-! # Valued-field topology and the induced valuative relation @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean index 9f00681632..0e01d90a52 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.Norm.Transitivity + +public import Mathlib.RingTheory.Norm.Transitivity /-! # Field norms on unit groups @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean index 4e87a01f1d..74dbbc877a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.ClosedAddSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.PrincipalUnits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitDecomposition + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean index 6cf1e7fa9f..4ab1843bf0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/ClosedAddSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.NumberTheory.Padics.RingHoms -import Mathlib.Topology.Algebra.OpenSubgroup + +public import Mathlib.NumberTheory.Padics.RingHoms +public import Mathlib.Topology.Algebra.OpenSubgroup /-! # Closed additive subgroups of the p-adic integers @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean index 79af4596d7..e9719bfb53 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean @@ -3,8 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean index 8e4ae9bc17..3eb56470bc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.Existence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean index 4fddd39767..5033a33ee8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import Mathlib.NumberTheory.Cyclotomic.Gal -import Mathlib.NumberTheory.Cyclotomic.Discriminant -import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral -import Mathlib.RingTheory.IsAdjoinRoot + +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 @@ -25,6 +27,8 @@ to the actual p-adic integer ring; no irreducibility or ramification conclusion is assumed. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean index e87636b12a..3ac5b8738e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.PrimeElement + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean index 7b0dfa57a5..f74b9d6f4c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.RamificationIndex + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean index 09090f4c20..16668d8ac2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinPolynomial /-! # The integral closure in the totally ramified cyclotomic extension @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean index c8a6ac3022..3e125a395f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.EisensteinRelation + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean index dd3080e70f..5b502b6070 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralClosure + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean index f133611c03..b6d4eafd91 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.ValuationRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.RamificationIdeal + +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 @@ -13,6 +15,8 @@ This file maps the Eisenstein unit relation into the target valuation ring and p ℚ_[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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean index 3ff3dbe842..7a3b0121f5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.TotallyRamified.IntegralTranslate + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean index 4056630428..adcff9ca1b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean @@ -3,7 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclotomic.Unramified.ArithmeticFrobenius /-! Supporting modules for Local and global class field theory. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index f9ccbc03de..5a0b979bad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic -import Mathlib.RingTheory.IntegralClosure.IsIntegralClosure.Basic -import Mathlib.RingTheory.Polynomial.Cyclotomic.Factorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -34,6 +36,8 @@ The proof follows the arithmetic construction directly and uses no comparison ce index one, and Nakayama, yielding `O_{K(ζ)} = O_K[ζ]`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean index 0dfe0bd079..0abc930d2a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.Basic -import Mathlib.NumberTheory.Padics.ProperSpace -import Mathlib.NumberTheory.Padics.ValuativeRel + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean index f96ee53855..2c5402ea6d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean @@ -3,16 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.PrincipalUnitExpLogEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicPowerIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.IdealQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.UniformizerPrincipalQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import Mathlib.NumberTheory.Padics.ValuativeRel -import Mathlib.NumberTheory.Padics.ProperSpace +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean index 814a3988fe..8b25874473 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.FieldUnitStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PadicField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.NonarchimedeanLocalField -import Mathlib.Topology.Algebra.Group.Units -import Mathlib.NumberTheory.Padics.ValuativeRel -import Mathlib.NumberTheory.Padics.ProperSpace -import Mathlib.GroupTheory.Torsion + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean index a659eb621a..4c7ca98c2f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean @@ -3,20 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.RamificationIndexTower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean index c35fd78b3e..b1a931d5ec 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChangeCore +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum /-! # A base-change polynomial model for unramified extensions @@ -19,6 +21,8 @@ polynomial vanishing at the mapped generator, and separable reduction. No finite-dimensionality of `K'/K` is used. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean index 9f3c1b4a59..6f9e7f52aa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Separable + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean index 52a37be8ae..d62bba1c71 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions -import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions +public import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas /-! # Value-group invariants of finite unramified extensions @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean index 7301d5beb2..b46a5e1109 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange -import Mathlib.FieldTheory.SeparableDegree + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BaseChange +public import Mathlib.FieldTheory.SeparableDegree /-! # Finite composita of unramified extensions @@ -16,6 +18,8 @@ of residue separability and multiplicativity of the field and residue degrees. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean index 7eccfcaecf..a15e6fc60f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra /-! # Finite and algebraic unramified valued extensions @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean index e75c8f451d..f23826f5dd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Composition /-! # Finite support in the maximal unramified field @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean index b2248cfb6f..0fbf04ea14 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion /-! # the unramified base-change theorem: irreducible reduction source @@ -16,6 +18,8 @@ irreducible. Otherwise a nontrivial residual factorization is coprime and Hensel lifting contradicts irreducibility upstairs. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean index 838995ee17..170549c6d2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions /-! # Henselianity along algebraic valued extensions @@ -16,6 +18,8 @@ extension criterion of the unique-extension criterion, rather than added as an a the unramified base-change theorem. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean index 559d602d72..b036790a6d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.ResidueEmbedding +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.FiniteSupport /-! # The maximal unramified subextension from residue-field data @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean index d8951e4dcb..9a6011f217 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.Definitions /-! # The maximal unramified subextension @@ -16,6 +18,8 @@ finite unramified subextensions, this compositum is the supremum of the finite unramified intermediate fields. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean index aea8ff2cb8..a1170c8446 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean index b10b707bd4..6e6a7ed783 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalSubextension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants -import Mathlib.FieldTheory.SeparableClosure + +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 @@ -20,6 +22,8 @@ finite composita (stability under finite composita); that missing step is not in extra hypothesis. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean index 6f03d71b20..2d2d40ac1c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.MaximalResidue /-! # Lifting separable residue elements to unramified extensions @@ -13,6 +15,8 @@ from the residue-lifting argument: lift the minimal polynomial of a separable am element, then lift its simple linear factor over the ambient valuation ring. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean index d693d7e26a..39d243f551 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.BasicInvariants -import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed -import Mathlib.FieldTheory.PrimitiveElement -import Mathlib.FieldTheory.SeparableClosure -import Mathlib.RingTheory.Adjoin.PowerBasis + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean index 36fa6b0a7f..b65b3a15b8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Different -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Filtration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.InertiaCardinality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean index 47652dfe5e..1d6d1d781d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup -import Mathlib.FieldTheory.Galois.Infinite + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup +public import Mathlib.FieldTheory.Galois.Infinite /-! # Closed Subgroups -/ + +@[expose] public section namespace RamificationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean index 3ca1e42989..1bcaa3faee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import Mathlib.RingTheory.DedekindDomain.Different + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import Mathlib.RingTheory.DedekindDomain.Different /-! # Different and codifferent for valued finite extensions @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean index 0e44d7618b..e445687b51 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Group.Subgroup.Lattice -import Mathlib.Algebra.Order.Floor.Ring -import Mathlib.Algebra.Order.Archimedean.Real.Basic + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean index 0333a7a963..9e0bb6d3ff 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.ClosedFixingSubgroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.CompositumRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean index c3b4c4cd2e..6425da2f07 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteExtensionCorrespondence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean index 9289646cd2..9967fa609c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.FiniteLevelValuationRestriction + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index 66050c9c16..c62dc13d67 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.InfiniteGaloisCorrespondence + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean index 47be443124..13fff5c8f8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean @@ -3,47 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification -import Mathlib.Algebra.Exact.Basic -import Mathlib.FieldTheory.AbsoluteGaloisGroup -import Mathlib.FieldTheory.Galois.Infinite -import Mathlib.FieldTheory.Galois.Profinite -import Mathlib.FieldTheory.PurelyInseparable.Basic -import Mathlib.RingTheory.Valuation.RamificationGroup -import Mathlib.Topology.Algebra.ContinuousMonoidHom -import Mathlib.Topology.Maps.Basic -import Mathlib.Topology.Sets.Opens +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index 5a12d3946f..db7a35d338 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -3,12 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.AbsoluteGalois.AbsoluteRamification + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean index 6d29d23744..7a9c495002 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Infinite -import Mathlib.FieldTheory.Galois.Profinite + +public import Mathlib.FieldTheory.Galois.Infinite +public import Mathlib.FieldTheory.Galois.Profinite /-! # Closed fixing subgroups @@ -13,6 +15,8 @@ This module packages the closed subgroup attached to an intermediate field in the Krull topology. -/ +@[expose] public section + noncomputable section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean index 6c9ecba487..5f2efe693e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction + +public import Mathlib.FieldTheory.Galois.Basic +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction /-! # Restriction from a compositum @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean index 86c87a37d9..59424b14bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic + +public import Mathlib.FieldTheory.Galois.Basic /-! # Restriction between normal intermediate fields @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean index 39302795e8..69e3b557e6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean @@ -3,13 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.RamificationQuotients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteValuationField.PrincipalUnits.Core -import Mathlib.Data.Rat.Lemmas + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean index 66f7ca3f58..abb2278619 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.GroupTheory.QuotientGroup.Finite + +public import Mathlib.GroupTheory.QuotientGroup.Finite /-! # Named quotients of antitone normal-subgroup filtrations @@ -14,6 +16,8 @@ Arithmetic Herbrand functions and valuation-action specializations live in `RamificationTheory.GaloisValuation.Ramification`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean index bdf98e7eaa..4f03a46653 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean index c1300a799b..8182a3ce29 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Tower + +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 @@ -24,6 +26,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean index 5771cc8076..f9aea6b7e2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Quotient -import Mathlib.FieldTheory.Galois.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean index ffe639aa17..e26509e433 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification -import Mathlib.Algebra.Order.Floor.Ring -import Mathlib.Topology.Order.MonotoneContinuity + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean index f0426bec1f..e52ab5e797 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import Mathlib.GroupTheory.Index + +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 @@ -22,6 +24,8 @@ averaging; the inverse-function and upper-numbering statements are proved direct in the Hilbert-ramification Herbrand theorem module. -/ +@[expose] public section + open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming herbrandFunction → herbrandFunction diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean index e59b9433fb..14abf674c8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.Ramification /-! # Finite-group sources for Herbrand's theorem @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean index c0fc333b33..ff35eff72b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean @@ -3,51 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CyclotomicDegreeBound -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteInertiaStructure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.GaloisStabilizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRestrictionCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationRamificationGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.PadicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ResidueExactSequence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationKrasner -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean index e7ecc7e186..4aa7b45c3b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean @@ -3,29 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions + +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 @@ -33,6 +35,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean index cb0f0a626e..6b59670770 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean @@ -3,20 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +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 @@ -27,6 +29,8 @@ localization is algebraic, not the whole metric completion in infinite degree. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean index a785eb24df..8c3eb8fadf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField /-! # Conjugation and base change @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean index f814b4d116..fd00a8a44d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationGroup /-! # Character Map -/ + +@[expose] public section namespace RamificationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean index b403d9979b..7426de2d7a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean @@ -3,13 +3,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 -import Mathlib.Algebra.Exact.Basic -import Mathlib.FieldTheory.Galois.IsGaloisGroup -import Mathlib.GroupTheory.GroupAction.Quotient -import Mathlib.RingTheory.Invariant.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core + +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 @@ -26,6 +28,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean index 1baa7917ba..f6b9389b64 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Group.Subgroup.Finite -import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +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 @@ -15,6 +17,8 @@ embedding into a concrete cyclotomic field therefore bounds its cardinality by Euler's totient. -/ +@[expose] public section + noncomputable section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean index 85841f5256..a46ba34291 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup -import Mathlib.FieldTheory.Galois.Infinite + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup +public import Mathlib.FieldTheory.Galois.Infinite /-! # Decomposition field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean index 21babf0999..e9b3351360 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionField /-! # Decomposition-field extension comparison @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean index d3dad74939..225432d2b5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants -import Mathlib.FieldTheory.SeparableClosure + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean index 16b781d0a7..fa1eb96264 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AbsoluteValueConjugacy +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring /-! # Decomposition-group restriction law @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean index a8ef59cc23..27fc1c8731 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.CompositumUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Conjugation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean index 9ca0251566..b87a031e06 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.RamificationInertia.Galois -import Mathlib.NumberTheory.RamificationInertia.Inertia -import Mathlib.Algebra.Exact.Basic -import Mathlib.RingTheory.DedekindDomain.Factorization + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean index ca1e4e1925..4e4b321d76 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean @@ -3,12 +3,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 -import Mathlib.LinearAlgebra.FreeModule.IdealQuotient -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean index af425e120e..e0fb442534 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic /-! # Hilbert ramification theory: conjugate prime ideals @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean index 2fe66a3221..7931b6cc73 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFields /-! # Hilbert ramification theory: decomposition and inertia tower @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean index d8976b7483..cf2a5316a1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.NumberField.Discriminant.Different -import Mathlib.NumberTheory.NumberField.Ideal.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.NumberFieldPrimes + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean index 4b803126be..63991a9c00 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic /-! # Hilbert ramification theory: decomposition and inertia fields @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean index 6979eeb0c5..b0e04abad7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean @@ -3,11 +3,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 -import Mathlib.NumberTheory.RamificationInertia.Unramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.PrimeContractions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.OrbitCardinality -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.TowerInvariants + +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 @@ -16,6 +18,8 @@ contracted primes `P_Z` and `P_T` appearing in the decomposition and inertia fixed-field tower. -/ +@[expose] public section + noncomputable section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean index 2f883838e7..207b4bc4c8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic /-! # Hilbert ramification theory: prime-decomposition cardinalities @@ -13,6 +15,8 @@ already available from the Dedekind-domain Galois action and mathlib's ramification/inertia API. -/ +@[expose] public section + noncomputable section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean index 64d316845b..c8c156dc62 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.FixedFieldTower /-! # Hilbert ramification theory: number-field prime contractions @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean index 6db647cc9b..814895f595 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic /-! # Hilbert ramification theory: ramification and inertia in towers @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean index 5039137123..94ae1342de 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import Mathlib.NumberTheory.RamificationInertia.Galois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.Basic + +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 @@ -15,6 +17,8 @@ ramification index of a finite separable extension of complete discrete valuation fields. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean index 47ca5090c0..3666ec3751 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean @@ -3,10 +3,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 -import Mathlib.FieldTheory.Galois.Profinite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean index f435c3720a..09672e2902 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevel /-! # Choice independence at finite Galois levels @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean index 7507e00ba7..9bdd27d8b3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteInertiaStructure.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteRamificationPrimary -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteOrderValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap -import Mathlib.Algebra.CharP.Reduced -import Mathlib.GroupTheory.Sylow + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean index 083e100188..b080cf3155 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean @@ -3,12 +3,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 -import Mathlib.GroupTheory.OrderOfElement -import Mathlib.Order.Iterate -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean index d70c0bc55e..341ec10555 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteRamificationPrimary.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationPrimeToResidueTorsion -import Mathlib.Algebra.Group.Subgroup.Finite -import Mathlib.Algebra.CharP.Defs -import Mathlib.Data.Nat.Factorization.Basic -import Mathlib.GroupTheory.OrderOfElement -import Mathlib.GroupTheory.PGroup + +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 @@ -24,6 +26,8 @@ no normality, Henselianity, discreteness, perfectness, or finite residue field is required. -/ +@[expose] public section + namespace RamificationTheory.HilbertRamification.ValuationSubring universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean index 883fbacf65..2b70e0ad09 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CharacterMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationCharacterization + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean index 2a74be6d11..3ad3fa2258 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -18,6 +20,8 @@ integral displacements. Thus the public definition is independent of a monogenic generator. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean index 98890d52ae..2f7b9eb2f7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -3,11 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldValuationRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth -import Mathlib.NumberTheory.RamificationInertia.Galois + +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 @@ -16,6 +18,8 @@ For `M = L ^ H`, this file defines `e(L/M)` from the literal inclusion depth subgroup require no completeness or Henselian hypothesis. -/ +@[expose] public section + open _root_.RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.NonarchimedeanDepth renaming depthLowerFiltration_lower → diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean index beb0165375..94daf249bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure -import Mathlib.RingTheory.DiscreteValuationRing.TFAE + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure +public import Mathlib.RingTheory.DiscreteValuationRing.TFAE /-! # Restricted valuation rings on actual fixed fields @@ -16,6 +18,8 @@ base valuation ring. It is consequently a DVR, without a completeness or Henselian assumption. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean index 82c23435fa..ff556f18dd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic + +public import Mathlib.FieldTheory.Galois.Basic +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic /-! # A finite-Galois stabilizer criterion for simple subfields @@ -14,6 +16,8 @@ In a finite Galois extension, if every automorphism fixing `b` also fixes generated by `b`. -/ +@[expose] public section + noncomputable section open scoped IntermediateField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean index 7861636e8e..ac0080d2eb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups /-! # Herbrand functions for a general discretely valued field @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean index a1b9d6b4b0..34fb2f9581 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean @@ -3,14 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.FixedField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumberRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -20,6 +22,8 @@ the Herbrand quotient theorem and the quotient and tower filtration theorems. T the finite-group averaging argument used in the quotient-filtration comparison. -/ +@[expose] public section + open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration renaming herbrandFunction → herbrandFunction diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean index 846cdf11dc..ae7c62ccd8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Dedekind.ValuedGalois +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.CompleteDVF /-! # Inertia cardinality and the ramification index @@ -14,6 +16,8 @@ decomposition-side inertia subgroup has cardinality equal to the canonical ramification index. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean index 5879174bf5..5fd93170ff 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Algebra.Group.Subgroup.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup + +public import Mathlib.Algebra.Group.Subgroup.Finite +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionGroup /-! # Cardinality under inertia scalar restriction @@ -13,6 +15,8 @@ This is the finite-cardinality consequence of the inertia-subgroup cardinality f the base completion is identified with a concrete local field. -/ +@[expose] public section + noncomputable section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean index 8b780dc02d..e686977d80 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -3,21 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.BaseChange +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 @@ -27,6 +29,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index 2497ac3fee..a7f51482fa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.LocalizationDensity + +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 @@ -18,6 +20,8 @@ of `L` in the algebraic localization, proved in `RamificationTheory.HilbertRamification.LocalizationDensity`. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean index 749dd484a7..76a64a2790 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniqueExtensionIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Polynomial -import Mathlib.NumberTheory.RamificationInertia.Inertia -import Mathlib.NumberTheory.RamificationInertia.Ramification + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean index 5462a460bb..680c20cee4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean index a99c7d462c..1dda69cc38 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.DecompositionFieldLocalization -import Mathlib.FieldTheory.Galois.Abelian + +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 @@ -19,6 +21,8 @@ nonarchimedean facts needed to compare a global algebraic localization with an extension of `ℚ_[p]`. -/ +@[expose] public section + noncomputable section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean index 20d4e6c370..cea68e4046 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Polynomial.lean @@ -3,11 +3,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 -import Mathlib.Algebra.Polynomial.Eval.Defs -import Mathlib.Algebra.Ring.GeomSum -import Mathlib.RingTheory.Ideal.Defs -import Mathlib.Tactic.Ring + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean index 1913b65475..f3a16aa05c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring /-! # Ramification inside the decomposition group @@ -14,6 +16,8 @@ decomposition group. -/ +@[expose] public section + noncomputable section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean index 3e5dae7b62..5eceb56301 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.UniformizerGradedHom -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Average -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean index 063ef71b9a..292035377d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring /-! # Ramification Group -/ + +@[expose] public section namespace RamificationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean index 9e0145d66f..d30a496c15 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean index 3ba780ce02..26855a0ad9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -3,10 +3,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 -import Mathlib.SetTheory.Cardinal.Finite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationNumber -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction + +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 @@ -17,6 +19,8 @@ supplies the generator hidden inside 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean index 58e3b819ad..19614966c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.OrbitPolynomialIdeal +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FixedFieldRamificationIndex /-! # quotient-depth identity over a general DVF @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean index 009851d1cf..6935683ef0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationPrimeToResidueTorsion.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring -import Mathlib.Algebra.BigOperators.Field + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.ValuationSubring +public import Mathlib.Algebra.BigOperators.Field /-! # Prime-to-residue torsion in the actual ramification group @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean index f9c1e204c9..d1a7a2ca65 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic -import Mathlib.Algebra.Order.Archimedean.Real.Basic -import Mathlib.RingTheory.Valuation.Extension -import Mathlib.FieldTheory.Galois.Basic + +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 @@ -23,6 +25,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean index 851be148e1..dc82abcb39 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ClosedSubgroups +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.ProfiniteInvariant /-! # Residue Exact Sequence -/ + +@[expose] public section namespace RamificationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean index 3c62a9e0f6..5608213578 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.Monogeneity /-! # First ramification-quotient homomorphism over general DVFs @@ -15,6 +17,8 @@ residue extension; the unconditional printed assertion is false for fiercely ramified extensions. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean index fddb4c090f..bdf07a9eed 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RealLowerGroups -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import Mathlib.Algebra.Polynomial.Lifts + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean index f7de124ce4..9df6d99ccb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth /-! # A valuation-theoretic finite Galois form of Krasner's argument @@ -19,6 +21,8 @@ invariance of the normalized additive valuation and its ultrametric inequality are sufficient. -/ +@[expose] public section + noncomputable section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean index 5c0155dfdb..f4756fcd7e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.RamificationDepth +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions /-! # Compatibility of valuation-ring actions with Galois restriction @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean index 41b3dbaaf2..7400486da2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean @@ -3,15 +3,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 -import Mathlib.Algebra.Exact.Basic -import Mathlib.Algebra.Group.Units.Equiv -import Mathlib.Algebra.Group.Subgroup.Map -import Mathlib.FieldTheory.Galois.Basic -import Mathlib.GroupTheory.QuotientGroup.Basic -import Mathlib.RingTheory.Valuation.RamificationGroup + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean index 8290d3a1a4..d330093e67 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Group.Subgroup.Finite -import Mathlib.Algebra.Group.Subgroup.Lattice -import Mathlib.SetTheory.Cardinal.NatCard + +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 @@ -17,6 +19,8 @@ product of their cardinalities. This file isolates that elementary count from the arithmetic part of the proof. -/ +@[expose] public section + noncomputable section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean index c7f636f8b3..70a8977139 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.BaseChange -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.FirstRamificationComparison -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.InertiaCard -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Unramified + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean index f26572da1d..bf1c120eb0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core /-! # Transport of upper ramification groups under an equivalent base field @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index dfeb6b560b..5b230af3d8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import Mathlib.FieldTheory.Galois.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisValuation.IntermediateFieldRestriction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand.Function -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FiniteGaloisLevelIndependence -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandFunction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.HerbrandTheorem + +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 @@ -19,6 +21,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean index 72baf8221f..773dc6eb5f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.FirstRamificationComparison + +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 @@ -15,6 +17,8 @@ ramification group. The latter is transported from the decomposition group back to the full Galois group. -/ +@[expose] public section + noncomputable section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean index 1ee3ef7450..533d8fcc08 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteExtensionCompleteDVF -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRamification.InertiaRamificationCard + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean index a86d5b9c9e..46a8345d99 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalField.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.FiniteUnramified -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.NonarchimedeanLocalField.GaloisIntegerRing + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean index 2028f56a26..7d8558963f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.Galois.Profinite -import Mathlib.RingTheory.Invariant.Profinite + +public import Mathlib.FieldTheory.Galois.Profinite +public import Mathlib.RingTheory.Invariant.Profinite /-! # Profinite Invariant -/ + +@[expose] public section namespace RamificationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean index 8ffcabe483..cef727393c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean index 4c0f66eaed..427a7f4178 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean @@ -3,18 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean index 6f501ce4e5..5e5d238a8e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean index 2f28e2821d..3f1e48d458 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import Mathlib.RingTheory.Complex -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension + +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 @@ -17,6 +19,8 @@ every algebraic field extension. Both the archimedean and nonarchimedean branches are included. -/ +@[expose] public section + noncomputable section namespace AbsoluteValue diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean index c29c653bc6..1c3362747c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import Mathlib.Analysis.Normed.Unbundled.SpectralNorm -import Mathlib.RingTheory.Norm.Transitivity -import Mathlib.RingTheory.Complex + +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 @@ -18,6 +20,8 @@ uses the completed Ostrowski theorem, reducing the statement to the standard `ℝ` and `ℂ` absolute values. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean index ababbdf012..5b19bc3db3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import Mathlib.RingTheory.Norm.Transitivity + +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 @@ -16,6 +18,8 @@ The algebraic-extension norm formula, together with restriction of a valued fiel intermediate field. -/ +@[expose] public section + noncomputable section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean index 77794e3211..ce47479eab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure /-! # the finite norm-formula absolute value @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean index 5ed023d213..6993e06d5e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core /-! # coefficient bound from primitive Hensel factorization @@ -16,6 +18,8 @@ factorization form of Hensel's lemma in the primitive factorization definition, separatedness hypothesis is needed. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean index 85df6e93c6..584f18eee6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring /-! # algebraic extension and integral closure @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean index 248abed7a9..9cf3f31720 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean index 5236d312cf..6e513a0ed2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions -import Mathlib.LinearAlgebra.Dimension.Finrank -import Mathlib.LinearAlgebra.Dimension.Free -import Mathlib.Algebra.Order.WithTop.Untop0 -import Mathlib.GroupTheory.Index -import Mathlib.Data.ZMod.QuotientGroup -import Mathlib.Algebra.Algebra.Tower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.LocalRingEquiv + +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 @@ -24,6 +26,8 @@ with the integral closure, so the local Dedekind ramification identity applies without completeness. -/ +@[expose] public section + noncomputable section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean index 57fb626d3a..6ee1b9edff 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean index 83198a960d..32df07bade 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension /-! # uniqueness from the integral-closure valuation ring @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean index e41affab00..9e0f8496b9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion +public import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic /-! # Algebraic localization inside an absolute-value completion @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean index d22327d249..2ca582e88c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean @@ -3,11 +3,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 -import Mathlib.Analysis.Normed.Field.WithAbs -import Mathlib.Analysis.SpecialFunctions.Pow.Real -import Mathlib.RingTheory.Norm.Defs -import Mathlib.Topology.UniformSpace.AbsoluteValue + +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 @@ -17,6 +19,8 @@ formula development was removed because it duplicated mathlib APIs and no longer compiled. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean index dd42945f04..585474abc4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import Mathlib.Analysis.Normed.Field.Instances -import Mathlib.Analysis.Normed.Module.Completion -import Mathlib.Analysis.Normed.Unbundled.RingSeminorm + +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 @@ -20,6 +22,8 @@ canonical one inherited from WithAbs; algebras between different completions remain explicit. -/ +@[expose] public section + noncomputable section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean index 26cf84831d..fcee1be82f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified.HenselianAlgebraicExtension /-! # Canonical exponential valuation attached to an absolute value @@ -15,6 +17,8 @@ unramified predicates of the unramified-extension construction use additive expo supplies the canonical conversion `v(x) = -log |x|`. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean index 039dc2fb24..6c5c153462 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Extension.lean @@ -3,15 +3,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 -import Mathlib.Algebra.Algebra.Basic -import Mathlib.Basic.Real.Basic -import Mathlib.Topology.UniformSpace.AbsoluteValue + +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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean index e5514171d4..f44817ed7f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean @@ -3,10 +3,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 -import Mathlib.Analysis.AbsoluteValue.Equivalence -import Mathlib.Analysis.SpecialFunctions.Pow.Continuity -import Mathlib.Algebra.Order.Ring.IsNonarchimedean + +public import Mathlib.Analysis.AbsoluteValue.Equivalence +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity +public import Mathlib.Algebra.Order.Ring.IsNonarchimedean /-! # Nonarchimedean absolute values @@ -14,6 +16,8 @@ The strong triangle inequality is equivalent to boundedness on natural numbers for real-valued absolute values. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean index d2b776f42c..b1a44c40ac 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import Mathlib.Analysis.Normed.Algebra.GelfandMazur -import Mathlib.NumberTheory.Ostrowski + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean index fffaebe524..97885ab46c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import Mathlib.RingTheory.AdicCompletion.Basic + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean index 5d99cabc5b..38a979e8cd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import Mathlib.Analysis.Normed.Unbundled.SpectralNorm + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean index d5a2346cc7..72a85abf67 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean @@ -3,9 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean index 57ddf87ec7..122b63372a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean @@ -3,11 +3,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 -import Mathlib.Analysis.AbsoluteValue.Equivalence -import Mathlib.Algebra.Order.Ring.IsNonarchimedean -import Mathlib.NumberTheory.Ostrowski -import Mathlib.Topology.UniformSpace.AbsoluteValue + +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 @@ -17,6 +19,8 @@ approximation, and rational-function examples are imported from Mathlib where needed. -/ +@[expose] public section + noncomputable section open Filter diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean index 01e0985d74..bca23aa238 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.ExponentialValuations + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean index cad934f110..bc3c725fd7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean @@ -3,16 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.AbsoluteValues -import Mathlib.GroupTheory.QuotientGroup.Basic -import Mathlib.RingTheory.DiscreteValuationRing.Basic -import Mathlib.RingTheory.Henselian -import Mathlib.RingTheory.Ideal.IsPrincipalPowQuotient -import Mathlib.RingTheory.Valuation.ValuationSubring + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean index 1dc3c271ee..8934630e48 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import Mathlib.Algebra.Polynomial.Lifts -import Mathlib.RingTheory.LocalRing.ResidueField.Basic -import Mathlib.RingTheory.Valuation.LocalSubring + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean index 7bd4e1c5aa..275781b198 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.Padic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean index 9c02bec9fc..55470e9087 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean @@ -3,32 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import Mathlib.Analysis.Normed.Field.Instances -import Mathlib.Analysis.Normed.Module.Completion -import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure -import Mathlib.FieldTheory.IntermediateField.Adjoin.Algebra +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 @@ -39,6 +41,8 @@ closure is produced by the unique-extension unique extension theorem, not suppli extra hypothesis. -/ +@[expose] public section + noncomputable section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean index a105d2b566..1c29b78671 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.PrimitiveElement -import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas -import Mathlib.RingTheory.AdjoinRoot -import Mathlib.RingTheory.TensorProduct.Free + +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 @@ -16,6 +18,8 @@ If `L/K` has power basis generated by `α`, then the scalar extension the canonical algebra equivalence used in scalar-extension decompositions. -/ +@[expose] public section + noncomputable section namespace ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean index b41311213e..7e6790d1c9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean @@ -3,12 +3,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 -import Mathlib.LinearAlgebra.Charpoly.BaseChange -import Mathlib.LinearAlgebra.Trace -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.Trace.Basic -import Mathlib.RingTheory.TensorProduct.Basic + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean index 34bf9e7d7d..bcc3fb5fc7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import Mathlib.Algebra.Algebra.Pi + +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 @@ -16,6 +18,8 @@ which occurs in the tensor-product decomposition over a completion. This constr independent of the factorisation argument later used to prove bijectivity. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean index 9954537cfb..9cce96c875 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductDecomposition -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.TensorProductProductFormulas + +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 @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean index 876ff907b8..c83894a138 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteLocalization -import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean index 7b0fca2873..2ad84670af 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -3,30 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.FiniteNormExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormula -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaAbsoluteValue -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.RamificationInvariants -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completeness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ExponentialValuation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Extension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Nonarchimedean -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Ostrowski -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.SpectralExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.DegreeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete + +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 @@ -41,6 +43,8 @@ local extension `L_w / K_v` is finite separable. The fundamental inequality the 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean index 546c4476d9..e2c5afe00b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicLocalization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.AbsoluteValueExtensions -import Mathlib.Analysis.Normed.Module.FiniteDimension -import Mathlib.RingTheory.TensorProduct.Finite -import Mathlib.RingTheory.TensorProduct.Maps + +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 @@ -18,6 +20,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean index cafb296805..b944c5cd8e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean @@ -3,10 +3,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 -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.Trace.Basic -import Mathlib.LinearAlgebra.Dimension.Constructions + +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 @@ -17,6 +19,8 @@ are recorded here so that the local factors are allowed to have different field degrees. -/ +@[expose] public section + noncomputable section namespace ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean index 2e0c955a67..658e8d55b6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import Mathlib.NumberTheory.Ostrowski -import Mathlib.NumberTheory.Padics.PadicNumbers + +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 @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean index 7685176189..862fb7899a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.AdjoinRoot -import Mathlib.RingTheory.Ideal.Quotient.Operations + +public import Mathlib.RingTheory.AdjoinRoot +public import Mathlib.RingTheory.Ideal.Quotient.Operations /-! # Polynomial Chinese remainder equivalence @@ -14,6 +16,8 @@ of the base-changed primitive polynomial gives the canonical product of its simple factor algebras. -/ +@[expose] public section + noncomputable section namespace ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean index a8d178ad08..35cfdf31c9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean @@ -3,11 +3,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 -import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure -import Mathlib.FieldTheory.Minpoly.IsConjRoot -import Mathlib.Algebra.Polynomial.FieldDivision -import Mathlib.RingTheory.Adjoin.PowerBasis + +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 @@ -17,6 +19,8 @@ valuation correspond to the *distinct* irreducible factors over the completion. -/ +@[expose] public section + noncomputable section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean index 4e5cf994dd..2c6d856694 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors -import Mathlib.FieldTheory.Separable + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialFactors +public import Mathlib.FieldTheory.Separable /-! # Distinct factors of a separable polynomial @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean index f96fc68633..bbb9eb5122 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Completion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.ExtensionFactorClassification -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.SeparablePolynomialFactors -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeAdjoinRoot -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.PolynomialCRT -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.CanonicalTensorMap -import Mathlib.Algebra.Group.Pi.Units + +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 @@ -21,6 +23,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean index 6cc296f328..d0efd52278 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.BaseChangeNormTrace -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.FiniteProductNormTrace + +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 @@ -16,6 +18,8 @@ with the canonical images in `L_w`; no compatibility theorem is assumed here. -/ +@[expose] public section + noncomputable section namespace ValuationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean index 4d5b746b06..e54f6e9903 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean @@ -3,24 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AddVal -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AmbientUniformizer -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.CompleteDVRExpansion -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Compositum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean index 3a4f25b154..c500f5aadf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.DiscreteValuationRing.Basic + +public import Mathlib.RingTheory.DiscreteValuationRing.Basic /-! # Normalized additive valuations on discrete valuation rings @@ -13,6 +15,8 @@ valuation on a discrete valuation ring which are independent of any chosen valued-field presentation. -/ +@[expose] public section + noncomputable section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean index c0a1e7a5c2..dbce66a60c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean @@ -3,10 +3,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 -import Mathlib.RingTheory.AdicCompletion.Functoriality + +public import Mathlib.RingTheory.AdicCompletion.Functoriality /-! # Adic Power -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean index 864d1ef3c8..261b17495a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness /-! # Uniformizers detected in an ambient complete discrete valuation field @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean index a331500c57..5613721123 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean @@ -3,13 +3,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 -import Mathlib.Algebra.CharP.Subring -import Mathlib.RingTheory.LocalRing.ResidueField.Basic -import Mathlib.RingTheory.Valuation.Discrete.Basic -import Mathlib.RingTheory.Valuation.LocalSubring + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean index 0e73d89b5d..b5ab306fae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationExtension -import Mathlib.RingTheory.DedekindDomain.IntegralClosure -import Mathlib.RingTheory.Valuation.LocalSubring -import Mathlib.RingTheory.Valuation.Integral + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean index 25e409241c..8ddbfd4a14 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ValuationTransport + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean index 5085b86652..64390e4646 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models -import Mathlib.Topology.Algebra.Nonarchimedean.AdicTopology + +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 @@ -18,6 +20,8 @@ coefficients and remainders satisfying `u = a 0 + a 1 * π + ... + a (n - 1) * π ^ (n - 1) + π ^ n * b n`. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean index d3310665e6..9b9035191f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean @@ -3,15 +3,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 -import Mathlib.Algebra.Algebra.Subalgebra.Lattice -import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic -import Mathlib.FieldTheory.Relrank -import Mathlib.FieldTheory.LinearDisjoint -import Mathlib.FieldTheory.SeparableClosure -import Mathlib.RingTheory.Ideal.Quotient.Operations -import Mathlib.RingTheory.Unramified.Field -import Mathlib.RingTheory.TensorProduct.Finite + +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 @@ -22,6 +24,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean index cefd3d17f2..2fb5757597 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean @@ -3,17 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import Mathlib.RingTheory.Valuation.Extension -import Mathlib.RingTheory.RamificationInertia.Basic -import Mathlib.NumberTheory.RamificationInertia.Inertia -import Mathlib.NumberTheory.RamificationInertia.Ramification -import Mathlib.LinearAlgebra.FiniteDimensional.Basic -import Mathlib.Algebra.Group.Units.Hom + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean index 85403f89b4..2456a5c630 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index 9427305158..d74411881b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Uniqueness + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean index 87aa376f0a..f8ce4fe7b9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import Mathlib.LinearAlgebra.Dimension.Localization -import Mathlib.RingTheory.RamificationInertia.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean index 44859ac4f2..254e9790e3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean @@ -3,14 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.IntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Defectless -import Mathlib.RingTheory.RamificationInertia.Basic + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index 2d5a935110..fed1921f54 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Degree + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean index 6ec06df702..57313a91fa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core -import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.FiniteExtension.Core +public import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing /-! # Finite Integral Closure -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean index 2070548c44..b600bc447a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic -import Mathlib.RingTheory.Henselian -import Mathlib.RingTheory.Ideal.Quotient.Operations + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean index ba983b38c2..7c84b42eef 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean @@ -3,15 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.AdicPower -import Mathlib.Algebra.Module.Shrink -import Mathlib.RingTheory.AdicCompletion.AsTensorProduct -import Mathlib.RingTheory.AdicCompletion.Noetherian -import Mathlib.RingTheory.Nakayama + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean index 2929474d12..565c3b1abf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import Mathlib.RingTheory.Valuation.Extension + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian +public import Mathlib.RingTheory.Valuation.Extension /-! # Henselian Valuation Extension -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean index dfc07d4019..b6bb4d48b8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -3,19 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite -import Mathlib.RingTheory.DedekindDomain.IntegralClosure -import Mathlib.RingTheory.DiscreteValuationRing.TFAE -import Mathlib.RingTheory.Ideal.GoingUp -import Mathlib.RingTheory.QuasiFinite.Basic -import Mathlib.RingTheory.Spectrum.Prime.Topology -import Mathlib.RingTheory.TensorProduct.Quotient -import Mathlib.RingTheory.Valuation.Integral -import Mathlib.LinearAlgebra.TensorProduct.RightExactness + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean index 113ec43c33..38d5b40bae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean @@ -3,10 +3,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 -import Mathlib.RingTheory.LocalRing.ResidueField.Basic + +public import Mathlib.RingTheory.LocalRing.ResidueField.Basic /-! # Residue Field -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean index fa44d8d0f2..a1eaf11e32 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Extensions /-! # Valuation Extension -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean index 55c1e3deb7..8c0bbb7776 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Basic /-! # Valuation Transport -/ + +@[expose] public section namespace ValuationTheory /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean index ded5ae1118..2d23654eb2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean @@ -3,12 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Henselian -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ResidueField -import Mathlib.Algebra.Polynomial.FieldDivision + +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean index 45bbe93c1a..28c376fe97 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean @@ -3,25 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicExtensionUniqueness -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueAlgebraicExtensions -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean index 9d7dafe527..d36bcfdd9e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicExtensionUniqueness.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.AlgebraicIntegralClosure -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueValuationSubring + +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 @@ -13,6 +15,8 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean index 62946fff1d..eb3adb9f5f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/AlgebraicIntegralClosure.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.SimpleRootFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import Mathlib.Algebra.Polynomial.Lifts -import Mathlib.FieldTheory.IsAlgClosed.AlgebraicClosure -import Mathlib.RingTheory.IntegralClosure.IsIntegral.Basic + +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 @@ -20,6 +22,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean index 47cfe74386..83a0092ff2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension /-! # Complete nonarchimedean absolute values are Henselian @@ -17,6 +19,8 @@ nonarchimedean absolute value. This file records the direct the primitive facto consequence used in the henselianity criterion. -/ +@[expose] public section + noncomputable section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean index 5f34095c68..c87ee3de8b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/CoprimeFactorLifting.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting -import Mathlib.RingTheory.Polynomial.UniversalFactorizationRing + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.EtaleLifting +public import Mathlib.RingTheory.Polynomial.UniversalFactorizationRing /-! # Coprime factor lifting from the simple-root Hensel property @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean index 1126f4178e..494f6f8458 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean @@ -3,29 +3,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 -/ - -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianFinite -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.HenselianValuationExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.HenselLemma -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +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 /-! diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean index 19e4fffa95..adea07a9a0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/EtaleLifting.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting -import Mathlib.RingTheory.Unramified.LocalStructure + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.StandardEtaleLifting +public import Mathlib.RingTheory.Unramified.LocalStructure /-! # Lifting residue points of etale algebras @@ -14,6 +16,8 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean index f31aa19ec0..f263006325 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean @@ -3,21 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Complete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean index d8657a0cdb..2fada2257e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic -import Mathlib.RingTheory.AdicCompletion.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic +public import Mathlib.RingTheory.AdicCompletion.Basic /-! # coefficientwise limit preparation @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean index 08858121bd..5f9593ef3e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.WeakLimits -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.PrincipalLimits + +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 @@ -14,6 +16,8 @@ This file connects the chosen finite-minimum coefficient to the displayed-factor complete-limit theorem. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean index 4e5f6bee64..66abeca77b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean @@ -3,10 +3,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 -import Mathlib.Algebra.Polynomial.Div -import Mathlib.Algebra.Polynomial.Lifts -import Mathlib.RingTheory.LocalRing.ResidueField.Basic + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean index 9f94738b2b..2dad384bb2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.Valuation.ValuationRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers + +public import Mathlib.RingTheory.Valuation.ValuationRing +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers /-! # the finite minimum coefficient @@ -16,6 +18,8 @@ input as choosing one coefficient that divides all coefficients in the finite set. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean index 52c54affa1..d3d894b071 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.PrincipalAdicCompleteness + +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 @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean index caa92d654b..fe07a22cc3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DivisionBounds /-! # degree bounds for the error factors @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean index bab8dfc128..2051e6e61e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic /-! # degree bounds for the division remainder @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean index 77d44c1cdb..eb7f287d7e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Truncation /-! # the power step in Hensel's iteration @@ -15,6 +17,8 @@ factorization error after the update `g ↦ g + π^n p`, `h ↦ h + π^n q`. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean index d4208b624d..c896e21edc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Iteration /-! # finite Hensel prefixes @@ -13,6 +15,8 @@ Hensel construction. Compatible prefixes themselves are assembled once, as HenselFactorizationFinitePrefixState, in the next layer. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean index f44927261c..7a3d51987c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.FiniteApproximation /-! # compatible Hensel prefixes @@ -13,6 +15,8 @@ of compatible prefixes. The completion/limit argument is kept for the next layer. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean index 49af1ec1f5..0bd6f418eb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Step /-! # recursive Hensel iterates @@ -13,6 +15,8 @@ of Hensel's lemma and the coefficientwise adic estimates needed for the later completion argument. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean index 76ae6310e4..1378849612 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits /-! # principal-ideal limit route @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean index 0763f6d38c..5eeb930a26 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.ErrorPowers +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.DegreeBounds /-! # one Hensel iteration step @@ -14,6 +16,8 @@ update into the single step used recursively in the proof of Hensel's lemma. -/ +@[expose] public section + noncomputable section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean index fe32b55d34..0759fd1a79 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Basic /-! # coefficient truncation for the Hensel correction step @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean index 8cf6accb39..2e3fa5d227 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.InfiniteApproximation +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.AdicLimits /-! # maximal-ideal limit from displayed factors @@ -13,6 +15,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean index c7b5e0847d..b3d7f4c3ad 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring -import Mathlib.Algebra.Polynomial.Div + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.ValuationSubring +public import Mathlib.Algebra.Polynomial.Div /-! # reduction input for the coefficient estimate @@ -17,6 +19,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean index 3e1ccec444..0f9ae2635a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.Assembly +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.IrreduciblePolynomialBounds /-! # Hensel obstruction to irreducibility @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean index 5905c209bd..3af69bf16d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Factorization.CoefficientMinimum -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveFactorization -import Mathlib.FieldTheory.Normal.Basic -import Mathlib.RingTheory.Norm.Basic -import Mathlib.RingTheory.Polynomial.Vieta + +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 @@ -19,6 +21,8 @@ reduction is a product of relatively prime monic polynomials has monic factors with exactly those reductions. -/ +@[expose] public section + noncomputable section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean index d6c5b1d170..0b7ad221d7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization /-! # the nonmonic reduction branch @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean index 6dbdf79c94..e179490dde 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.PrimitiveReduction /-! # Primitive irreducible reductions and Hensel factorization @@ -16,6 +18,8 @@ partitions the fraction-field irreducible factors along any coprime residual factorization. -/ +@[expose] public section + noncomputable section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean index 95bbc05668..d9622087c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Core -import Mathlib.RingTheory.Polynomial.GaussLemma -import Mathlib.RingTheory.Polynomial.ContentIdeal + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean index 78618f9149..f9150adfea 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/SimpleRootFactorization.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.CoprimeFactorLifting +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.ValuationExtensionCriterion /-! # From simple-root Hensel lifting to valuation factorization @@ -14,6 +16,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean index 109e91e753..d7334f5aaa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/StandardEtaleLifting.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.Henselian -import Mathlib.RingTheory.Etale.StandardEtale + +public import Mathlib.RingTheory.Henselian +public import Mathlib.RingTheory.Etale.StandardEtale /-! # Lifting points of standard étale algebras @@ -15,6 +17,8 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean index 00bec5ad68..359d38c526 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.NormFormulaExtension -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.AlgebraicExtension.UniqueExtensionCoefficients -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionPrimitive + +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 @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean index e17f15b122..77012cafc6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean @@ -3,10 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization -import Mathlib.GroupTheory.OrderOfElement + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.UniqueExtensionReduction +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.MonicFactorization +public import Mathlib.GroupTheory.OrderOfElement /-! # primitive irreducible reductions @@ -19,6 +21,8 @@ reduction; in the full-degree case the monic normalization has no coprime nonconstant residual factorization. -/ +@[expose] public section + noncomputable section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean index fc55dd7a86..c0ed9efe8f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing -import Mathlib.RingTheory.Polynomial.GaussLemma + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.UniqueRing +public import Mathlib.RingTheory.Polynomial.GaussLemma /-! # reduction of irreducible factors @@ -15,6 +17,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean index 3afb377d37..50cf652c91 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.NonmonicReduction /-! # the factor-lifting criterion @@ -12,6 +14,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean index 8b4e95a751..37f1e4a095 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/LocalRingEquiv.lean @@ -3,10 +3,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 -import Mathlib.NumberTheory.RamificationInertia.Ramification -import Mathlib.RingTheory.LocalRing.Basic -import Mathlib.RingTheory.Valuation.Discrete.IsDiscreteValuationRing + +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 @@ -15,6 +17,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean index 2f28492b33..929680fdda 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean @@ -3,11 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicContractingFixedPoint -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models + +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. -/ + +@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index fa7503366b..7a1029a947 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing + +public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.AdicCompletionInverseLimitRing /-! # Adic unit and higher-unit inverse limits @@ -14,6 +16,8 @@ rings. The underlying adic ring inverse-limit theory lives in `AdicCompletionInverseLimitRing`. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean index 34b38fa305..0440a9fa42 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicComplete -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.CompatibleInverseLimit -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValue.Theory.Core -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Models -import Mathlib.Algebra.Ring.TransferInstance -import Mathlib.Topology.Homeomorph.TransferInstance + +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 @@ -18,6 +20,8 @@ of adically complete rings, complete discrete valuation rings, and their unit groups. -/ +@[expose] public section + noncomputable section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean index e133a18023..9f437df625 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicContractingFixedPoint.lean @@ -3,8 +3,10 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.RingTheory.AdicCompletion.Basic + +public import Mathlib.RingTheory.AdicCompletion.Basic /-! # Fixed points of adically contracting additive maps @@ -18,6 +20,8 @@ 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] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean index f7ef255272..e2dc6d1f0a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/CompatibleInverseLimit.lean @@ -3,9 +3,11 @@ Copyright (c) 2026 n-yamaguchi-0729. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: n-yamaguchi-0729 -/ +module -import Mathlib.Algebra.Ring.Subring.Basic -import Mathlib.Algebra.Ring.Pi + +public import Mathlib.Algebra.Ring.Subring.Basic +public import Mathlib.Algebra.Ring.Pi /-! # Compatible families in inverse systems @@ -17,6 +19,8 @@ transition map. Keeping this construction at the level of `Subring` and 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean index 2c56636858..40d5dd2108 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/Models.lean @@ -3,10 +3,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 -import Mathlib.Topology.Homeomorph.Defs -import Mathlib.Topology.Order -import Mathlib.Topology.WithTopology + +public import Mathlib.Topology.Homeomorph.Defs +public import Mathlib.Topology.Order +public import Mathlib.Topology.WithTopology /-! # Topological API for `WithTopology` @@ -16,6 +18,8 @@ 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean index d6245f6570..28cc84f26f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.ChevalleyExtension -import Mathlib.RingTheory.Valuation.RamificationGroup -import Mathlib.FieldTheory.Normal.Basic + +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean index 7b5cb291ba..27c043e6f3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean @@ -3,13 +3,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 -import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValuationField.Complete -import Mathlib.RingTheory.AdicCompletion.Topology -import Mathlib.Topology.Algebra.Valued.ValuedField + +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 From 613413de61ffbf4ee67a0012362eac5ab49848d0 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 18:40:59 +0000 Subject: [PATCH 19/33] Preserve class field theory module interface repairs --- LeanPool.lean | 3 + LeanPool/ClassFieldTheory.lean | 19 ++++- .../ClassFieldTheory/ClassFieldTheory.lean | 1 - .../AbstractClassFieldTheory.lean | 1 - .../AbstractClassFieldTheory/All.lean | 1 - .../AbstractClassFieldTheory/Degree.lean | 1 - .../AbstractClassFieldTheory/Degree/All.lean | 1 - .../Degree/Fields.lean | 3 +- .../Degree/Frobenius.lean | 9 +- .../Degree/FrobeniusFixedField.lean | 3 +- .../Degree/FrobeniusLift.lean | 3 +- .../Degree/Indices.lean | 15 ++-- .../AbstractClassFieldTheory/Degree/Norm.lean | 3 +- .../Degree/NormConjugation.lean | 3 +- .../Degree/NormLaws.lean | 3 +- .../Degree/PadicCyclicClosure.lean | 3 +- .../Degree/PrimeElements.lean | 3 +- .../ProfiniteIntegerFiniteQuotient.lean | 20 +++-- .../Degree/Valuation.lean | 3 +- .../Degree/ValuationLaws.lean | 3 +- .../AbstractClassFieldTheory/Reciprocity.lean | 1 - .../Reciprocity/All.lean | 1 - .../Reciprocity/ClassField.lean | 3 +- .../Reciprocity/ClassFieldAxiom.lean | 3 +- .../Reciprocity/ClassFieldCandidate.lean | 3 +- .../Reciprocity/Construction.lean | 1 - .../Reciprocity/Construction/All.lean | 1 - .../CanonicalUnramifiedNormQuotient.lean | 3 +- .../ChosenDegreeOneFrobenius.lean | 3 +- .../Construction/CoreFrobeniusNorm.lean | 3 +- .../DoubleCosetOrbitGeometry.lean | 3 +- .../Construction/FiniteFieldUnitMaps.lean | 3 +- .../FiniteIntermediateCompositum.lean | 3 +- .../FiniteIntermediateFieldCompositum.lean | 3 +- .../Construction/FiniteNormQuotient.lean | 3 +- .../FixedTowerUnitCorrection.lean | 3 +- .../Construction/FixedTowerUnitDescent.lean | 3 +- .../FrobeniusClosureCommutation.lean | 3 +- .../Construction/FrobeniusDescent.lean | 3 +- .../Construction/FrobeniusField.lean | 3 +- .../FrobeniusFixedFieldAction.lean | 3 +- .../FrobeniusFixedFieldTower.lean | 3 +- .../FrobeniusPowerFixedField.lean | 3 +- .../FrobeniusQuotientDescent.lean | 3 +- .../Construction/FrobeniusSemigroup.lean | 3 +- .../Construction/InfiniteUnitDescent.lean | 3 +- .../InfiniteUnitNormSubgroup.lean | 3 +- .../Construction/MainFiniteReciprocity.lean | 6 +- .../Construction/MainMultiplicativity.lean | 1 - .../MainMultiplicativity/All.lean | 1 - .../ConjugatePrimeNorm.lean | 3 +- .../MainMultiplicativity/CorrectionSum.lean | 3 +- .../FiniteStageCorrections.lean | 3 +- .../FrobeniusActionRemainder.lean | 3 +- .../FrobeniusPowerSumRelation.lean | 3 +- .../NormClassRelation.lean | 3 +- .../PrimeUnitDifferences.lean | 3 +- .../ReciprocityMapMul.lean | 3 +- .../Construction/MainNaturality.lean | 3 +- .../Construction/MainTransfer.lean | 3 +- .../Construction/MainTransferFrobenius.lean | 3 +- .../MainTransferFrobeniusGeometry.lean | 3 +- .../Construction/NormSubgroup.lean | 3 +- .../Reciprocity/Construction/PrimeChoice.lean | 3 +- .../Construction/ReciprocityDefinition.lean | 3 +- .../Construction/ReciprocityIndependence.lean | 3 +- .../Construction/RelativeNormDoubleCoset.lean | 12 ++- .../Construction/TransferNaturality.lean | 3 +- .../Construction/TransferOrbitClosure.lean | 3 +- .../Construction/UnitCohomologyAxiom.lean | 3 +- .../Reciprocity/Construction/Universal.lean | 3 +- .../Construction/UniversalNormDescent.lean | 3 +- .../Construction/UnramifiedNormQuotient.lean | 3 +- .../Reciprocity/Core.lean | 6 +- .../Reciprocity/CyclicNormQuotient.lean | 3 +- .../Reciprocity/FieldRepresentation.lean | 3 +- .../FiniteAbelianClassification.lean | 3 +- .../FiniteAbelianSubextension.lean | 3 +- .../Reciprocity/FiniteGaloisSubextension.lean | 3 +- .../Reciprocity/IntermediateExtension.lean | 3 +- .../Reciprocity/Main.lean | 6 +- .../MaximalUnramifiedReciprocity.lean | 3 +- .../Reciprocity/MaximalUnramifiedSymbol.lean | 3 +- .../Reciprocity/NormContinuity.lean | 3 +- .../Reciprocity/NormTopology.lean | 3 +- .../NormTopologyCharacterization.lean | 3 +- .../Reciprocity/ProfiniteAPI.lean | 3 +- .../Reciprocity/Reduction.lean | 3 +- .../Reciprocity/Sylow.lean | 3 +- .../Reciprocity/TotallyRamified.lean | 3 +- .../Reciprocity/TotallyRamifiedCase.lean | 1 - .../Reciprocity/TotallyRamifiedCase/All.lean | 1 - .../TotallyRamifiedCase/Conclusion.lean | 3 +- .../TotallyRamifiedCase/FixedSource.lean | 3 +- .../TotallyRamifiedCase/FrobeniusLift.lean | 3 +- .../TotallyRamifiedCase/FrobeniusNorms.lean | 3 +- .../RestrictionCosets.lean | 3 +- .../TotallyRamifiedCase/RestrictionEquiv.lean | 3 +- .../Reciprocity/ValuationContinuity.lean | 3 +- .../ClassFieldTheory/Algebra.lean | 1 - .../Algebra/AbelianGaloisEquiv.lean | 3 +- ...initeAbelianIntermediateFieldAlgEquiv.lean | 3 +- .../IntermediateFieldAlgEquivOrderIso.lean | 3 +- .../AlgebraicNumberTheory.lean | 1 - .../AlgebraicNumberTheory/Adele.lean | 1 - .../AlgebraicNumberTheory/Adele/All.lean | 1 - .../Adele/Coordinates.lean | 3 +- .../Adele/FinitePlaceTensorBlock.lean | 3 +- .../FiniteRestrictedProductBaseChange.lean | 3 +- .../Adele/InfinitePlaceTensorBlock.lean | 3 +- .../Adele/IntegralLocalFactor.lean | 3 +- .../Adele/IntegralTensorSupport.lean | 1 - .../IntegralTensorSupport/AbsoluteValue.lean | 3 +- .../Adele/IntegralTensorSupport/All.lean | 1 - .../FinitePlaceCompletion.lean | 3 +- .../IntegralTensorSupport/IdeleSupport.lean | 3 +- .../Adele/IntegralTensorSupport/Lattice.lean | 3 +- .../LocalTensorDecomposition.lean | 3 +- .../IntegralTensorSupport/Localization.lean | 3 +- .../Adele/LocalComponents.lean | 3 +- .../Adele/RestrictedAction.lean | 3 +- .../Adele/RestrictedProduct.lean | 3 +- .../AdeleBaseChange.lean | 3 +- .../AlgebraicNumberTheory/All.lean | 1 - .../AlgebraicNumberTheory/Completion.lean | 1 - .../Completion/AdicCompletionComparison.lean | 3 +- .../Completion/AdicCompletionMap.lean | 3 +- .../AlgebraicNumberTheory/Completion/All.lean | 1 - .../Completion/ChosenLocalization.lean | 3 +- .../Completion/Comparison.lean | 3 +- .../Completion/ExtensionIndex.lean | 3 +- .../FinitePlaceAdicCompletionCongrEquiv.lean | 3 +- .../Completion/IntegerRingComparison.lean | 3 +- .../Completion/LocalizedValuation.lean | 3 +- .../Completion/UnramifiedComparison.lean | 1 - .../Completion/UnramifiedComparison/All.lean | 1 - .../CompletionToIdeal.lean | 3 +- .../IdealToCompletion.lean | 3 +- .../UnramifiedComparison/LocalNorm.lean | 3 +- .../RamificationIndex.lean | 3 +- .../CompositumEmbedding.lean | 3 +- .../FiniteAbelianCompositum.lean | 3 +- .../AlgebraicNumberTheory/Galois.lean | 1 - .../Galois/AbsoluteAbelianization.lean | 3 +- .../AlgebraicNumberTheory/Galois/All.lean | 1 - .../Galois/CyclicPrimeDegreeSubextension.lean | 3 +- .../Galois/CyclicPrimeSubextension.lean | 3 +- .../Galois/InfiniteBaseChange.lean | 3 +- .../Galois/MathlibAbsoluteAbelianization.lean | 3 +- .../MathlibAbsoluteGaloisBaseEquiv.lean | 3 +- .../Galois/MaximalAbelianSubextension.lean | 3 +- .../Galois/RelativeAbelianization.lean | 3 +- .../AlgebraicNumberTheory/Idele.lean | 1 - .../AlgebraicNumberTheory/Idele/All.lean | 1 - .../Idele/BaseChange.lean | 3 +- .../AlgebraicNumberTheory/Idele/Basic.lean | 3 +- .../Idele/ClassGroup.lean | 1 - .../Idele/ClassGroup/AlgEquiv.lean | 3 +- .../ClassGroup/AlgEquivAdeleTopology.lean | 3 +- .../ClassGroup/AlgEquivFiniteIntegral.lean | 3 +- .../AlgEquivIdeleClassTopology.lean | 3 +- .../Idele/ClassGroup/AlgEquivTopology.lean | 3 +- .../Idele/ClassGroup/All.lean | 1 - .../Idele/ClassGroup/BaseChange.lean | 3 +- .../ConnectedComponentQuotientCongr.lean | 3 +- .../Idele/ClassGroup/Core.lean | 3 +- .../Idele/ClassGroup/InfiniteAlgEquiv.lean | 3 +- .../Idele/ClassGroup/MathlibComparison.lean | 3 +- .../ClassGroup/MathlibTopologyComparison.lean | 3 +- .../Idele/ClassGroup/NormComparison.lean | 3 +- .../Idele/ClassGroup/NormalClosureNorm.lean | 3 +- .../Idele/ClassGroup/Tower.lean | 3 +- .../ClassGroup/TowerAlgEquivNaturality.lean | 3 +- .../Idele/ClassGroup/TowerBaseChange.lean | 3 +- .../Idele/Cohomology.lean | 1 - .../Idele/Cohomology/All.lean | 1 - .../Idele/Cohomology/Decomposition.lean | 3 +- .../Idele/Cohomology/Herbrand.lean | 3 +- .../Cohomology/HerbrandExactSequence.lean | 3 +- .../Idele/Cohomology/SPlaces.lean | 1 - .../Idele/Cohomology/SPlaces/All.lean | 1 - .../Idele/Cohomology/SPlaces/Herbrand.lean | 1 - .../Cohomology/SPlaces/Herbrand/All.lean | 1 - .../Cohomology/SPlaces/Herbrand/Factors.lean | 3 +- .../SPlaces/Herbrand/FamilyCardinality.lean | 3 +- .../SPlaces/Herbrand/FamilyFinite.lean | 3 +- .../Cohomology/SPlaces/Herbrand/Local.lean | 3 +- .../Idele/Cohomology/SPlaces/LocalBlocks.lean | 3 +- .../SPlaces/OutsideIntegralInduced.lean | 1 - .../SPlaces/OutsideIntegralInduced/All.lean | 1 - .../OutsideIntegralInduced/ChosenPlace.lean | 3 +- .../ChosenPlaceAction.lean | 3 +- .../ChosenPlaceIntegralBlock.lean | 3 +- .../ChosenPlaceIntegralBlockEquiv.lean | 3 +- .../ChosenPlaceIntegralBlockEquivApply.lean | 3 +- .../ChosenPlaceIntegralBlockInclusion.lean | 3 +- .../ChosenPlaceIntegralBlockInducedSmul.lean | 3 +- .../ChosenPlaceIntegralBlockTensorSmul.lean | 3 +- .../CompletionTransport.lean | 3 +- .../LocalInduction.lean | 1 - .../LocalInduction/Action.lean | 3 +- .../LocalInduction/All.lean | 1 - .../LocalInduction/Equiv.lean | 3 +- .../LocalInduction/Inclusion.lean | 3 +- .../LocalInduction/Spine.lean | 3 +- .../Cohomology/SPlaces/Reassociation.lean | 3 +- .../Idele/Cohomology/SupportedBridge.lean | 3 +- .../Idele/Extension.lean | 1 - .../Idele/Extension/All.lean | 1 - .../Idele/Extension/BaseChange.lean | 3 +- .../Idele/Extension/ClassGroup.lean | 3 +- .../Idele/Extension/EmbeddingNorm.lean | 3 +- .../Idele/Extension/GaloisDescent.lean | 3 +- .../Idele/Extension/GaloisNorm.lean | 3 +- .../Idele/Extension/IdealClass.lean | 3 +- .../Idele/Extension/IdeleClassBaseChange.lean | 3 +- .../Idele/Extension/IdeleNorm.lean | 3 +- .../Idele/Extension/IdeleNormComponents.lean | 3 +- .../Extension/InfiniteOnePlaceBaseNorm.lean | 3 +- .../Idele/Extension/LocalComponent.lean | 3 +- .../Idele/Extension/LocalNorm.lean | 3 +- .../Idele/Extension/NormLocalOrder.lean | 3 +- .../Idele/Extension/NormProperties.lean | 3 +- .../Idele/Extension/OnePlaceBaseNorm.lean | 3 +- .../FiniteMathlibTopologyComparison.lean | 3 +- .../Idele/FinitePrime.lean | 3 +- .../AlgebraicNumberTheory/Idele/IdealMap.lean | 3 +- .../Idele/IdentityComponent.lean | 3 +- .../Idele/LocallyCompact.lean | 3 +- .../AlgebraicNumberTheory/Idele/Norm.lean | 3 +- .../Idele/NormApproximation.lean | 1 - .../Idele/NormApproximation/All.lean | 1 - .../Idele/NormApproximation/FinitePlaces.lean | 3 +- .../NormApproximation/InfinitePlaces.lean | 3 +- .../AlgebraicNumberTheory/Idele/NormCore.lean | 3 +- .../Idele/NormOneCompact.lean | 3 +- .../Idele/NormTopology.lean | 1 - .../Idele/NormTopology/All.lean | 1 - .../Idele/NormTopology/ArchimedeanNorm.lean | 3 +- .../Idele/NormTopology/Continuity.lean | 3 +- .../Idele/NormTopology/ExtensionBehavior.lean | 3 +- .../NormTopology/FiniteNormArithmetic.lean | 3 +- .../Idele/NormTopology/IdeleClassNorm.lean | 3 +- .../Idele/NormTopology/NormOne.lean | 3 +- .../Idele/PositiveArchimedeanSection.lean | 3 +- .../Idele/Principal.lean | 3 +- .../Idele/PrincipalCore.lean | 3 +- .../Idele/PrincipalNorm.lean | 3 +- .../Idele/PrincipalTopology.lean | 3 +- .../AlgebraicNumberTheory/Idele/Relative.lean | 1 - .../Idele/Relative/All.lean | 1 - .../Relative/FiniteIntegralNormPreimage.lean | 3 +- .../Idele/Relative/FinitePlaceTensorNorm.lean | 3 +- .../Relative/InfinitePlaceTensorNorm.lean | 3 +- .../Idele/Relative/SPlaces.lean | 3 +- .../Idele/Relative/Support.lean | 3 +- .../Idele/RestrictedProductUnitsTopology.lean | 83 ++++++++++--------- .../AlgebraicNumberTheory/Idele/SPlaces.lean | 3 +- .../Idele/SinglePlace.lean | 3 +- .../Idele/SufficientlyLarge.lean | 3 +- .../AlgebraicNumberTheory/Idele/Topology.lean | 3 +- .../AlgebraicNumberTheory/NormalClosure.lean | 3 +- .../AlgebraicNumberTheory/NumberField.lean | 1 - .../NumberField/All.lean | 1 - .../FiniteUnramifiedEtaleBridge.lean | 3 +- .../NumberField/FiniteUnramifiedTower.lean | 3 +- .../NumberField/GaloisDifferentBound.lean | 3 +- .../NumberField/PlaceEquiv.lean | 3 +- .../SupportedDiscriminantBound.lean | 3 +- .../NumberField/TameDifferentTrace.lean | 3 +- .../PowerResidueSymbols.lean | 1 - .../PowerResidueSymbols/All.lean | 1 - .../PowerResidueSymbols/Ideal.lean | 3 +- .../AlgebraicNumberTheory/Ramification.lean | 1 - .../Ramification/All.lean | 1 - .../Ramification/DegreeFromChosenPrimes.lean | 3 +- .../Ramification/DegreeProduct.lean | 3 +- .../Ramification/FiniteRamifiedPrimes.lean | 3 +- .../Ramification/RationalPrime.lean | 3 +- .../Ramification/Splitting.lean | 1 - .../Ramification/Splitting/All.lean | 1 - .../Ramification/Splitting/FinitePlace.lean | 3 +- .../Splitting/FinitePlaceIdeal.lean | 3 +- .../Ramification/Splitting/NormalClosure.lean | 3 +- .../Splitting/PrimeOrderFixedField.lean | 3 +- .../Ramification/UnramifiedRationals.lean | 3 +- .../AlgebraicNumberTheory/RayClass.lean | 1 - .../AlgebraicNumberTheory/RayClass/All.lean | 1 - .../RayClass/Approximation.lean | 3 +- .../AlgebraicNumberTheory/RayClass/Basic.lean | 3 +- .../RayClass/FullModulus.lean | 3 +- .../AlgebraicNumberTheory/RayClass/Ideal.lean | 3 +- .../RayClass/IdealNorm.lean | 3 +- .../RayClass/LocalConductor.lean | 3 +- .../RayClass/Narrow.lean | 3 +- .../OrdinaryClassGroupComparison.lean | 10 ++- .../RayClass/PrimeGeneration.lean | 3 +- .../RayClass/PublicHigherUnitComparison.lean | 3 +- .../RayClass/Rational.lean | 3 +- .../RayClass/Topology.lean | 3 +- .../AlgebraicNumberTheory/SUnit.lean | 1 - .../AlgebraicNumberTheory/SUnit/All.lean | 1 - .../SUnit/GaloisAction.lean | 3 +- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 3 +- .../SUnit/LogLattice.lean | 11 ++- .../AlgebraicNumberTheory/SUnit/Rank.lean | 3 +- .../SeparableClosureEmbedding.lean | 3 +- .../AlgebraicNumberTheory/TensorProduct.lean | 3 +- .../ClassFieldTheory/All.lean | 1 - .../ClassFieldTheory/Definitions.lean | 1 - .../ClassFieldTheory/Definitions/All.lean | 1 - .../ConductorsAndRayClassFields.lean | 1 - .../ConductorsAndRayClassFields/All.lean | 1 - .../FractionalIdealNorm.lean | 3 +- .../FractionalIdealNormExponentMap.lean | 3 +- .../IsRayCongruent.lean | 3 +- .../NarrowClassGroup.lean | 3 +- .../NarrowRayClassModulus.lean | 3 +- .../ConductorsAndRayClassFields/RayArtin.lean | 3 +- .../RayClassIdealModulusProjection.lean | 7 +- .../RayClassIdealNorm.lean | 3 +- .../RayClassModulus.lean | 3 +- .../RayClassOfFinitePrime.lean | 5 +- .../RayClassSubgroupQuotientEquiv.lean | 3 +- .../RayLocalHigherUnitGroup.lean | 3 +- .../FrobeniusAndHilbertClassFields.lean | 1 - .../FrobeniusAndHilbertClassFields/All.lean | 1 - .../ArithmeticFrobeniusAt.lean | 3 +- .../FinitePrimeFractionalIdeal.lean | 3 +- ...mberFieldFractionalIdealFactorization.lean | 3 +- .../Definitions/GlobalClassFieldTheory.lean | 1 - .../GlobalClassFieldTheory/All.lean | 1 - .../FiniteAbelianExtension.lean | 3 +- ...FiniteAbelianReciprocityQuotientEquiv.lean | 3 +- .../FinitePlaceTensorNormSubgroup.lean | 3 +- .../Definitions/HasseArf.lean | 1 - .../Definitions/HasseArf/All.lean | 1 - .../HasseArf/HerbrandFunction.lean | 3 +- .../HerbrandFunctionAtLowerIndex.lean | 3 +- .../HasseArf/InverseHerbrandFunction.lean | 3 +- .../HasseArf/IsUpperRamificationJump.lean | 3 +- .../HasseArf/LowerRamificationGroup.lean | 3 +- .../HasseArf/RealLowerRamificationGroup.lean | 3 +- .../HasseArf/UpperRamificationGroup.lean | 3 +- .../Definitions/HilbertSymbols.lean | 1 - .../Definitions/HilbertSymbols/All.lean | 1 - .../GlobalHilbertPairingFiniteFactor.lean | 3 +- .../GlobalInfinitePlaceHilbertSymbol.lean | 3 +- .../KummerAlgebraNormSubgroup.lean | 3 +- .../Definitions/LocalClassFieldTheory.lean | 1 - .../LocalClassFieldTheory/All.lean | 1 - .../LocalClassFieldTheory/FieldNormHom.lean | 3 +- .../FieldNormQuotient.lean | 3 +- .../FieldNormSubgroup.lean | 3 +- .../FiniteAbelianLocalExtension.lean | 3 +- .../LocalClassFieldTheory/IsFieldNorm.lean | 3 +- .../Definitions/NormTheorems.lean | 1 - .../Definitions/NormTheorems/All.lean | 1 - .../GlobalClassFieldTheory.lean | 1 - .../GlobalClassFieldTheory/All.lean | 1 - .../ClassFieldAxiom.lean | 1 - .../ClassFieldAxiom/All.lean | 1 - .../CyclicIdeleClassNormIndex.lean | 3 +- .../ClassFieldAxiom/HasseNormPrinciple.lean | 3 +- .../ClassFieldAxiom/IdeleClassFormation.lean | 3 +- .../IdeleClassPowerLocalUnitQuotient.lean | 1 - .../IdeleClassPowerLocalUnitQuotient/All.lean | 1 - .../ArchimedeanPowerIndex.lean | 3 +- .../FinitePlaceCompletionInstances.lean | 3 +- .../FinitePlacePowerIndex.lean | 3 +- .../LocalResidueArithmetic.lean | 3 +- .../NormContainment.lean | 3 +- .../PrimePowerKummerIndex.lean | 3 +- .../SupportedIdeleIndex.lean | 3 +- .../SupportedPrincipalQuotient.lean | 3 +- .../IdelePowerLocalUnitNormContainment.lean | 3 +- .../IdelePowerLocalUnitSubgroup.lean | 3 +- .../KummerLocalNormContainment.lean | 3 +- .../ClassFieldAxiom/MathlibNormInterface.lean | 3 +- .../SUnitKummerPrimeSelection.lean | 1 - .../SUnitKummerPrimeSelection/All.lean | 1 - .../BasePlaceSelection.lean | 3 +- .../SUnitKummerPrimeSelection/Conclusion.lean | 3 +- .../CoordinatePlaces.lean | 3 +- .../DecompositionFields.lean | 3 +- .../FinitePlaceDecomposition.lean | 3 +- .../SUnitKummerPrimeSelection/PrimeSet.lean | 3 +- .../RestrictionKernel.lean | 3 +- .../ClassFieldAxiom/SUnitLocalPowerMap.lean | 3 +- .../SupportedIdelePowerLocalUnitQuotient.lean | 3 +- .../GlobalClassFieldTheory/Cohomology.lean | 1 - .../Cohomology/All.lean | 1 - .../CofinitelySplitFiniteExtension.lean | 3 +- .../CyclicPrimePowerFullDecomposition.lean | 3 +- .../IdeleClassHerbrandSupportedFinal.lean | 3 +- .../GlobalClassFields.lean | 1 - .../AbelianConductorExactness.lean | 3 +- .../AbelianConductorRamification.lean | 3 +- .../AbelianLocalConductorComparison.lean | 3 +- .../AbelianNormConductor.lean | 3 +- .../GlobalClassFields/All.lean | 1 - .../ArithmeticClassFieldCorrespondence.lean | 3 +- ...rithmeticHilbertClassFieldReciprocity.lean | 3 +- .../ArithmeticRayClassFieldReciprocity.lean | 3 +- .../ArithmeticUnramifiedPrimeArtin.lean | 3 +- .../BigHilbertClassField.lean | 3 +- .../BigHilbertClassFieldMathlibArtin.lean | 3 +- .../BigHilbertClassFieldNaturality.lean | 3 +- .../BigHilbertClassFieldOverOriginalBase.lean | 3 +- .../ClassFieldRealization.lean | 3 +- ...osedFiniteIndexClassFieldConstruction.lean | 3 +- .../ClosedFiniteIndexClassFieldNormRange.lean | 3 +- ...sedFiniteIndexClassFieldOriginalField.lean | 3 +- ...losedFiniteIndexClassFieldReciprocity.lean | 1 - .../Algebraic.lean | 1 - .../Algebraic/All.lean | 1 - .../Algebraic/Construction.lean | 3 +- .../Algebraic/Evaluation.lean | 3 +- .../All.lean | 1 - .../Degree.lean | 3 +- .../GlobalNormResidue.lean | 3 +- .../Topological.lean | 1 - .../Topological/All.lean | 1 - .../Topological/Construction.lean | 3 +- .../Topological/Evaluation.lean | 3 +- .../Topological/EvaluationCore.lean | 3 +- .../Topological/EvaluationValue.lean | 3 +- .../Topological/QuotientTransport.lean | 3 +- .../GlobalClassFields/Conductor.lean | 3 +- .../GlobalClassFields/ConductorFrobenius.lean | 3 +- .../ConductorInfinitePart.lean | 3 +- .../GlobalClassFields/ConductorLattice.lean | 3 +- .../ConductorLocalComparison.lean | 3 +- .../ConductorPrimeArtin.lean | 3 +- .../ConductorRayClassMaximality.lean | 3 +- .../GlobalClassFields/ConductorSupport.lean | 3 +- .../CyclicConductorUniqueness.lean | 3 +- .../CyclicNormConductor.lean | 3 +- .../GlobalClassFields/CyclicNormTower.lean | 3 +- .../CyclicRayClassMaximality.lean | 3 +- .../CyclotomicKummerNormDescent.lean | 3 +- .../EmbeddedAbelianSubextension.lean | 3 +- .../FiniteAbelianClassFieldContainment.lean | 3 +- ...FiniteAbelianClassFieldCorrespondence.lean | 3 +- ...elianClassFieldCorrespondenceTopology.lean | 3 +- .../FiniteIndexNormClassField.lean | 3 +- .../FinitePlaceArtinQuotient.lean | 3 +- .../FullConductorRayClassField.lean | 3 +- .../HilbertClassFieldComparison.lean | 3 +- .../HilbertClassFieldMaximalSubextension.lean | 3 +- .../HilbertClassFieldMaximality.lean | 3 +- .../HilbertClassFieldPrimeSplitting.lean | 3 +- .../HilbertClassFieldRealization.lean | 3 +- .../HilbertClassFieldReciprocity.lean | 1 - .../HilbertClassFieldReciprocity/All.lean | 1 - .../BigActual.lean | 3 +- .../BigOriginal.lean | 3 +- .../SmallActual.lean | 3 +- .../SmallOriginal.lean | 3 +- .../Transport.lean | 3 +- ...HilbertClassFieldUnramifiedMaximality.lean | 3 +- .../HilbertNormCharacterization.lean | 3 +- ...finiteAbelianClassFieldCorrespondence.lean | 3 +- .../GlobalClassFields/KummerNormDescent.lean | 3 +- .../MathlibFrobeniusHilbertComparison.lean | 3 +- .../MathlibGlobalReciprocity.lean | 3 +- .../GlobalClassFields/NormConductor.lean | 3 +- .../GlobalClassFields/NormLimitation.lean | 3 +- .../NormRayClassMaximality.lean | 3 +- .../GlobalClassFields/NormTowerConductor.lean | 3 +- .../OrdinaryNormClassField.lean | 3 +- .../PowerCongruenceCore.lean | 3 +- .../PublicIdealArtinKernelComparison.lean | 3 +- .../PublicIdealNormArtinKernel.lean | 3 +- .../PublicIdealNormQuotientComparison.lean | 3 +- .../PublicRayClassComparison.lean | 3 +- .../RationalRayPrimeClass.lean | 3 +- .../RayClassFieldRealization.lean | 3 +- .../RayClassModulusProjection.lean | 3 +- .../GlobalClassFields/RayClassPrimeIdele.lean | 3 +- .../RayClassSubgroupFieldAntitone.lean | 3 +- .../RayClassSubgroupPrimeArtin.lean | 3 +- .../RayFrobeniusRigidity.lean | 3 +- .../GlobalClassFields/RayPrimeGeneration.lean | 3 +- .../SUnitKummerNormCore.lean | 3 +- .../SUnitKummerNormRealization.lean | 3 +- .../SmallHilbertClassField.lean | 3 +- .../SmallHilbertClassFieldMathlibArtin.lean | 3 +- ...lHilbertClassFieldMaximalSubextension.lean | 3 +- .../SmallHilbertClassFieldNaturality.lean | 3 +- ...mallHilbertClassFieldOverOriginalBase.lean | 3 +- .../SmallHilbertNormCharacterization.lean | 3 +- .../UnramifiedPrimeArtin.lean | 3 +- .../UnramifiedPrimeNormClass.lean | 3 +- .../IdealClassFieldTheory.lean | 1 - .../AbstractCapitulation.lean | 3 +- .../IdealClassFieldTheory/All.lean | 1 - .../ArithmeticIdealArtin.lean | 3 +- .../ArithmeticIdealDecompositionLaw.lean | 3 +- .../IdealClassFieldTheory/IdealArtinMap.lean | 3 +- .../IdealArtinQuotient.lean | 3 +- .../IdealDecompositionLaw.lean | 3 +- .../IdealClassFieldTheory/IdealFrobenius.lean | 3 +- .../IdealNormArtinExactness.lean | 3 +- .../IdealClassFieldTheory/NormLimitation.lean | 3 +- .../NormLimitationCore.lean | 3 +- .../NormLimitationStatement.lean | 3 +- .../PrincipalIdealTheorem.lean | 3 +- .../PrincipalIdealTower.lean | 3 +- .../PrincipalIdealTransfer.lean | 3 +- .../RationalAbstractExtensionToOrdinary.lean | 3 +- .../RationalFiniteNormTransfer.lean | 1 - .../RationalFiniteNormTransfer/All.lean | 1 - .../Compatibility.lean | 3 +- .../FieldSpine.lean | 3 +- .../FiniteNormClass.lean | 3 +- .../MembershipTypes.lean | 3 +- .../RationalFiniteNormTransfer/Quotient.lean | 3 +- .../Representatives.lean | 3 +- .../ZeroTransport.lean | 3 +- .../RationalFixedFieldBaseChange.lean | 3 +- .../SmallHilbertPrincipalization.lean | 3 +- .../SmallHilbertSplitting.lean | 3 +- .../SmallHilbertTowerConjugation.lean | 3 +- .../SmallHilbertTowerRealization.lean | 3 +- .../SmallHilbertTowerUnramified.lean | 3 +- .../GlobalClassFieldTheory/Reciprocity.lean | 1 - .../AbstractFixedFieldGlobalNormResidue.lean | 3 +- .../Reciprocity/All.lean | 1 - .../Reciprocity/ArithmeticNormalization.lean | 3 +- .../Reciprocity/ComplexificationArtin.lean | 1 - .../ComplexificationArtin/All.lean | 1 - .../InfinitePlaceCompatibility.lean | 3 +- .../InfinitePlaceOverfield.lean | 3 +- .../NumberFieldComplexification.lean | 3 +- .../OverextensionArtin.lean | 3 +- .../RamifiedOverextension.lean | 3 +- .../RationalComplexification.lean | 3 +- .../CyclotomicAbstractFixedFieldArtin.lean | 3 +- .../CyclotomicIdeleClassValuation.lean | 3 +- .../Reciprocity/CyclotomicIdeleValue.lean | 3 +- .../CyclotomicIdeleValueTopology.lean | 3 +- .../CyclotomicNormOneCorrection.lean | 3 +- .../Reciprocity/CyclotomicPrincipalIdele.lean | 3 +- .../CyclotomicTorsionFixedField.lean | 3 +- ...lotomicUnramifiedGeometricRestriction.lean | 3 +- ...micUnramifiedLocalGlobalCompatibility.lean | 3 +- .../CyclotomicUnramifiedRestriction.lean | 3 +- .../Reciprocity/CyclotomicZHatBaseChange.lean | 3 +- .../Reciprocity/FiniteGaloisRealization.lean | 3 +- .../FiniteGaloisRealizationCore.lean | 3 +- .../FiniteGaloisRealizationFinitePlace.lean | 3 +- .../FiniteGaloisRealizationNormQuotient.lean | 3 +- .../FiniteGaloisRealizationSubextension.lean | 3 +- .../Reciprocity/FiniteIdeleArtin.lean | 3 +- .../Reciprocity/FiniteLocalFamily.lean | 3 +- .../FinitePlaceAdicHilbertComparison.lean | 3 +- .../FinitePlaceAdicHilbertProductFormula.lean | 3 +- .../FinitePlaceAdicLocalField.lean | 3 +- .../Reciprocity/FinitePlaceArtin.lean | 1 - .../Reciprocity/FinitePlaceArtin/All.lean | 1 - .../FinitePlaceArtin/Conjugation.lean | 3 +- .../FinitePlaceArtin/Construction.lean | 3 +- .../Reciprocity/FinitePlaceArtin/Core.lean | 3 +- .../CrossLocalRestriction.lean | 3 +- .../FinitePlaceArtin/NormRestriction.lean | 3 +- .../FinitePlaceArtin/TowerRestriction.lean | 3 +- .../UnramifiedNormalization.lean | 3 +- .../FinitePlaceCyclotomicFrobeniusLift.lean | 3 +- .../Reciprocity/GlobalArtin.lean | 3 +- .../Reciprocity/GlobalArtinCompatibility.lean | 3 +- ...GlobalArtinFiniteSupportApproximation.lean | 3 +- .../Reciprocity/GlobalHilbertSymbol.lean | 1 - .../Reciprocity/GlobalHilbertSymbol/All.lean | 1 - .../Reciprocity/GlobalHilbertSymbol/Core.lean | 3 +- .../FinitePlaceCharacterComparison.lean | 3 +- .../FinitePlaceComparison.lean | 3 +- .../FinitePlaceFiniteSupport.lean | 3 +- .../FinitePlaceLocalGlobal.lean | 3 +- .../GlobalHilbertSymbol/InfinitePlace.lean | 3 +- .../InfinitePlaceCharacter.lean | 3 +- .../InfinitePlaceNegative.lean | 3 +- .../InfinitePlaceNegativeRoot.lean | 3 +- .../InfinitePlaceNegativeUnit.lean | 3 +- .../InfinitePlacePositive.lean | 3 +- .../InfinitePlaceRamification.lean | 3 +- .../InfinitePlaceRealComparison.lean | 3 +- .../InfinitePlaceRealSquare.lean | 3 +- .../Reciprocity/GlobalNormResidue.lean | 3 +- .../GlobalNormResidueAbelianization.lean | 3 +- ...alNormResidueAbelianizationNaturality.lean | 3 +- .../GlobalNormResidueNaturality.lean | 3 +- .../Reciprocity/HilbertFamilyAlgEquiv.lean | 3 +- .../HilbertFiniteFactorNaturality.lean | 3 +- .../Reciprocity/HilbertProductFormula.lean | 3 +- .../HilbertProductFormulaAlgEquiv.lean | 3 +- ...eleClassDirectLimitAbstractFixedField.lean | 3 +- .../IdeleClassDirectLimitCore.lean | 3 +- .../IdeleClassDirectLimitExtension.lean | 3 +- .../IdeleClassDirectLimitExtensionAction.lean | 3 +- .../IdeleClassDirectLimitExtensionNorm.lean | 3 +- .../IdeleClassDirectLimitFiniteLevel.lean | 3 +- .../IdeleClassDirectLimitFiniteLevelCore.lean | 3 +- ...leClassDirectLimitFiniteTowerNormCore.lean | 3 +- ...eClassDirectLimitFiniteTowerNormProof.lean | 3 +- ...ssDirectLimitFiniteTowerNormStatement.lean | 3 +- ...deleClassDirectLimitFixedPointDescent.lean | 3 +- ...ClassDirectLimitFixedPointDescentCore.lean | 3 +- .../IdeleClassDirectLimitFixedPoints.lean | 3 +- .../IdeleClassDirectLimitNormQuotient.lean | 3 +- .../Reciprocity/IdeleClassNormTopology.lean | 3 +- .../Reciprocity/InfiniteGlobalArtin.lean | 3 +- .../InfiniteGlobalArtinDescent.lean | 3 +- .../InfiniteGlobalArtinSurjectivity.lean | 3 +- .../InfiniteHilbertFactorNaturality.lean | 3 +- ...InfiniteLocalGlobalArtinCompatibility.lean | 3 +- .../Reciprocity/InfinitePlaceArtin.lean | 3 +- .../IntermediateNormAbelianization.lean | 3 +- .../LocalGlobalArtinCompatibility.lean | 1 - .../LocalGlobalArtinCompatibility/All.lean | 1 - .../Factorization.lean | 3 +- .../FinitePadicAuxiliaryField.lean | 3 +- .../FinitePadicCyclicData.lean | 3 +- .../SeparableClosurePadicLift.lean | 3 +- .../MathlibHilbertProductFormula.lean | 3 +- .../MathlibTopologicalGlobalReciprocity.lean | 3 +- .../MaximalAbelianGlobalArtin.lean | 3 +- .../Reciprocity/MaximalAbelianKernel.lean | 3 +- .../Reciprocity/NormQuotient.lean | 3 +- .../Reciprocity/OnePlaceNormKernel.lean | 3 +- .../Reciprocity/PowerResidueReciprocity.lean | 3 +- .../Reciprocity/ProductFormula.lean | 3 +- .../RationalCyclotomicArithmeticProduct.lean | 3 +- .../RationalCyclotomicCharacterRigidity.lean | 3 +- .../RationalCyclotomicFinitePlace.lean | 3 +- .../RationalCyclotomicFinitePlaceArtin.lean | 3 +- .../RationalCyclotomicLocalization.lean | 3 +- ...ationalCyclotomicPrincipalAwayProduct.lean | 3 +- ...ationalCyclotomicPrincipalPrimeFactor.lean | 3 +- .../RationalCyclotomicPrincipalProduct.lean | 3 +- .../RationalCyclotomicRayNorm.lean | 3 +- .../RationalCyclotomicZHatRigidity.lean | 3 +- .../RationalPrimeFactorization.lean | 3 +- .../RationalPrincipalLocalUnit.lean | 3 +- ...ionalQuadraticPowerResidueReciprocity.lean | 3 +- .../TopologicalGlobalNormResidue.lean | 3 +- ...ogicalGlobalNormResidueAbelianization.lean | 3 +- .../ClassFieldTheory/HasseArf.lean | 3 +- .../ClassFieldTheory/KroneckerWeber.lean | 1 - .../ClassFieldTheory/KroneckerWeber/All.lean | 1 - .../ClassFieldTheory/KroneckerWeber/Core.lean | 3 +- .../KroneckerWeber/Final.lean | 3 +- .../GlobalCompositumCyclotomicTarget.lean | 3 +- .../GlobalCompositumGlobalEmbedding.lean | 3 +- .../GlobalCompositumLeftFactors.lean | 3 +- ...GlobalCompositumLocalizationEmbedding.lean | 3 +- ...GlobalCompositumValuationInertiaBound.lean | 3 +- .../GlobalCompositumValuedEmbedding.lean | 3 +- .../GlobalPadicPrimePowInertiaBound.lean | 3 +- .../LocalCyclotomicEmbedding.lean | 6 +- ...tionalCyclotomicArithmeticReciprocity.lean | 3 +- .../RationalRayClassFieldCyclotomic.lean | 3 +- .../KroneckerWeber/RayClassComparison.lean | 3 +- .../KroneckerWeber/Setup.lean | 3 +- .../UnramifiedCompositumSupport.lean | 3 +- .../ClassFieldTheory/KummerTheory.lean | 1 - .../ClassFieldTheory/KummerTheory/All.lean | 1 - .../KummerTheory/Concrete.lean | 1 - .../KummerTheory/Concrete/All.lean | 1 - .../Concrete/CyclotomicPrimeBaseChange.lean | 3 +- .../Concrete/FinitePlaceDecomposition.lean | 3 +- .../Concrete/SUnitKummerUnramified.lean | 3 +- .../Concrete/SUnitPreparation.lean | 1 - .../Concrete/SUnitPreparation/All.lean | 1 - .../Concrete/SUnitPreparation/Core.lean | 3 +- .../EnlargedSUnitRestriction.lean | 3 +- .../FiniteRadicalSupport.lean | 3 +- .../FullSUnitKummerExtension.lean | 3 +- .../SUnitLocalPowerKernel.lean | 3 +- .../SUnitPreparation/SUnitPowerQuotient.lean | 3 +- .../SimpleExtensionLocalBehavior.lean | 3 +- .../LocalClassFieldTheory.lean | 1 - .../LocalClassFieldTheory/All.lean | 1 - .../LocalClassFieldTheory/ClassFormation.lean | 1 - .../ClassFormation/All.lean | 1 - .../ClassFormation/ArchimedeanHilbert90.lean | 3 +- .../ArchimedeanNormQuotient.lean | 3 +- .../ClassFormation/CohomologyBridge.lean | 15 ++-- .../ClassFormation/FieldUnitsHerbrand.lean | 3 +- .../FilteredLiftingSequence.lean | 3 +- .../ClassFormation/Hilbert90.lean | 3 +- .../ClassFormation/IntegerUnitsHerbrand.lean | 3 +- .../ClassFormation/LocalBlocks.lean | 1 - .../ClassFormation/LocalBlocks/All.lean | 1 - .../ClassFormation/LocalBlocks/Family.lean | 1 - .../LocalBlocks/Family/All.lean | 1 - .../ClassFormation/LocalBlocks/Family/H0.lean | 3 +- .../LocalBlocks/Family/HMinusOne.lean | 3 +- .../LocalBlocks/Family/Instances.lean | 3 +- .../LocalBlocks/FamilyClassAxiom.lean | 3 +- .../ClassFormation/LocalBlocks/Induced.lean | 3 +- .../ClassFormation/LocalBlocks/Tensor.lean | 3 +- .../LocalBlocks/TensorNorm.lean | 3 +- .../LocalizedCompletionCohomology.lean | 1 - .../Algebra.lean | 3 +- .../LocalizedCompletionCohomology/All.lean | 1 - .../Cardinality.lean | 1 - .../Cardinality/All.lean | 1 - .../Cardinality/H0.lean | 3 +- .../Cardinality/HMinusOne.lean | 3 +- .../Cardinality/Quotient.lean | 3 +- .../Cardinality/Trivial.lean | 3 +- .../CompMulEquiv.lean | 3 +- .../LocalizedCompletionCohomology/Finite.lean | 3 +- .../Generator.lean | 3 +- .../HerbrandEquiv.lean | 3 +- .../ClassFormation/Main.lean | 3 +- .../ClassFormation/NormalBasis.lean | 3 +- .../ClassFormation/NormalBasisCohomology.lean | 3 +- .../NormalBasisFiniteQuotient.lean | 3 +- .../NormalBasisGaloisAction.lean | 3 +- .../NormalBasisGradedLifting.lean | 3 +- .../NormalBasisInfiniteProduct.lean | 3 +- .../NormalBasisRecursiveLifting.lean | 3 +- .../ClassFormation/PrincipalUnitGraded.lean | 3 +- .../ClassFormation/Valuation.lean | 3 +- .../ClassFormation/ValuationHerbrand.lean | 3 +- .../ClassFormation/ValueGroupCohomology.lean | 3 +- .../LocalClassFieldTheory/Finite.lean | 1 - .../LocalClassFieldTheory/Finite/All.lean | 1 - .../Finite/Conductor.lean | 3 +- .../Finite/CyclotomicNorm.lean | 1 - .../Finite/CyclotomicNorm/All.lean | 1 - .../Finite/CyclotomicNorm/PrincipalUnits.lean | 3 +- .../CyclotomicNorm/StandardSubgroup.lean | 3 +- .../Finite/CyclotomicNorm/Unramified.lean | 3 +- .../Finite/Existence.lean | 1 - .../Finite/Existence/All.lean | 1 - .../Finite/Existence/CharacteristicZero.lean | 3 +- .../Finite/Existence/Classification.lean | 3 +- .../Existence/CyclotomicKummerDescent.lean | 3 +- .../Finite/Existence/EqualCharacteristic.lean | 3 +- ...qualCharacteristicDominatingExtension.lean | 3 +- .../Existence/FiniteUnramifiedField.lean | 3 +- .../Finite/Existence/KummerNormOpen.lean | 3 +- .../Finite/Existence/LocalAbsoluteData.lean | 3 +- .../LubinTateUniformizerDiagonal.lean | 3 +- .../Existence/MathlibFieldClassification.lean | 3 +- .../Finite/Existence/MaximalKummerNorm.lean | 3 +- .../Existence/NormSubgroupOrderEmbedding.lean | 3 +- .../Existence/NormSubgroupRingEquiv.lean | 3 +- .../Existence/NormSubgroupSurjectivity.lean | 3 +- .../Finite/Existence/OrderReversal.lean | 3 +- .../ShrinkChosenFiniteAbelianFields.lean | 3 +- .../ShrinkChosenFiniteAbelianNorms.lean | 3 +- .../Existence/ShrinkFiniteAbelianFields.lean | 3 +- .../Existence/ShrinkFiniteAbelianNorms.lean | 3 +- .../Existence/ShrinkIntermediateFields.lean | 3 +- .../Existence/ShrinkLocalClassification.lean | 3 +- .../Finite/Existence/ShrinkOpenSubgroups.lean | 3 +- .../Existence/ShrinkSeparableClosure.lean | 3 +- .../StandardDominatingExtension.lean | 3 +- .../Finite/Existence/StandardLubinTate.lean | 3 +- .../StandardSubgroupIntersection.lean | 3 +- .../UnramifiedLubinTateDiagonal.lean | 3 +- .../Existence/UnramifiedNormContainment.lean | 3 +- .../Existence/UnramifiedNormSubgroup.lean | 3 +- .../UnshrinkFiniteAbelianFields.lean | 3 +- .../Finite/LocalReciprocity.lean | 1 - .../AbsoluteUnitsFixedField.lean | 3 +- .../AbstractFixedFieldNorm.lean | 3 +- .../AbstractFixedFieldUnits.lean | 3 +- .../Finite/LocalReciprocity/All.lean | 1 - .../ConcreteReciprocityCanonical.lean | 3 +- .../ConcreteReciprocityPrimeNorm.lean | 3 +- .../ConcreteReciprocityTransport.lean | 3 +- .../ConjugationNaturality.lean | 3 +- .../Finite/LocalReciprocity/Core.lean | 1 - .../Finite/LocalReciprocity/Filtered.lean | 1 - .../Filtered/AbstractUnramified.lean | 3 +- .../Finite/LocalReciprocity/Filtered/All.lean | 1 - .../LocalReciprocity/Filtered/Compositum.lean | 3 +- .../LocalReciprocity/Filtered/Core.lean | 3 +- .../Filtered/EqualCharacteristic.lean | 3 +- ...EqualCharacteristicStandardCompositum.lean | 3 +- .../Filtered/FiniteAbelian.lean | 3 +- .../Filtered/InertiaUnramifiedExtension.lean | 3 +- .../Filtered/StandardCompositum.lean | 3 +- .../LocalReciprocity/Filtered/Unramified.lean | 3 +- .../FiniteAbelianFamilySubgroupKernel.lean | 3 +- ...niteAbelianFamilyUnramifiedCompositum.lean | 3 +- .../FiniteAbstractFixedField.lean | 3 +- .../FiniteExtensionClassFieldAxiom.lean | 3 +- .../FiniteGaloisRealization.lean | 3 +- .../FiniteResidueFinrankTransfer.lean | 3 +- .../FiniteResidueFrobenius.lean | 9 +- .../FiniteResidueValuationComparison.lean | 3 +- .../FiniteSubgroupResidueDegree.lean | 3 +- .../FixedFieldContinuousNaturality.lean | 3 +- .../FixedFieldIntrinsicReciprocity.lean | 1 - .../FixedFieldIntrinsicReciprocity/All.lean | 1 - .../AmbientNormResidue.lean | 3 +- .../AmbientPrimeComparison.lean | 3 +- .../AmbientPrimeNormTransport.lean | 3 +- .../AmbientPrimeSymbolSetup.lean | 3 +- .../AmbientPrimeTarget.lean | 3 +- .../AmbientPrimeWitness.lean | 9 +- .../AmbientPrimeWitnessComparison.lean | 3 +- .../BaseComparison.lean | 1 - .../BaseComparison/All.lean | 1 - .../EmbeddedExtensionQuotient.lean | 3 +- .../EmbeddedInertiaComparison.lean | 3 +- .../FixedFieldNormQuotient.lean | 3 +- .../FixedFieldSpecialization.lean | 3 +- .../IntrinsicBaseEquivalence.lean | 3 +- .../EmbeddedFrobeniusTransport.lean | 1 - .../EmbeddedFrobeniusTransport/Fields.lean | 3 +- .../EmbeddedFrobeniusTransport/Groups.lean | 3 +- .../IntrinsicFrobeniusArtinComparison.lean | 3 +- .../IntrinsicFrobeniusClosure.lean | 3 +- .../IntrinsicFrobeniusFixedField.lean | 3 +- .../IntrinsicFrobeniusQuotientTransport.lean | 3 +- .../NormRestriction.lean | 3 +- .../PrimeComparison.lean | 3 +- .../LocalReciprocity/FixedFieldLocalData.lean | 3 +- .../FixedFieldNormResidueNaturality.lean | 3 +- .../FixedFieldRelativeNorm.lean | 3 +- .../GaloisExtensionQuotient.lean | 3 +- .../GeneralTowerNaturality.lean | 3 +- .../HenselianValuationBase.lean | 3 +- ...ntermediateFieldNormResidueNaturality.lean | 3 +- .../IntrinsicAbsoluteData.lean | 3 +- .../LocalClassFieldAxiom.lean | 3 +- .../LocalHenselianValuation.lean | 3 +- .../LocalReciprocity/LocalResidueDatum.lean | 3 +- .../Finite/LocalReciprocity/Main.lean | 3 +- .../LocalReciprocity/MathlibInterface.lean | 3 +- .../Finite/LocalReciprocity/NormResidue.lean | 3 +- .../NormResidueNaturality.lean | 3 +- .../ResidueAbsoluteDegree.lean | 3 +- .../ResidueAbsoluteFrobenius.lean | 3 +- .../LocalReciprocity/ResidueActionIndex.lean | 3 +- .../ResidueAlgebraicClosureDegree.lean | 3 +- .../ResidueAlgebraicallyClosed.lean | 3 +- .../Finite/LocalReciprocity/ResidueDatum.lean | 3 +- .../SemilinearNaturality.lean | 3 +- .../SeparableFixedFieldNorm.lean | 3 +- .../SeparableNormProduct.lean | 3 +- .../LocalReciprocity/SeparableUnitsNorm.lean | 3 +- .../LocalReciprocity/TateTransport.lean | 3 +- .../TopologicalReciprocity.lean | 3 +- .../UnramifiedComparison.lean | 3 +- .../UnramifiedNormComparison.lean | 3 +- .../UnramifiedNormalization.lean | 3 +- .../UnramifiedReciprocity.lean | 3 +- .../UnramifiedResidueUniqueness.lean | 3 +- .../LocalReciprocity/ValuationSemilinear.lean | 3 +- .../Finite/Unramified.lean | 1 - .../Finite/Unramified/All.lean | 1 - .../Finite/Unramified/Cohomology.lean | 3 +- .../Finite/Unramified/Norm.lean | 3 +- .../Finite/Unramified/PrincipalUnits.lean | 1 - .../Finite/Unramified/PrincipalUnits/All.lean | 1 - .../Unramified/PrincipalUnits/Basic.lean | 3 +- .../Unramified/PrincipalUnits/Lift.lean | 3 +- .../Unramified/PrincipalUnits/NormSide.lean | 3 +- .../Unramified/PrincipalUnits/Trace.lean | 3 +- .../Finite/Unramified/ResidueNorm.lean | 3 +- .../Finite/Unramified/Uniformizer.lean | 3 +- .../Finite/UnramifiedConductor.lean | 3 +- .../LocalClassFieldTheory/Infinite.lean | 1 - .../Infinite/AbsoluteArtin.lean | 3 +- .../Infinite/AbsoluteArtinRestriction.lean | 3 +- .../AbsoluteFiniteQuotientTransitions.lean | 3 +- .../Infinite/AbsoluteFiniteQuotients.lean | 3 +- .../AbsoluteGaloisAbelianization.lean | 3 +- ...AbstractProfiniteCompletionComparison.lean | 5 +- .../LocalClassFieldTheory/Infinite/All.lean | 1 - .../FiniteAbelianQuotientKernels.lean | 3 +- .../Infinite/FiniteReciprocityDiagram.lean | 3 +- .../LocalMultiplicativeCompletion.lean | 3 +- .../Infinite/ProfiniteCompletion.lean | 5 +- .../Infinite/ProfiniteCompletionCriteria.lean | 3 +- .../Infinite/ProfiniteLocalReciprocity.lean | 3 +- .../TopologicalAbelianizationCongr.lean | 15 ++-- .../LocalClassFieldTheory/Kummer.lean | 1 - .../LocalClassFieldTheory/Kummer/All.lean | 1 - .../Kummer/CanonicalKummerNorm.lean | 3 +- .../Kummer/KummerExponentTower.lean | 3 +- .../Kummer/KummerNormPowerClassDegree.lean | 3 +- .../LocalHilbertExponentCompatibility.lean | 3 +- .../Kummer/LocalHilbertPairing.lean | 3 +- .../LocalHilbertPairingNondegeneracy.lean | 3 +- .../Kummer/LocalHilbertSymbol.lean | 3 +- .../Kummer/LocalHilbertSymbolLaws.lean | 3 +- .../Kummer/MathlibHilbertPairing.lean | 3 +- .../Kummer/MaximalLocalKummerPairing.lean | 3 +- .../Kummer/PowerResidueTameFormula.lean | 3 +- .../Kummer/SmallHilbertPairingTransport.lean | 3 +- .../LubinTateApplication.lean | 1 - .../LubinTateApplication/All.lean | 1 - ...lCharacteristicRealFilteredComparison.lean | 3 +- ...racteristicTransportedArtinComparison.lean | 3 +- ...risticTransportedFixedFieldComparison.lean | 3 +- ...alCharacteristicTransportedLevelTower.lean | 3 +- ...sticTransportedRealFilteredComparison.lean | 3 +- ...cteristicTransportedUpperRamification.lean | 3 +- ...acteristicTransportedUpperRestriction.lean | 3 +- .../EqualCharacteristicUpperFiltration.lean | 3 +- .../LaurentPrincipalUnitTransport.lean | 3 +- .../LubinTateTransport.lean | 3 +- .../LubinTateApplication/NormIndex.lean | 3 +- .../LubinTateApplication/NormSubgroup.lean | 3 +- .../PadicMultiplicativeArtinComparison.lean | 3 +- .../StandardArtinComparison.lean | 3 +- .../StandardFilteredArtinComparison.lean | 3 +- .../StandardFixedFieldComparison.lean | 3 +- .../StandardNormIndex.lean | 3 +- .../StandardNormSubgroupExact.lean | 3 +- .../StandardSubgroupIndex.lean | 3 +- .../TransportedNormSubgroupExact.lean | 3 +- .../ClassFieldTheory/LocalFieldTheory.lean | 1 - .../LocalFieldTheory/All.lean | 1 - .../LocalFieldTheory/Padic.lean | 1 - .../LocalFieldTheory/Padic/All.lean | 1 - .../LocalFieldTheory/Padic/Cyclotomic.lean | 1 - .../Padic/Cyclotomic/All.lean | 1 - .../Padic/Cyclotomic/Unramified.lean | 1 - .../Padic/Cyclotomic/Unramified/All.lean | 1 - .../Unramified/CanonicalExtension.lean | 3 +- .../ClassFieldTheory/LubinTate.lean | 1 - .../ClassFieldTheory/LubinTate/All.lean | 1 - .../LubinTate/EqualCharacteristic.lean | 1 - .../LubinTate/EqualCharacteristic/All.lean | 1 - .../EqualCharacteristic/CompletedLevel.lean | 1 - .../CompletedLevel/All.lean | 1 - .../CompletedLevel/ChangedCompletedLevel.lean | 3 +- .../ChangedCompletedPrimitiveAction.lean | 3 +- .../ChangedPolynomialEvaluation.lean | 3 +- .../CompletedLevel/ChangedUniformizer.lean | 3 +- .../ChangedUniformizerNormalization.lean | 3 +- .../CompletedFrobeniusBaseEquiv.lean | 3 +- .../CompletedFrobeniusContinuity.lean | 3 +- .../CompletedFrobeniusFixedField.lean | 3 +- .../CompletedFrobeniusFixedFieldAlgebra.lean | 3 +- ...FrobeniusFixedFieldCoefficientDescent.lean | 3 +- .../CompletedFrobeniusFixedFieldDegree.lean | 3 +- ...ompletedFrobeniusFixedFieldGeneration.lean | 3 +- ...ompletedFrobeniusFixedFieldPowerBasis.lean | 3 +- ...CompletedFrobeniusFixedFieldPrimitive.lean | 3 +- .../CompletedFrobeniusFixedNorm.lean | 3 +- .../CompletedFrobeniusLift.lean | 3 +- .../CompletedLevel/CompletedLevel.lean | 3 +- .../CompletedPrimitiveAction.lean | 3 +- .../CompletedPrimitiveIrreducible.lean | 3 +- .../DirectBracketAtCompletedLevel.lean | 3 +- .../DirectLubinTateBracket.lean | 3 +- .../DirectLubinTateBracketRecursion.lean | 3 +- .../DirectTargetLevelEmbedding.lean | 3 +- .../DirectThetaAtCompletedLevel.lean | 3 +- .../DirectThetaFirstIdentity.lean | 3 +- .../DirectThetaFrobeniusFixed.lean | 3 +- .../CompletedLevel/DirectThetaIteration.lean | 3 +- .../CompletedLevel/DirectThetaSeries.lean | 3 +- .../CompletedLevel/ThetaAtCompletedLevel.lean | 3 +- .../CompletedLevel/ThetaLocalInverse.lean | 3 +- .../EqualCharacteristic/Existence.lean | 1 - .../EqualCharacteristic/Existence/All.lean | 1 - .../Existence/LaurentLocalField.lean | 3 +- .../Existence/LaurentModel.lean | 3 +- .../LaurentUniformizerNormalization.lean | 3 +- .../EqualCharacteristic/FiniteLevel.lean | 1 - .../EqualCharacteristic/FiniteLevel/All.lean | 1 - .../FiniteLevel/AmbientDivisionTorsion.lean | 3 +- .../FiniteLevel/DivisionPolynomial.lean | 3 +- .../FiniteLevel/FiniteParameters.lean | 3 +- .../FiniteLevel/FreeRankOne.lean | 3 +- .../FiniteLevel/LevelAbelian.lean | 3 +- .../FiniteLevel/LevelAutomorphisms.lean | 3 +- .../FiniteLevel/LevelField.lean | 3 +- .../FiniteLevel/LevelFieldTower.lean | 3 +- .../FiniteLevel/NormUniformizer.lean | 3 +- .../FiniteLevel/PrimitiveAction.lean | 3 +- .../FiniteLevel/PrimitiveIrreducible.lean | 3 +- .../FiniteLevel/PrimitiveTorsion.lean | 3 +- .../FiniteLevel/UnitQuotientGalois.lean | 3 +- .../EqualCharacteristic/FormalModule.lean | 1 - .../EqualCharacteristic/FormalModule/All.lean | 1 - .../FormalModule/AmbientBracketAction.lean | 3 +- .../DivisionModuleEndomorphisms.lean | 3 +- .../FormalModule/LubinTateAction.lean | 3 +- .../FormalModule/LubinTateEndomorphism.lean | 3 +- .../EqualCharacteristic/Frobenius.lean | 1 - .../EqualCharacteristic/Frobenius/All.lean | 1 - .../Frobenius/CoefficientFrobenius.lean | 3 +- .../Frobenius/CompletedUnramifiedField.lean | 3 +- .../Frobenius/ContractingEquation.lean | 3 +- .../Frobenius/LaurentSeriesFrobenius.lean | 9 +- .../EqualCharacteristic/NormSubgroup.lean | 1 - .../EqualCharacteristic/NormSubgroup/All.lean | 1 - .../HigherUnitFixedFieldEmbedding.lean | 3 +- .../HigherUnitFixedFieldEquiv.lean | 3 +- .../HigherUnitFixedFieldMembership.lean | 3 +- .../HigherUnitFixedFieldSurjective.lean | 3 +- .../HigherUnitFrobeniusFixed.lean | 3 +- .../NormSubgroup/HigherUnitLevelMapFixed.lean | 3 +- .../NormSubgroup/HigherUnits.lean | 3 +- .../NormSubgroup/HigherUnitsNorm.lean | 3 +- .../NormSubgroup/LevelAlgebra.lean | 3 +- .../NormSubgroup/StandardSubgroupNorm.lean | 3 +- .../NormSubgroup/UniformizerNorm.lean | 3 +- .../NormSubgroup/UnitQuotientCard.lean | 3 +- .../NormSubgroup/UnitTransport.lean | 3 +- .../EqualCharacteristic/Ramification.lean | 1 - .../EqualCharacteristic/Ramification/All.lean | 1 - .../Ramification/Core.lean | 3 +- .../Ramification/DisplacementValuation.lean | 3 +- .../Ramification/GaloisAction.lean | 3 +- .../Ramification/LowerGroups.lean | 3 +- .../Ramification/PrimitivePoint.lean | 3 +- .../EqualCharacteristic/RealIndexSteps.lean | 3 +- .../LubinTate/EqualCharacteristic/Theta.lean | 1 - .../EqualCharacteristic/Theta/All.lean | 1 - .../Theta/ThetaCoefficients.lean | 3 +- .../Theta/ThetaEvaluation.lean | 3 +- .../Theta/ThetaFirstIdentity.lean | 3 +- .../Theta/ThetaSeries.lean | 3 +- .../Theta/ThetaUniqueness.lean | 3 +- .../LubinTate/FiniteLevel.lean | 1 - .../LubinTate/FiniteLevel/All.lean | 1 - .../FiniteLevel/ChangedLevelCompositum.lean | 3 +- .../ChangedPrimitiveEvaluation.lean | 3 +- .../FiniteLevel/ChangedUniformizer.lean | 3 +- .../FiniteLevel/CompletedEvaluation.lean | 3 +- .../FiniteLevel/CompletedIterates.lean | 3 +- .../FiniteLevel/DivisionPolynomial.lean | 3 +- .../FiniteParameterFiltration.lean | 3 +- .../FiniteLevel/FiniteParameters.lean | 3 +- .../GaloisParameterFiltration.lean | 3 +- .../FiniteLevel/HerbrandFormula.lean | 3 +- .../FiniteLevel/HigherUnitLevelEquiv.lean | 3 +- .../LubinTate/FiniteLevel/LevelAbelian.lean | 3 +- .../FiniteLevel/LevelAutomorphisms.lean | 3 +- .../FiniteLevel/LevelFieldTower.lean | 3 +- .../LubinTate/FiniteLevel/LevelValuation.lean | 3 +- .../FiniteLevel/LocalUpperRamification.lean | 3 +- .../FiniteLevel/LowerRamification.lean | 3 +- .../FiniteLevel/LowerRamificationFormula.lean | 3 +- .../LubinTate/FiniteLevel/NormSubgroup.lean | 3 +- .../FiniteLevel/NormUniformizer.lean | 3 +- .../FiniteLevel/ParameterCongruence.lean | 3 +- .../FiniteLevel/PrimitiveAction.lean | 3 +- .../FiniteLevel/PrimitiveDisplacement.lean | 3 +- .../FiniteLevel/PrimitiveEisenstein.lean | 3 +- .../LubinTate/FiniteLevel/PrimitiveRoot.lean | 3 +- .../FiniteLevel/PrimitiveTorsion.lean | 3 +- .../FiniteLevel/PrimitiveUniformizer.lean | 13 ++- .../FiniteLevel/StandardLocalField.lean | 3 +- .../FiniteLevel/UpperRamification.lean | 3 +- .../LubinTate/FormalModule.lean | 1 - .../LubinTate/FormalModule/All.lean | 1 - .../FormalModule/CoefficientEquation.lean | 3 +- .../FormalModule/DegreeStabilization.lean | 3 +- .../LubinTate/FormalModule/Intertwiner.lean | 3 +- .../LubinTate/FormalModule/LinearTerm.lean | 3 +- .../FormalModule/RecursiveCoefficient.lean | 3 +- .../FormalModule/RecursiveCorrection.lean | 3 +- .../FormalModule/RecursiveIntertwiner.lean | 16 ++-- .../LubinTate/FormalModule/Reduction.lean | 3 +- .../LubinTate/FormalModule/Series.lean | 3 +- .../FormalModule/StandardFormalGroup.lean | 9 +- .../FormalModule/StandardSeries.lean | 3 +- .../ClassFieldTheory/LubinTate/Padic.lean | 1 - .../ClassFieldTheory/LubinTate/Padic/All.lean | 1 - .../Padic/ChangedUniformizerCoefficient.lean | 3 +- .../Padic/ChangedUniformizerIntertwiner.lean | 1 - .../ChangedUniformizerIntertwiner/All.lean | 1 - .../CompletedSeries.lean | 3 +- .../DefectCorrection.lean | 3 +- .../IntertwinerConstruction.lean | 3 +- .../ScalarCompatibility.lean | 3 +- .../ScalarEndomorphisms.lean | 3 +- .../CompletedChangedStandardCompositum.lean | 3 +- .../CompletedChangedStandardFixedField.lean | 3 +- .../CompletedChangedStandardFrobenius.lean | 3 +- .../CompletedChangedStandardResidue.lean | 3 +- .../CompletedChangedStandardUnramified.lean | 3 +- ...CompletedChangedUniformizerFixedField.lean | 3 +- .../CompletedChangedUniformizerPrimitive.lean | 3 +- ...CompletedChangedUniformizerThetaFixed.lean | 3 +- .../Padic/CompletedFrobeniusEvaluation.lean | 3 +- .../Padic/CompletedFrobeniusLift.lean | 3 +- .../LubinTate/Padic/CompletedLevel.lean | 3 +- .../Padic/CompletedPrimitiveAction.lean | 3 +- .../Padic/CompletedPrimitiveIrreducible.lean | 3 +- .../Padic/CompletedPrimitiveUniformizer.lean | 3 +- .../Padic/CompletedResidueFrobenius.lean | 3 +- .../CompletedStandardLevelTransport.lean | 3 +- .../Padic/CompletedUnramifiedField.lean | 3 +- .../CompletedUnramifiedFrobeniusFixed.lean | 3 +- .../Padic/MultiplicativeEvaluation.lean | 1 - .../Padic/MultiplicativeEvaluation/All.lean | 1 - .../CompletedCoefficientEvaluation.lean | 3 +- .../CompletedPrimitivePoint.lean | 3 +- .../CompletedScalarEndomorphism.lean | 3 +- .../Padic/MultiplicativeEvaluation/Core.lean | 3 +- .../FiniteLevelEvaluation.lean | 3 +- .../FiniteLevelPrimitiveRoot.lean | 3 +- .../Padic/MultiplicativeIntertwiner.lean | 3 +- .../LubinTate/Padic/MultiplicativeSeries.lean | 3 +- .../ClassFieldTheory/RamificationTheory.lean | 1 - .../RamificationTheory/All.lean | 1 - .../HilbertRamification.lean | 1 - .../HilbertRamification/All.lean | 1 - .../HilbertRamification/Dedekind.lean | 1 - .../HilbertRamification/Dedekind/All.lean | 1 - .../Dedekind/ChosenInertiaCoverage.lean | 3 +- .../Dedekind/InertiaGeneration.lean | 3 +- .../Dedekind/PadicValuationInertia.lean | 3 +- .../PadicCyclotomicInertiaBound.lean | 3 +- ...PadicCyclotomicRamificationIndexBound.lean | 3 +- .../PadicLocalizationCanonicalValuation.lean | 3 +- .../RamificationIndexComparison.lean | 3 +- .../ClassFieldTheory/Theorems.lean | 1 - .../ClassFieldTheory/Theorems/All.lean | 1 - .../Theorems/ConductorsAndRayClassFields.lean | 1 - ...AbelianConductorFiniteExponentIsLeast.lean | 3 +- .../AbelianConductorFiniteNormCriterion.lean | 3 +- .../AbelianConductorFiniteSupport.lean | 3 +- .../AbelianConductorFiniteUnramified.lean | 3 +- .../AbelianConductorRealRamification.lean | 3 +- .../AbelianConductorTameCriterion.lean | 3 +- .../ConductorsAndRayClassFields/All.lean | 1 - ...EmbedsInEveryRayClassFieldRealization.lean | 3 +- .../EmbedsInRayClassFieldIffConductorLe.lean | 3 +- .../ExistsRayArtinModulusProjection.lean | 3 +- .../FractionalIdealNormPrimeExponent.lean | 3 +- .../IsRayCongruentOfLe.lean | 3 +- ...rowRayClassGroupEquivNarrowClassGroup.lean | 3 +- .../OrdinaryRayClassGroupEquivClassGroup.lean | 3 +- .../RayArtinModulusProjection.lean | 3 +- .../RayClassFieldDegree.lean | 3 +- .../RayClassFieldModulusMonotone.lean | 3 +- .../RayClassFieldPrimeSplitting.lean | 3 +- .../RayClassFieldReciprocity.lean | 3 +- .../RayClassGroupHomExtFinitePrime.lean | 3 +- ...sIdealArtinKerEqNormRangeSupPrincipal.lean | 3 +- .../RayClassIdealModulusProjectionPrime.lean | 3 +- ...ClassIdealModulusProjectionSurjective.lean | 3 +- .../RayClassIdealNormImageEqArtinKer.lean | 3 +- .../RayClassIdealNormImageLeArtinKer.lean | 3 +- .../RayClassSubgroupDegree.lean | 3 +- .../RayClassSubgroupEmbedding.lean | 3 +- .../RayClassSubgroupExistence.lean | 3 +- .../RayClassSubgroupFieldAntitone.lean | 3 +- .../RayClassSubgroupPrimeInertiaDegree.lean | 3 +- .../RayClassSubgroupPrimeSplitting.lean | 3 +- .../RayClassSubgroupQuotient.lean | 3 +- .../RayClassSubgroupQuotientEquivMk.lean | 3 +- .../RayClassSubgroupRealizationEquiv.lean | 3 +- .../RayLocalHigherUnitAntitone.lean | 3 +- .../RayLocalHigherUnitMembership.lean | 3 +- .../RayLocalHigherUnitOneAdd.lean | 3 +- .../RayLocalHigherUnitOpen.lean | 3 +- .../RayLocalHigherUnitZero.lean | 3 +- .../RayPrincipalIdealMembership.lean | 3 +- .../RayPrincipalIdealPrimeTo.lean | 3 +- .../FrobeniusAndHilbertClassFields.lean | 1 - .../FrobeniusAndHilbertClassFields/All.lean | 1 - .../ArithmeticFrobeniusAlgEquivTransport.lean | 3 +- ...eticFrobeniusEqOneIffSplitsCompletely.lean | 3 +- ...ArithmeticFrobeniusIndependentOfPrime.lean | 3 +- .../ArithmeticFrobeniusIsArithmetic.lean | 3 +- .../ArithmeticFrobeniusOrder.lean | 3 +- .../ArithmeticFrobeniusRestrictTower.lean | 3 +- .../BigHilbertClassFieldArtinEquiv.lean | 3 +- .../BigHilbertClassFieldDegree.lean | 3 +- ...HilbertClassFieldNarrowRayRealization.lean | 3 +- .../BigHilbertClassFieldPrimeSplitting.lean | 3 +- ...sFieldPrimeSplittingPositivePrincipal.lean | 3 +- .../BigHilbertClassFieldUnique.lean | 3 +- ...wRayRealizationIsBigHilbertClassField.lean | 3 +- ...ayRealizationIsSmallHilbertClassField.lean | 3 +- .../SmallHilbertClassFieldArtinEquiv.lean | 3 +- .../SmallHilbertClassFieldDegree.lean | 3 +- .../SmallHilbertClassFieldLeBig.lean | 3 +- ...lbertClassFieldOrdinaryRayRealization.lean | 3 +- .../SmallHilbertClassFieldPrimeSplitting.lean | 3 +- ...mallHilbertClassFieldPrincipalization.lean | 3 +- .../SmallHilbertClassFieldUnique.lean | 3 +- ...SmallHilbertClassFieldUniqueUpToEquiv.lean | 3 +- .../Theorems/GlobalClassFieldTheory.lean | 1 - .../Theorems/GlobalClassFieldTheory/All.lean | 1 - .../FiniteAbelianGlobalReciprocity.lean | 3 +- ...initeAbelianGlobalReciprocityQuotient.lean | 3 +- ...niteAbelianReciprocityQuotientEquivMk.lean | 3 +- .../FinitePlaceCompletionLocalArtin.lean | 3 +- .../FinitePlaceLocalGlobalNormKernel.lean | 3 +- .../FinitePlaceRayArtinDecomposition.lean | 3 +- .../FinitePlaceRayArtinLocalValue.lean | 3 +- .../FinitePlaceRayArtinNormKernel.lean | 3 +- .../MaximalAbelianGlobalArtin.lean | 3 +- .../ClassFieldTheory/Theorems/HasseArf.lean | 1 - .../Theorems/HasseArf/All.lean | 1 - .../Theorems/HasseArf/HasseArf.lean | 3 +- .../HasseArf/HerbrandFunctionCanonical.lean | 3 +- ...rbrandFunctionInverseHerbrandFunction.lean | 3 +- .../HasseArf/HerbrandFunctionNat.lean | 3 +- ...verseHerbrandFunctionHerbrandFunction.lean | 3 +- .../LowerRamificationGroupEventuallyBot.lean | 3 +- .../RealLowerRamificationGroupCanonical.lean | 3 +- .../UpperRamificationGroupEventuallyBot.lean | 3 +- .../Theorems/HilbertSymbols.lean | 1 - .../Theorems/HilbertSymbols/All.lean | 1 - .../FinitePlaceHilbertBadSetFinite.lean | 3 +- .../GlobalHilbertPairingFiniteSupport.lean | 3 +- .../GlobalHilbertPairingSupportBound.lean | 3 +- .../HilbertSymbols/HilbertPairingPerfect.lean | 3 +- .../KummerAlgebraCopiesOfSimpleFactor.lean | 3 +- .../KummerAlgebraNormIndex.lean | 3 +- .../KummerAlgebraNormProduct.lean | 3 +- .../KummerAlgebraOneNormSurjective.lean | 3 +- .../KummerAlgebraUniformFactorDegree.lean | 3 +- .../KummerAlgebraUniformFieldFactors.lean | 3 +- .../KummerRadicalDegreeEqPowerClassOrder.lean | 3 +- ...LocalHilbertPairingArtinNormalization.lean | 3 +- ...alHilbertPairingExponentCompatibility.lean | 3 +- .../Theorems/LocalClassFieldTheory.lean | 1 - .../Theorems/LocalClassFieldTheory/All.lean | 1 - .../FieldNormSubgroupRingEquiv.lean | 3 +- .../FieldNormSubgroupTower.lean | 3 +- .../FiniteAbelianLocalExistence.lean | 3 +- .../FiniteAbelianLocalExistenceOrderIso.lean | 3 +- .../FiniteAbelianLocalReciprocity.lean | 3 +- .../FiniteAbelianLocalReciprocityFamily.lean | 3 +- ...lReciprocityFamilyArithmeticFrobenius.lean | 3 +- ...initeAbelianLocalReciprocityFamilyExt.lean | 3 +- ...iprocityFamilyUnramifiedNormalization.lean | 3 +- ...FiniteAbelianLocalReciprocityQuotient.lean | 3 +- ...belianLocalReciprocityQuotientEquivMk.lean | 3 +- ...nLocalReciprocityQuotientEquivOfArtin.lean | 3 +- .../FiniteAbelianLocalReciprocityTower.lean | 3 +- ...anLocalReciprocityUnramifiedFamilyExt.lean | 3 +- ...elianLocalReciprocityUnramifiedHomExt.lean | 3 +- ...calReciprocityUnramifiedNormalization.lean | 3 +- .../MemFieldNormSubgroupIff.lean | 3 +- .../Theorems/NormTheorems.lean | 1 - .../Theorems/NormTheorems/All.lean | 1 - .../CompletionTensorNormDecomposition.lean | 3 +- ...etionTensorNormDecompositionCanonical.lean | 3 +- .../ComplexInfinitePlaceAllNorm.lean | 3 +- .../NormTheorems/InfiniteNormIffPositive.lean | 3 +- .../NegativeOneNotInfiniteNorm.lean | 3 +- .../UnramifiedInfinitePlaceAllNorm.lean | 3 +- .../ClassFieldTheory/GaloisCohomology.lean | 1 - .../GaloisCohomology/Cyclic.lean | 1 - .../Cyclic/GaloisCohomology.lean | 5 +- .../GaloisCohomology/Cyclic/Herbrand.lean | 1 - .../Cyclic/Herbrand/HerbrandFiniteness.lean | 3 +- .../Cyclic/Herbrand/HerbrandLowDegree.lean | 1 - .../Herbrand/HerbrandLowDegree/Basic.lean | 7 +- .../HerbrandLowDegree/BinaryProduct.lean | 3 +- .../HerbrandLowDegree/Cardinality.lean | 3 +- .../Herbrand/HerbrandLowDegree/Core.lean | 3 +- .../HerbrandLowDegree/EquivariantEquiv.lean | 3 +- .../Herbrand/HerbrandLowDegree/Index.lean | 3 +- .../Herbrand/HerbrandLowDegree/Product.lean | 3 +- .../HerbrandLowDegree/TateComparison.lean | 14 ++-- .../Cyclic/Herbrand/Induced.lean | 3 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 6 +- .../Cyclic/Herbrand/Permutation.lean | 1 - .../Cyclic/Herbrand/Permutation/Lattice.lean | 3 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 3 +- .../Cyclic/Herbrand/Permutation/Module.lean | 3 +- .../Cyclic/Herbrand/PrincipalUnits.lean | 1 - .../Herbrand/PrincipalUnits/QuotientReps.lean | 3 +- .../PrincipalUnits/QuotientTower.lean | 3 +- .../Cyclic/Herbrand/Product.lean | 3 +- .../Cyclic/NormKernelVanishing.lean | 3 +- .../Cyclic/TateComparison.lean | 3 +- .../GaloisCohomology/Cyclic/TateH0.lean | 1 - .../Cyclic/TateH0/Invariants.lean | 11 ++- .../GaloisCohomology/Cyclic/TateH0/Main.lean | 3 +- .../Cyclic/TateH0/NormImage.lean | 3 +- .../GaloisCohomology/GroupTheory.lean | 1 - .../GroupTheory/Augmentation.lean | 3 +- .../GaloisCohomology/GroupTheory/Finite.lean | 3 +- .../GroupTheory/Quotient.lean | 3 +- .../GroupTheory/QuotientTower.lean | 3 +- .../GroupTheory/Transfer.lean | 1 - .../Transfer/RelativeAugmentation.lean | 3 +- .../GroupTheory/Transfer/Witt.lean | 3 +- .../GaloisCohomology/Kummer.lean | 1 - .../GaloisCohomology/Kummer/Abstract.lean | 1 - .../Abstract/KummerAbelianAssembly.lean | 3 +- .../Abstract/KummerAbelianCyclicFactors.lean | 3 +- .../Kummer/Abstract/KummerCyclicOperator.lean | 3 +- .../Kummer/Abstract/KummerDelta.lean | 3 +- .../Kummer/Abstract/KummerFixedField.lean | 3 +- .../Kummer/Abstract/KummerGlobalOperator.lean | 3 +- .../GaloisCohomology/Kummer/Concrete.lean | 1 - .../Kummer/Concrete/Cyclotomic.lean | 1 - .../ProfiniteUnitDecomposition.lean | 1 - .../ProfiniteUnitDecomposition/Basic.lean | 3 +- .../CyclotomicQuotient.lean | 3 +- .../Decomposition.lean | 3 +- .../DenseTorsion.lean | 3 +- .../FiniteFree.lean | 3 +- .../FiniteOrder.lean | 3 +- .../FreeCoordinate.lean | 3 +- .../ProfiniteUnitDecomposition/Gather.lean | 3 +- .../ProfiniteUnitDecomposition/Local.lean | 3 +- .../ProfiniteUnitDecomposition/Swap.lean | 3 +- .../TorsionQuotientEquiv.lean | 3 +- .../TorsionQuotientMk.lean | 3 +- .../RationalCyclotomicCharacter.lean | 3 +- .../RationalCyclotomicCharacterEquiv.lean | 3 +- .../Cyclotomic/RationalCyclotomicField.lean | 3 +- .../RationalCyclotomicTorsionField.lean | 3 +- .../Kummer/Concrete/CyclotomicField.lean | 3 +- .../Kummer/Concrete/ExtensionRoundTrip.lean | 3 +- .../Kummer/Concrete/FiniteCharacterEquiv.lean | 3 +- .../Kummer/Concrete/FiniteDualSeparation.lean | 3 +- .../Kummer/Concrete/FiniteGeneration.lean | 3 +- .../Kummer/Concrete/FiniteSupport.lean | 3 +- .../Kummer/Concrete/InfiniteContinuity.lean | 3 +- .../Kummer/Concrete/InfiniteGeneration.lean | 3 +- .../Kummer/Concrete/InfiniteInverse.lean | 3 +- .../Concrete/KummerCorrespondenceFormula.lean | 3 +- .../Concrete/LocalMaximalKummerExtension.lean | 3 +- .../Concrete/LocalUnitKummerUnramified.lean | 3 +- .../Concrete/MaximalKummerSubgroup.lean | 3 +- .../Kummer/Concrete/RadicalExtension.lean | 3 +- .../Kummer/Concrete/RestrictedFinite.lean | 3 +- .../Kummer/Concrete/SUnitPreparation.lean | 1 - .../PrimePowerKernelCoordinates.lean | 3 +- .../Kummer/Concrete/SimpleExtension.lean | 3 +- .../Kummer/Concrete/SimpleExtensionNorm.lean | 3 +- .../GaloisCohomology/ProfiniteIntegers.lean | 1 - .../CyclotomicTorsionQuotient.lean | 3 +- .../ProfiniteIntegers/ProfiniteInteger.lean | 3 +- .../ProfiniteIntegerCore.lean | 23 +++-- .../ProfiniteIntegerPrimeProduct.lean | 3 +- .../ProfiniteIntegerUnits.lean | 3 +- .../GaloisCohomology/Topology.lean | 1 - LeanPool/ClassFieldTheory/ProCGroups.lean | 1 - .../ClassFieldTheory/ValuedFieldTheory.lean | 1 - .../ValuedFieldTheory/LocalField.lean | 1 - .../LocalField/Analytic.lean | 1 - .../Analytic/ContinuousFieldUnitLog.lean | 3 +- .../Analytic/DenominatorValuation.lean | 3 +- .../Analytic/FieldUnitLogExtension.lean | 7 +- .../Analytic/FieldUnitLogUniqueness.lean | 3 +- .../LocalField/Analytic/LogExpAdditivity.lean | 3 +- .../Analytic/LogExpComposition.lean | 3 +- .../LocalField/Analytic/LogExpContinuity.lean | 3 +- .../LocalField/Analytic/LogExpSeries.lean | 1 - .../Analytic/LogExpSeries/ExpConvergence.lean | 3 +- .../Analytic/LogExpSeries/FormalCore.lean | 3 +- .../Analytic/LogExpSeries/FormalCoreBase.lean | 1 - .../FormalCoreBase/BasicFactors.lean | 3 +- .../FormalCoreBase/ChoiceCountSystem.lean | 3 +- .../FormalCoreBase/ChoicePositions.lean | 3 +- .../FormalCoreBase/ExplicitChoiceCounts.lean | 3 +- .../PowerSeriesComposition.lean | 3 +- .../FormalCoreBase/ProductArgument.lean | 3 +- .../Analytic/LogExpSeries/FormalProduct.lean | 3 +- .../Analytic/LogExpSeries/Homomorphisms.lean | 3 +- .../LogExpSeries/InverseEstimates.lean | 3 +- .../Analytic/LogExpSeries/LogConvergence.lean | 3 +- .../LogExpSeries/PrincipalUnitExp.lean | 3 +- .../LogExpSeries/PrincipalUnitLog.lean | 1 - .../LogExpSeries/PrincipalUnitLog/Core.lean | 3 +- .../PrincipalUnitLog/Equivalences.lean | 3 +- .../Analytic/LogExpSeries/SeriesTerms.lean | 3 +- .../Analytic/PrincipalUnitExpLogEquiv.lean | 3 +- .../LocalField/DiscreteValuationField.lean | 1 - .../EqualCharacteristicLaurent.lean | 75 ++++++++--------- .../DiscreteValuationField/FieldNorm.lean | 3 +- .../DiscreteValuationField/FieldNormBase.lean | 3 +- .../FieldNormEquiv.lean | 3 +- .../FieldUnitDecomposition.lean | 3 +- .../FieldUnitFactors.lean | 3 +- .../FieldUnitPowerIndexFormulas.lean | 3 +- .../FieldUnitStructure.lean | 3 +- .../FiniteCoefficientLaurent.lean | 3 +- .../IwasawaIndexing.lean | 3 +- .../IwasawaPrincipalUnits.lean | 6 +- .../MixedCharacteristicQp.lean | 3 +- .../MixedCharacteristicStructure.lean | 1 - .../MixedCharacteristicStructure/Core.lean | 3 +- .../DeepPrincipalUnits.lean | 3 +- .../IntegralLattice.lean | 3 +- .../DiscreteValuationField/Norm.lean | 1 - .../DiscreteValuationField/Norm/Basic.lean | 3 +- .../Norm/Quotients.lean | 6 +- .../NormFiltration.lean | 3 +- .../DiscreteValuationField/PadicField.lean | 7 +- .../PadicLinearOfContinuous.lean | 3 +- .../PadicModuleStructure.lean | 3 +- .../PadicPowerIndex.lean | 3 +- .../PadicValuationComparison.lean | 3 +- .../PolynomialRootProximity.lean | 3 +- .../DiscreteValuationField/PowerIndex.lean | 3 +- ...PrincipalUnitInverseLimitSurjectivity.lean | 3 +- .../PrincipalUnitPadicAction.lean | 1 - .../AdicPadicModule.lean | 3 +- .../AdicProdiscreteComparison.lean | 3 +- .../PrincipalUnitPadicAction/Core.lean | 3 +- .../FiniteQuotientPadicModule.lean | 3 +- .../InverseLimitCore.lean | 3 +- .../InverseLimitTopology.lean | 3 +- .../ProdiscretePadicModule.lean | 3 +- .../QuotientTransition.lean | 3 +- .../TopologyModelTypes.lean | 3 +- .../WithZeroValuationTopology.lean | 3 +- .../PrincipalUnits.lean | 1 - .../PrincipalUnits/AutomorphismTransport.lean | 3 +- .../PrincipalUnits/Core.lean | 3 +- .../PrincipalUnits/Filtration.lean | 3 +- .../PrincipalUnits/ResidueQuotient.lean | 3 +- .../PrincipalUnits/ResidueRoots.lean | 3 +- .../TeichmullerDecomposition.lean | 3 +- .../PrincipalUnits/TeichmullerLift.lean | 3 +- .../RamificationAddVal.lean | 3 +- .../RamificationIdeal.lean | 3 +- .../RamificationInvariants.lean | 3 +- .../ValuationSubringUnits.lean | 1 - .../CompleteRangeRestriction.lean | 3 +- .../CyclicValueGroup.lean | 3 +- .../IntegerValuation.lean | 3 +- .../IntegerValuationUniformizer.lean | 3 +- .../LocalFieldRangeRestriction.lean | 3 +- .../RangeRestrictedTopology.lean | 16 ++-- .../RangeRestriction.lean | 3 +- .../SeriesValuationEstimates.lean | 3 +- .../UniformizerIntegerValuation.lean | 3 +- .../ValuationSubringUnitMap.lean | 3 +- .../ValuedExtensionUnitMap.lean | 3 +- .../DiscreteValuationField/ValueGroup.lean | 3 +- .../WithZeroValuationTopology.lean | 3 +- .../LocalField/GroupTheory.lean | 1 - .../GroupTheory/ContinuousQuotientEquiv.lean | 3 +- .../LocalField/GroupTheory/PowerIndex.lean | 3 +- .../LocalField/NonarchimedeanLocalField.lean | 1 - .../AdditiveEquiv.lean | 3 +- .../NonarchimedeanLocalField/Basic.lean | 3 +- .../FiniteExtensionCompleteDVF.lean | 10 ++- .../FiniteExtensionTopology.lean | 3 +- .../FiniteUnramified.lean | 3 +- .../GaloisIntegerRing.lean | 3 +- .../IdealQuotients.lean | 3 +- .../MultiplicativeDecomposition.lean | 3 +- .../NonarchimedeanLocalField/Norm.lean | 3 +- .../NormContinuity.lean | 3 +- .../NormQuotient.lean | 3 +- .../NormSubgroupFunctoriality.lean | 3 +- .../NormalizedIntegerValuation.lean | 3 +- .../PowerClassFiniteness.lean | 3 +- .../PrincipalUnitActions.lean | 7 +- .../PrincipalUnitQuotients.lean | 3 +- .../PrincipalUnits.lean | 3 +- .../ProfiniteUnits.lean | 3 +- .../ResidueExtension.lean | 3 +- .../ResidueGalois.lean | 3 +- .../ResidueUnits.lean | 3 +- .../SeparableNormValuation.lean | 3 +- .../ShrinkTransport.lean | 3 +- .../NonarchimedeanLocalField/Small.lean | 3 +- .../StandardOpenSubgroups.lean | 3 +- .../UnitTopology.lean | 3 +- .../UnramifiedFrobenius.lean | 9 +- .../NonarchimedeanLocalField/Valuation.lean | 3 +- .../ValuationExactSequence.lean | 3 +- .../ValuativeExtension.lean | 3 +- .../ValuedTopology.lean | 3 +- .../LocalField/NormUnits.lean | 3 +- .../ValuedFieldTheory/LocalField/Padic.lean | 1 - .../LocalField/Padic/Cyclotomic.lean | 1 - .../Padic/Cyclotomic/TotallyRamified.lean | 1 - .../TotallyRamified/EisensteinPolynomial.lean | 3 +- .../TotallyRamified/EisensteinRelation.lean | 3 +- .../Cyclotomic/TotallyRamified/Existence.lean | 3 +- .../TotallyRamified/IntegralClosure.lean | 3 +- .../TotallyRamified/IntegralTranslate.lean | 3 +- .../TotallyRamified/PrimeElement.lean | 3 +- .../TotallyRamified/RamificationIndex.lean | 3 +- .../TotallyRamified/ValuationRingEquiv.lean | 3 +- .../Padic/Cyclotomic/Unramified.lean | 1 - .../Unramified/ArithmeticFrobenius.lean | 3 +- .../Padic/NonarchimedeanLocalField.lean | 3 +- .../LocalField/Padic/PrincipalUnits.lean | 3 +- .../LocalField/Padic/UnitDecomposition.lean | 3 +- .../LocalField/Unramified.lean | 1 - .../LocalField/Unramified/BaseChange.lean | 3 +- .../LocalField/Unramified/BaseChangeCore.lean | 3 +- .../Unramified/BasicInvariants.lean | 3 +- .../LocalField/Unramified/Composition.lean | 3 +- .../LocalField/Unramified/Definitions.lean | 3 +- .../LocalField/Unramified/FiniteSupport.lean | 3 +- .../Unramified/HenselReduction.lean | 3 +- .../HenselianAlgebraicExtension.lean | 3 +- .../LocalField/Unramified/MaximalResidue.lean | 3 +- .../Unramified/MaximalSubextension.lean | 3 +- .../Unramified/RamificationIndexTower.lean | 3 +- .../Unramified/ResidueEmbedding.lean | 3 +- .../LocalField/Unramified/ResidueLifting.lean | 3 +- .../LocalField/Unramified/Separable.lean | 3 +- .../ValuedFieldTheory/Ramification.lean | 1 - .../Ramification/ClosedSubgroups.lean | 3 +- .../Ramification/Different.lean | 3 +- .../Ramification/Filtration.lean | 3 +- .../Ramification/GaloisValuation.lean | 1 - .../GaloisValuation/AbsoluteGalois.lean | 1 - .../AbsoluteGalois/AbsoluteRamification.lean | 3 +- .../FiniteExtensionCorrespondence.lean | 3 +- .../FiniteLevelValuationRestriction.lean | 3 +- .../InfiniteGaloisCorrespondence.lean | 3 +- .../GaloisValuation/ClosedFixingSubgroup.lean | 3 +- .../CompositumRestriction.lean | 3 +- .../IntermediateFieldRestriction.lean | 3 +- .../GaloisValuation/Ramification.lean | 3 +- .../RamificationQuotients.lean | 3 +- .../Ramification/Herbrand.lean | 1 - .../Ramification/Herbrand/Average.lean | 3 +- .../Ramification/Herbrand/FixedField.lean | 3 +- .../Ramification/Herbrand/Function.lean | 3 +- .../Ramification/Herbrand/Quotient.lean | 3 +- .../Ramification/Herbrand/Tower.lean | 3 +- .../Ramification/HilbertRamification.lean | 1 - .../AbsoluteValueConjugacy.lean | 3 +- .../AlgebraicLocalization.lean | 3 +- .../HilbertRamification/BaseChange.lean | 3 +- .../HilbertRamification/CharacterMap.lean | 3 +- .../HilbertRamification/CompleteDVF.lean | 3 +- .../CyclotomicDegreeBound.lean | 3 +- .../DecompositionField.lean | 3 +- .../DecompositionFieldExtension.lean | 3 +- .../DecompositionFieldLocalization.lean | 3 +- .../DecompositionGroup.lean | 3 +- .../HilbertRamification/Dedekind.lean | 1 - .../HilbertRamification/Dedekind/Basic.lean | 3 +- .../Dedekind/CompositumUnramified.lean | 3 +- .../Dedekind/Conjugation.lean | 3 +- .../Dedekind/FixedFieldTower.lean | 3 +- .../Dedekind/FixedFieldUnramified.lean | 3 +- .../Dedekind/FixedFields.lean | 3 +- .../Dedekind/NumberFieldPrimes.lean | 3 +- .../Dedekind/OrbitCardinality.lean | 3 +- .../Dedekind/PrimeContractions.lean | 3 +- .../Dedekind/TowerInvariants.lean | 3 +- .../Dedekind/ValuedGalois.lean | 3 +- .../FiniteGaloisLevel.lean | 13 ++- .../FiniteGaloisLevelIndependence.lean | 3 +- .../FiniteOrderValuation.lean | 3 +- .../FirstRamificationComparison.lean | 3 +- .../FixedFieldRamification.lean | 3 +- .../FixedFieldRamificationIndex.lean | 3 +- .../FixedFieldValuationRing.lean | 3 +- .../HilbertRamification/GaloisStabilizer.lean | 3 +- .../HilbertRamification/HerbrandFunction.lean | 3 +- .../HilbertRamification/HerbrandTheorem.lean | 3 +- .../InertiaRamificationCard.lean | 3 +- .../InertiaRestrictionCard.lean | 3 +- .../LocalizationDensity.lean | 3 +- .../LocalizationRamificationGroups.lean | 3 +- .../HilbertRamification/Monogeneity.lean | 3 +- .../OrbitPolynomialIdeal.lean | 7 +- .../PadicLocalization.lean | 3 +- .../RamificationCharacterization.lean | 3 +- .../RamificationDepth.lean | 3 +- .../RamificationGroup.lean | 3 +- .../RamificationNumber.lean | 3 +- .../RamificationNumberFormula.lean | 3 +- .../RamificationNumberRestriction.lean | 3 +- .../HilbertRamification/RealLowerGroups.lean | 3 +- .../ResidueExactSequence.lean | 3 +- .../UniformizerGradedHom.lean | 3 +- .../UniqueExtensionIntegralClosure.lean | 3 +- .../HilbertRamification/ValuationKrasner.lean | 3 +- .../ValuationRestriction.lean | 3 +- .../HilbertRamification/ValuationSubring.lean | 3 +- .../Ramification/InertiaCardinality.lean | 3 +- .../Ramification/LocalField.lean | 1 - .../Ramification/LocalField/BaseChange.lean | 3 +- .../Ramification/LocalField/Core.lean | 3 +- .../FirstRamificationComparison.lean | 3 +- .../Ramification/LocalField/InertiaCard.lean | 3 +- .../Ramification/LocalField/Unramified.lean | 3 +- .../Ramification/ProfiniteInvariant.lean | 3 +- .../ValuedFieldTheory/Valuation.lean | 1 - .../Valuation/AbsoluteValue.lean | 1 - .../AbsoluteValue/AlgebraicExtension.lean | 1 - .../AlgebraicExtension/Core.lean | 11 +-- .../FiniteNormExtension.lean | 3 +- .../AlgebraicExtension/NormFormula.lean | 3 +- .../NormFormulaAbsoluteValue.lean | 3 +- .../NormFormulaCoefficients.lean | 3 +- .../NormFormulaExtension.lean | 3 +- .../NormFormulaIntegralClosure.lean | 3 +- .../RamificationInvariants.lean | 3 +- .../UniqueExtensionCoefficients.lean | 3 +- .../UniqueValuationSubring.lean | 3 +- .../AbsoluteValue/AlgebraicLocalization.lean | 5 +- .../Valuation/AbsoluteValue/Completeness.lean | 3 +- .../Valuation/AbsoluteValue/Completion.lean | 17 ++-- .../AbsoluteValue/ExponentialValuation.lean | 3 +- .../AbsoluteValue/Nonarchimedean.lean | 3 +- .../Valuation/AbsoluteValue/Ostrowski.lean | 3 +- .../PrincipalAdicCompleteness.lean | 3 +- .../AbsoluteValue/SpectralExtension.lean | 10 ++- .../Valuation/AbsoluteValue/Theory.lean | 1 - .../AbsoluteValue/Theory/AbsoluteValues.lean | 3 +- .../Valuation/AbsoluteValue/Theory/Core.lean | 3 +- .../Theory/ExponentialValuations.lean | 3 +- .../AbsoluteValue/ValuationSubring.lean | 3 +- .../Valuation/Completion.lean | 1 - .../Completion/AbsoluteValueExtensions.lean | 3 +- .../Completion/BaseChangeAdjoinRoot.lean | 3 +- .../Completion/BaseChangeNormTrace.lean | 3 +- .../Completion/CanonicalTensorMap.lean | 3 +- .../Valuation/Completion/DegreeNormTrace.lean | 3 +- .../ExtensionFactorClassification.lean | 3 +- .../Completion/ExtensionInvariants.lean | 3 +- .../Completion/FiniteLocalization.lean | 3 +- .../Completion/FiniteProductNormTrace.lean | 3 +- .../Valuation/Completion/Padic.lean | 3 +- .../Valuation/Completion/PolynomialCRT.lean | 3 +- .../Completion/PolynomialFactors.lean | 3 +- .../SeparablePolynomialFactors.lean | 3 +- .../TensorProductDecomposition.lean | 3 +- .../TensorProductProductFormulas.lean | 3 +- .../Valuation/DiscreteValuationField.lean | 1 - .../DiscreteValuationField/AddVal.lean | 3 +- .../DiscreteValuationField/AdicPower.lean | 3 +- .../AmbientUniformizer.lean | 3 +- .../DiscreteValuationField/Basic.lean | 3 +- .../ChevalleyExtension.lean | 3 +- .../DiscreteValuationField/Complete.lean | 3 +- .../CompleteDVRExpansion.lean | 3 +- .../DiscreteValuationField/Compositum.lean | 5 +- .../DiscreteValuationField/Extensions.lean | 3 +- .../FiniteExtension.lean | 1 - .../FiniteExtension/Core.lean | 3 +- .../FiniteExtension/Defectless.lean | 3 +- .../FiniteExtension/Degree.lean | 3 +- .../FiniteExtension/Uniqueness.lean | 3 +- .../FiniteIntegralClosure.lean | 3 +- .../DiscreteValuationField/Henselian.lean | 3 +- .../HenselianFinite.lean | 3 +- .../HenselianValuationExtension.lean | 3 +- .../IntegralClosure.lean | 3 +- .../DiscreteValuationField/ResidueField.lean | 3 +- .../ValuationExtension.lean | 3 +- .../ValuationTransport.lean | 3 +- .../Valuation/HenselLemma.lean | 3 +- .../Valuation/Henselian.lean | 1 - .../Valuation/Henselian/Complete.lean | 3 +- .../Valuation/Henselian/Core.lean | 3 +- .../Valuation/Henselian/Factorization.lean | 1 - .../Henselian/Factorization/AdicLimits.lean | 3 +- .../Henselian/Factorization/Assembly.lean | 3 +- .../Henselian/Factorization/Basic.lean | 3 +- .../Factorization/CoefficientMinimum.lean | 3 +- .../Henselian/Factorization/Complete.lean | 3 +- .../Henselian/Factorization/DegreeBounds.lean | 3 +- .../Factorization/DivisionBounds.lean | 3 +- .../Henselian/Factorization/ErrorPowers.lean | 3 +- .../Factorization/FiniteApproximation.lean | 3 +- .../Factorization/InfiniteApproximation.lean | 3 +- .../Henselian/Factorization/Iteration.lean | 3 +- .../Factorization/PrincipalLimits.lean | 3 +- .../Henselian/Factorization/Step.lean | 3 +- .../Henselian/Factorization/Truncation.lean | 3 +- .../Henselian/Factorization/WeakLimits.lean | 3 +- .../IrreduciblePolynomialBounds.lean | 3 +- .../IrreduciblePolynomialLifting.lean | 3 +- .../Henselian/MonicFactorization.lean | 3 +- .../Henselian/NonmonicReduction.lean | 3 +- .../Henselian/PrimitiveFactorization.lean | 3 +- .../Henselian/PrimitiveReduction.lean | 3 +- .../Henselian/UniqueAlgebraicExtensions.lean | 3 +- .../Henselian/UniqueExtensionPrimitive.lean | 3 +- .../Henselian/UniqueExtensionReduction.lean | 3 +- .../ValuationExtensionCriterion.lean | 3 +- .../ValuedFieldTheory/Valuation/Topology.lean | 1 - .../Topology/AdicCompletionInverseLimit.lean | 3 +- .../AdicCompletionInverseLimitRing.lean | 9 +- .../Valuation/UniqueRing.lean | 3 +- .../Valuation/ValuedAdicComplete.lean | 3 +- 1690 files changed, 3113 insertions(+), 1880 deletions(-) diff --git a/LeanPool.lean b/LeanPool.lean index f2421816f1..d23134f15c 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -2153,7 +2153,10 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F 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.AmbientPrimeTarget +public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTargetComparison 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 diff --git a/LeanPool/ClassFieldTheory.lean b/LeanPool/ClassFieldTheory.lean index 53dd23e4c8..df1898d5d9 100644 --- a/LeanPool/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory.lean @@ -1,4 +1,10 @@ -module -- shake: keep-all --deprecated_module: ignore +/- +Copyright (c) 2026 n-yamaguchi-0729. All 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 @@ -1821,3 +1827,14 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Com 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 index e83258564d..792561c9eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean index 20f52ec747..b7b176e07f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean index 051c0b656f..8290bc58f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/All.lean @@ -22,4 +22,3 @@ and acting group in the same universe; the affected source sections state that constraint explicitly. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean index 3823ca42f1..c58d81a6ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean index 85a38e7e4b..831eb2e2d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/All.lean @@ -26,4 +26,3 @@ Focused aggregate for abstract fields, normalized degrees, Frobenius, norms, pri valuation laws used by class formations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean index 9a652b92e5..011bc72703 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -28,7 +28,8 @@ As in, a field is represented contravariantly by a closed subgroup of the ambient profinite group. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean index 43b727483c..b0425342d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Frobenius.lean @@ -21,7 +21,8 @@ For a field of finite residue degree, this file constructs the map `d(G_K) = f_K ℤ̂`. The Frobenius is then the unique class mapping to `1`. -/ -noncomputable section +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] @@ -174,7 +175,7 @@ def maximalUnramifiedDegreeEquiv (D : DegreeData G) let dquot : (K.field.toSubgroup ⧸ D.fieldInertiaWithin K.field) →* ZHatMul := QuotientGroup.lift (D.fieldInertiaWithin K.field) (D.normalizedDegree K).toMonoidHom - (D.fieldInertiaWithin_le_normalizedDegree_ker K) + (by exact D.fieldInertiaWithin_le_normalizedDegree_ker K) apply MulEquiv.ofBijective dquot constructor · intro x y hxy @@ -192,7 +193,7 @@ def maximalUnramifiedDegreeEquiv (D : DegreeData G) (D.fieldInertiaWithin K.field) (D.normalizedDegree K).toMonoidHom (D.normalizedDegree_surjective K) - (D.fieldInertiaWithin_le_normalizedDegree_ker K) + (by exact D.fieldInertiaWithin_le_normalizedDegree_ker K) /-- On quotient representatives, the maximal-unramified degree equivalence is normalized degree. -/ @[simp] @@ -292,7 +293,7 @@ def maximalUnramifiedRestriction (D : DegreeData G) {L K : ClosedSubgroup G} (L.toSubgroup ⧸ D.fieldInertiaWithin L) →* (K.toSubgroup ⧸ D.fieldInertiaWithin K) := QuotientGroup.map (D.fieldInertiaWithin L) (D.fieldInertiaWithin K) - (Subgroup.inclusion hLK) (D.fieldInertiaWithin_le_comap_inclusion hLK) + (Subgroup.inclusion hLK) (by exact D.fieldInertiaWithin_le_comap_inclusion hLK) /-- Maximal-unramified restriction sends a quotient representative to its restricted representative. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index 39ce72b833..91d6f2be37 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -25,7 +25,8 @@ Frobenius lift in `G(\widetilde L | K)`, the subgroup `Γ` fixing the field `Σ` is the closed subgroup topologically generated by `σ`. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean index 7d4cf95bff..ad232cf303 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean @@ -23,7 +23,8 @@ the lifting statement of the finite degree-quotient decomposition. Positivity i convention `0 ∉ ℕ` is not lost in Lean's natural numbers. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean index cb67b5cfb6..d5387d671e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Indices.lean @@ -27,7 +27,8 @@ universe u v variable {G : Type u} {D : Type v} [Group G] [Group D] -private def kernelToSaturation (d : G →* D) (L K : Subgroup G) : +/-- 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) @@ -42,11 +43,13 @@ private theorem kernelToSaturation_rel_iff (d : G →* D) (L K : Subgroup G) · intro h exact ⟨h, d.ker.mul_mem (d.ker.inv_mem x.property.2) y.property.2⟩ -private noncomputable def kernelCosetToSaturationCoset (d : G →* D) (L K : Subgroup G) : +/-- 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) fun x y h ↦ - (kernelToSaturation_rel_iff d L K x y).mp h + 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 @@ -88,8 +91,8 @@ noncomputable def kernelCosetEquivSaturation (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))) := Equiv.ofBijective (kernelCosetToSaturationCoset d L K) - ⟨kernelCosetToSaturationCoset_injective d L K, - kernelCosetToSaturationCoset_surjective d hLK⟩ + ⟨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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean index 9ab2064020..c7d7882a6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Norm.lean @@ -28,7 +28,8 @@ cosets (the additive form of the multiplicative product), so it does not require the extension to be Galois. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean index 6a36ff939d..ee882cf0a0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormConjugation.lean @@ -26,7 +26,8 @@ These are the field-conjugation and norm identities used in the abstract recipro use only the actual relative norm and the conjugation action. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean index 2ae86b1e5b..40ee1fbcb5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -24,7 +24,8 @@ open CyclicCohomology This file proves the structural laws for the coset-sum norm constructed in `Norm.lean`. -/ -noncomputable section +noncomputable +section open scoped BigOperators Pointwise diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean index ca3e30a176..fb1a6f8ae9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PadicCyclicClosure.lean @@ -26,7 +26,8 @@ open scoped Topology namespace ClassFormation -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean index b0db1ce267..01809eee8c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/PrimeElements.lean @@ -24,7 +24,8 @@ This file formalizes the prime-element definition and its two immediate conseque unramified and totally ramified extensions. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean index 848e6e49d0..1ca88811bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ProfiniteIntegerFiniteQuotient.lean @@ -29,7 +29,8 @@ with the multiples of its index, then uses the existing reduction to `ZMod` and Mathlib's `ZMod.lift`. -/ -noncomputable section +noncomputable +section private theorem finiteIndexNormalAddSubgroup_eq_zmultiples_index (H : FiniteIndexNormalAddSubgroup ℤ) : @@ -61,7 +62,8 @@ private theorem finiteIndexNormalAddSubgroup_index_mem simpa only [n] using finiteIndexNormalAddSubgroup_eq_zmultiples_index H rw [hH, Int.mem_zmultiples_iff] -private noncomputable def zHatFiniteIndexQuotientReduction +/-- 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 @@ -80,7 +82,7 @@ noncomputable def zHatReductionToFiniteIndexQuotient continuous_toFun := continuous_of_discreteTopology } exact quotientReduction.comp (zHatReduction H.toAddSubgroup.index - (finiteIndexNormalAddSubgroup_index_pos H)) + (by exact finiteIndexNormalAddSubgroup_index_pos H)) /-- The finite quotient reduction extends the ordinary quotient map on integers. -/ @[simp] @@ -90,7 +92,7 @@ theorem zHatReductionToFiniteIndexQuotient_intCast QuotientAddGroup.mk' H.toAddSubgroup a := by change zHatFiniteIndexQuotientReduction H (zHatReduction H.toAddSubgroup.index - (finiteIndexNormalAddSubgroup_index_pos H) (a : ZHat)) = + (by exact finiteIndexNormalAddSubgroup_index_pos H) (a : ZHat)) = QuotientAddGroup.mk' H.toAddSubgroup a rw [zHatReduction_intCast] unfold zHatFiniteIndexQuotientReduction @@ -114,7 +116,7 @@ noncomputable def zHatFiniteIndexQuotientDiagramLeg let reduction : ZHat →ₜ+ Q := quotientReduction.comp (zHatReduction H.toAddSubgroup.index - (finiteIndexNormalAddSubgroup_index_pos H)) + (by exact finiteIndexNormalAddSubgroup_index_pos H)) exact ProfiniteAddGrp.ofHom reduction /-- The diagram leg agrees with quotient reduction on the dense copy of @@ -269,9 +271,9 @@ private theorem zHatToIntegerProfiniteCompletion_injective : (zHatToIntegerProfiniteCompletion_fac H) y have hreduction : zHatReduction H.toAddSubgroup.index - (finiteIndexNormalAddSubgroup_index_pos H) x = + (by exact finiteIndexNormalAddSubgroup_index_pos H) x = zHatReduction H.toAddSubgroup.index - (finiteIndexNormalAddSubgroup_index_pos H) y := by + (by exact finiteIndexNormalAddSubgroup_index_pos H) y := by apply zHatFiniteIndexQuotientReduction_injective H change zHatReductionToFiniteIndexQuotient H x = zHatReductionToFiniteIndexQuotient H y @@ -320,8 +322,8 @@ noncomputable def zHatContinuousAddEquivIntegerProfiniteCompletion : { (Continuous.homeoOfEquivCompactToT2 (f := Equiv.ofBijective (fun z : ZHat => zHatToIntegerProfiniteCompletion z) - ⟨zHatToIntegerProfiniteCompletion_injective, - zHatToIntegerProfiniteCompletion_surjective⟩) + ⟨by exact zHatToIntegerProfiniteCompletion_injective, + by exact zHatToIntegerProfiniteCompletion_surjective⟩) hcontinuous) with map_add' := zHatToIntegerProfiniteCompletion.hom.map_add } diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean index 6e96087ece..cdea67d117 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Valuation.lean @@ -27,7 +27,8 @@ file formalizes the valuation-quotient axiom and constructs the normalized valua normalized-valuation functoriality. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean index cc48a2eb6d..bc89d6be84 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/ValuationLaws.lean @@ -25,7 +25,8 @@ This file proves the two functorial assertions of normalized-valuation functoria source norm laws. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean index 5381aa8978..2df5d7619c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity.lean @@ -33,4 +33,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean index ccc361d0e4..f425e3dccb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/All.lean @@ -36,4 +36,3 @@ Public aggregate for the class-formation reciprocity theorem and the canonical construction and naturality of its reciprocity maps. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean index 500f4d2ac0..34b449de68 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassField.lean @@ -19,7 +19,8 @@ consequences rather than extra assumptions. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean index 54eca944f7..2c2445aad8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldAxiom.lean @@ -25,7 +25,8 @@ original statement the class-field axiom, rather than cardinality data attached auxiliary reciprocity map. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean index eb14324d1f..1bb1453997 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ClassFieldCandidate.lean @@ -30,7 +30,8 @@ asserted here. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean index 52e679ca86..808f15c8c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction.lean @@ -47,4 +47,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean index 573c5c25a3..f3bec44ac9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/All.lean @@ -50,4 +50,3 @@ Aggregate for norm quotients, Frobenius descent, prime independence, transfer na canonical abstract reciprocity map. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean index aa13ca9d01..6f5ca06052 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean @@ -28,7 +28,8 @@ proves directly that it induces the unramified norm-quotient isomorphism used in the unramified norm-quotient equivalence. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean index 2a64f616b2..33a91877b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ChosenDegreeOneFrobenius.lean @@ -25,7 +25,8 @@ 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 +noncomputable +section variable {G : Type u} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean index 56ab439d18..dcce769c6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean @@ -30,7 +30,8 @@ the relative norm through the Frobenius fixed field `Σ` constructed in the Frobenius fixed-field theorem. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean index 715b225991..9a39ba2952 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/DoubleCosetOrbitGeometry.lean @@ -26,7 +26,8 @@ universe u namespace ClassFormation -noncomputable section +noncomputable +section open MulAction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean index 2ad963b846..ccb3f9481f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteFieldUnitMaps.lean @@ -28,7 +28,8 @@ constructs the induced actions, inclusions, and relative norms on the corresponding finite unit groups. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean index 6554492b37..020e22072f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateCompositum.lean @@ -23,7 +23,8 @@ These are the finite-stage closure facts used in the proof of the universal norm intersection on the Galois-group side. -/ -noncomputable section +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean index 55fbe9abc3..c5405c2604 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteIntermediateFieldCompositum.lean @@ -25,7 +25,8 @@ This module records the quotient cardinal and common-compositum facts for finite intermediate fields used by the norm-descent tower. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean index 55683cdbc6..2e33f47173 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean @@ -28,7 +28,8 @@ contained in the single norm image from `L`. Hence the reciprocity construction canonically to `A_K / N_{L|K}A_L`, the target in the finite reciprocity equivalence. -/ -noncomputable section +noncomputable +section section finiteNorms diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean index b4bf74cd95..9e6e8e586f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitCorrection.lean @@ -25,7 +25,8 @@ This module constructs the unit-valued correction term on a Frobenius fixed-field tower and proves its coefficient and relative-norm identities. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean index d62590aae7..1f725e7693 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FixedTowerUnitDescent.lean @@ -27,7 +27,8 @@ the unit-cohomology axiom, and proves the corrected universal norm-descent equation on finite fixed-field towers. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean index 3b6ce065b9..6c0e7e11c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusClosureCommutation.lean @@ -26,7 +26,8 @@ procyclic subgroup and derives the conjugation identities for the associated fixed field. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean index ade59efa2d..a2df4a81f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusDescent.lean @@ -25,7 +25,8 @@ have the same restriction and degree. -/ -noncomputable section +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean index 23bb062be6..1aeb0d9bf5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusField.lean @@ -23,7 +23,8 @@ 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 +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean index d69008a4ac..08cb02657c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldAction.lean @@ -27,7 +27,8 @@ its compatibility with conjugate-stable actions, relative norms, inclusions, and Frobenius power sums. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean index d41fe62492..109f8b3f13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusFixedFieldTower.lean @@ -23,7 +23,8 @@ open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean index 67fb4fd63d..d3f3b7033c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -26,7 +26,8 @@ proves their inclusion, exponent, normality, unramifiedness, finiteness, degree, quotient-cardinality, and generator properties. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean index 651dbe89a3..7914173d24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusQuotientDescent.lean @@ -26,7 +26,8 @@ Birkhoff sums with Frobenius power sums, and proves the finite-support descent from the maximal unramified field. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean index 24c906fcae..0cea85ed63 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusSemigroup.lean @@ -22,7 +22,8 @@ The set `Frob(\widetilde L | K)` from is closed under multiplication: normalized degrees are positive natural numbers and add under products. -/ -noncomputable section +noncomputable +section namespace DegreeData diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean index de283c7fcf..da8fce14df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitDescent.lean @@ -27,7 +27,8 @@ the infinite unit subgroup, proves its action and norm stability, and descends maximal-unramified norm equations from finite support. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean index dca3eded10..2f05f9567c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/InfiniteUnitNormSubgroup.lean @@ -26,7 +26,8 @@ their tower compatibility, and compares them with the ambient norm subgroups. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean index 0dada68477..d5372121d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -43,7 +43,8 @@ additivity on the Frobenius semigroup, so the lift supplied by the finite reciprocity equivalence. -/ -noncomputable section +noncomputable +section section finiteReciprocityValues @@ -813,7 +814,8 @@ class. That class generates the finite norm quotient, so the resulting reciprocity homomorphism is promoted to an additive equivalence. -/ -noncomputable section +noncomputable +section section unramifiedFixedFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean index 79c8f3238d..eecff2a7ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean index 4539f29893..ce6b88c63e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/All.lean @@ -21,4 +21,3 @@ This aggregate exposes the construction proving that the abstract reciprocity map respects multiplication. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean index 9c9d4e9185..4c9817972a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ConjugatePrimeNorm.lean @@ -24,7 +24,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean index e35a4ede70..daf51dcee7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/CorrectionSum.lean @@ -23,7 +23,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean index 84da978702..8235cc327c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FiniteStageCorrections.lean @@ -23,7 +23,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean index 56447c525a..365c150197 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusActionRemainder.lean @@ -25,7 +25,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean index 02473c37c5..ccb14ee42d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/FrobeniusPowerSumRelation.lean @@ -23,7 +23,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean index 5fb09a0e87..53a3b4e8dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean @@ -24,7 +24,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean index fc249cfee5..23c31aec9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/PrimeUnitDifferences.lean @@ -23,7 +23,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean index 49d78fca79..bd0ebaae04 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/ReciprocityMapMul.lean @@ -28,7 +28,8 @@ namespace ClassFormation open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index 0787f8cb35..a1eb4d51e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -32,7 +32,8 @@ eventual the finite reciprocity equivalence reciprocity homomorphisms can be con any additional comparison datum. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index cc97cea2ad..0306e2815d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -23,7 +23,8 @@ open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean index 6461773fe2..61ab7b29ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobenius.lean @@ -29,7 +29,8 @@ norm-orbit representatives, fiber calculations, fixed-field arithmetic, and the final Frobenius transfer formula. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean index 1761110271..9bdb7b877b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransferFrobeniusGeometry.lean @@ -27,7 +27,8 @@ open KummerTheory open CyclicCohomology open CategoryTheory -noncomputable section +noncomputable +section open scoped BigOperators open MulAction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean index b6479ac3d4..f4486f8014 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/NormSubgroup.lean @@ -28,7 +28,8 @@ For an infinite abstract extension `E | K`, the abstract class-field constructio intermediate fields. This file records that definition literally. -/ -noncomputable section +noncomputable +section section finiteIntermediateFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean index 4c87750f8c..0e3f597e62 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/PrimeChoice.lean @@ -25,7 +25,8 @@ finite abstract field. Any two choices differ by a unit (additively, their difference has value zero). -/ -noncomputable section +noncomputable +section namespace ValuationData diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean index bea154fcbb..f96e90bf21 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityDefinition.lean @@ -31,7 +31,8 @@ class is the class of `N_{Σ|K}(π_Σ)` in element is proved separately from the unit-cohomology axiom. -/ -noncomputable section +noncomputable +section section frobeniusFixedFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean index 8ce295b63e..1826948d4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/ReciprocityIndependence.lean @@ -27,7 +27,8 @@ This file supplies the finite-Galois cofinality and compositum argument used to reciprocity construction is independent of its prime element. -/ -noncomputable section +noncomputable +section section groupTheoreticRefinements diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean index 5d9e07893d..098e32134b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/RelativeNormDoubleCoset.lean @@ -28,7 +28,8 @@ This file constructs that partition from Mathlib's class-formula equivalence and reindexes the actual relative norm along it. -/ -noncomputable section +noncomputable +section open scoped BigOperators @@ -180,8 +181,9 @@ theorem relativeNorm_eq_sum_chosenOrbit_of_fintype (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] -private noncomputable def relativeNormDoubleCosetSigmaFintype +noncomputable def relativeNormDoubleCosetSigmaFintype (K K' S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) @@ -197,8 +199,9 @@ private noncomputable def relativeNormDoubleCosetSigmaFintype (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] -private noncomputable def relativeNormDoubleCosetOrbitFintype +noncomputable def relativeNormDoubleCosetOrbitFintype (K K' S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) @@ -215,8 +218,9 @@ private noncomputable def relativeNormDoubleCosetOrbitFintype intro q q' h exact congrArg Sigma.fst h) +/-- Enumerate the stabilizer cosets in a relative-norm orbit. -/ @[implicit_reducible] -private noncomputable def relativeNormDoubleCosetStabilizerFintype +noncomputable def relativeNormDoubleCosetStabilizerFintype (K K' S : ClosedSubgroup G) (hSK : S.toSubgroup ≤ K.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean index 5ba07281dc..be1ccfaaca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferNaturality.lean @@ -22,7 +22,8 @@ has kernel contained in a finite-index subgroup, it identifies the two left-cose transfer commutes with the induced maps on abelianizations. -/ -noncomputable section +noncomputable +section open Function open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean index 817f1d3804..2d626c5cfd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/TransferOrbitClosure.lean @@ -24,7 +24,8 @@ 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 +noncomputable +section open MulAction diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean index 9d3564956d..5bf3777077 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -26,7 +26,8 @@ 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 +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean index 045788bd51..efe905d854 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/Universal.lean @@ -24,7 +24,8 @@ open KummerTheory open CyclicCohomology -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean index d71229dcc9..a43e600e57 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UniversalNormDescent.lean @@ -27,7 +27,8 @@ calculation used by the abstract reciprocity construction, together with the norm, action, and iterate identities it requires. -/ -noncomputable section +noncomputable +section open CategoryTheory open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean index 0083addf6e..a6bfd16e58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean @@ -31,7 +31,8 @@ correction: the unit-cohomology axiom (`H⁰ = 0`) makes every unit of `K` the n of a unit of `L`. -/ -noncomputable section +noncomputable +section section unramifiedFrobenius diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean index b74bc28247..3ddb959095 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Core.lean @@ -32,7 +32,8 @@ 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 +noncomputable +section open CategoryTheory @@ -467,7 +468,8 @@ as an input; both rows are proved directly from quotient membership and norm transitivity. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean index 578109381f..0cf2ca62bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/CyclicNormQuotient.lean @@ -29,7 +29,8 @@ cardinality assertion of the class field axiom can be applied to the reciprocity map. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean index f857d9a214..60df6df8a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FieldRepresentation.lean @@ -26,7 +26,8 @@ This file identifies the invariant carrier used by `A_L`, and compares the representation norm with `N_{L/K}`. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean index a0ea838408..b2fdf13ab4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianClassification.lean @@ -21,7 +21,8 @@ their compositum. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean index c15471ac9f..2964782b29 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteAbelianSubextension.lean @@ -28,7 +28,8 @@ bijection itself, require the abstract reciprocity theorem and are deliberately @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean index f492fdc56b..a7bd33ef53 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/FiniteGaloisSubextension.lean @@ -25,7 +25,8 @@ of a fixed abstract field. This file packages those extensions and their composita contravariantly as intersections of closed subgroups. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean index ac60e3398a..1909253aa3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/IntermediateExtension.lean @@ -34,7 +34,8 @@ first and third isomorphism theorems; no correspondence certificate is assumed. -/ -noncomputable section +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean index 21302ba2a7..aa89154790 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Main.lean @@ -34,7 +34,8 @@ cyclic totally ramified calculation is proved in `AbstractClassFieldTheory.Reciprocity.TotallyRamifiedCase`. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] @@ -997,7 +998,8 @@ printed commutative diagrams for the inverse norm-residue symbol. -/ -noncomputable section +noncomputable +section -- Mathlib's `Rep ℤ G` currently fixes the acting group to universe zero. variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean index 3d0b8b0c72..e2b83cefcd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedReciprocity.lean @@ -20,7 +20,8 @@ finite compatibility and then records the two formulas. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean index ba40364f8b..4e19d80360 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -20,7 +20,8 @@ been proved from the unramified norm-quotient equivalence. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean index cd71ff243b..81a56c3481 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormContinuity.lean @@ -17,7 +17,8 @@ subgroup into , providing the key continuity input. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean index d809baeeba..0009c275b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopology.lean @@ -22,7 +22,8 @@ make this family downward directed. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean index caea85f0cb..d67cf8b627 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/NormTopologyCharacterization.lean @@ -20,7 +20,8 @@ imported valuation-, norm-, and norm-topology modules. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean index 6dd9b36dc0..9b73ddbd9b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ProfiniteAPI.lean @@ -19,7 +19,8 @@ theorems. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation.Profinite diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean index 948be3c98c..1c5cb5867a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Reduction.lean @@ -33,7 +33,8 @@ lemmas below only construct the actual arrows and prove the algebraic diagram chases which will be applied to those homomorphisms. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean index bb10663603..8ed045e905 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean @@ -38,7 +38,8 @@ surjectivity to prove finiteness. No reciprocity surjectivity or the finite reciprocity equivalence comparison is assumed here. -/ -noncomputable section +noncomputable +section variable {G : Type*} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean index b41365b1a3..287723cf55 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamified.lean @@ -35,7 +35,8 @@ compatibility record or theorem-shaped certificate is introduced for that comparison. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean index e886f0a871..5f11ba142e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AbstractClassFieldTheor /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean index 5e9be9b3c0..f9706af837 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/All.lean @@ -19,4 +19,3 @@ This aggregate module exposes the constructed Frobenius tower, restriction equivalences, fixed-source calculation, and the final reciprocity theorem. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean index 95ec9b78b4..1001713818 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/Conclusion.lean @@ -16,7 +16,8 @@ finite reciprocity from the constructed fixed source. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean index 4d2b07c80c..e962c45365 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FixedSource.lean @@ -17,7 +17,8 @@ boundary and carries out the source-producing fixed-element calculation. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean index 34c64e34a5..522e0b83d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusLift.lean @@ -16,7 +16,8 @@ Galois extension used in the totally ramified reciprocity argument. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean index 335b864c90..95cffcf33e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/FrobeniusNorms.lean @@ -16,7 +16,8 @@ proves its restriction, commutation, action, and relative-norm identities. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean index 6f472b3d4a..d9f0c75b41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionCosets.lean @@ -16,7 +16,8 @@ and the compatible relative actions and norms used in ramified towers. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean index 1c88b7f662..b69adbaedf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/TotallyRamifiedCase/RestrictionEquiv.lean @@ -17,7 +17,8 @@ ramified quotient and constructs its cyclic generator. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean index 21bc931da9..6449849327 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/ValuationContinuity.lean @@ -20,7 +20,8 @@ sends its norm subgroup into the prescribed neighbourhood. @[expose] public section -noncomputable section +noncomputable +section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean index 4857894b49..14059413c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Algebra.IntermediateFie /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean index f52fc6bf58..d9b66da80e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/AbelianGaloisEquiv.lean @@ -18,7 +18,8 @@ field theory or ramification. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean index 70031c22af..91fe7272c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/FiniteAbelianIntermediateFieldAlgEquiv.lean @@ -17,7 +17,8 @@ the abelian Galois property of every intermediate field. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean index 0904447b5c..c0b94f4536 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Algebra/IntermediateFieldAlgEquivOrderIso.lean @@ -17,7 +17,8 @@ Mathlib's chosen separable closures. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean index 3b55efac59..89b1472e89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory.lean @@ -26,4 +26,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.T /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean index 1c12dba7ce..eac969cfd7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.A /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean index a6f5b3191e..60d4e5f701 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/All.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.A public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Adele.RestrictedProduct /-! # Adelic coordinates and restricted products -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean index c26f71787e..5577bc4281 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/Coordinates.lean @@ -22,7 +22,8 @@ local tensor components have first been chosen place by place. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean index e899d21d05..070f568f2b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FinitePlaceTensorBlock.lean @@ -24,7 +24,8 @@ conjugation on the second tensor factor. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean index eebe27607a..ef0bb8403c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/FiniteRestrictedProductBaseChange.lean @@ -28,7 +28,8 @@ of `L`. open scoped NumberField TensorProduct RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean index 24bc2254aa..c4ea3562f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/InfinitePlaceTensorBlock.lean @@ -24,7 +24,8 @@ the local tensor decomposition, equivariantly for the full Galois action. open scoped NumberField TensorProduct NumberField.LiesOver open NumberField -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean index f441ee514e..fd878d5078 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralLocalFactor.lean @@ -33,7 +33,8 @@ rather than coordinate-dependent, reasons. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean index 120593e4b8..0d9bd2e06c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.A /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean index 925d9631e3..4221476f5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/AbsoluteValue.lean @@ -47,7 +47,8 @@ unit groups needed in the finite-support decomposition. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean index d55eaf3431..e1c314d5a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/All.lean @@ -19,4 +19,3 @@ Public aggregate for the lattice, localization, local tensor decomposition, and finite-support results controlling integral relative ideles. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean index ff7d1e10f4..5afc147664 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/FinitePlaceCompletion.lean @@ -19,7 +19,8 @@ places and records how the resulting maps preserve norms and integrality. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean index 393e522a99..f460295d5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/IdeleSupport.lean @@ -20,7 +20,8 @@ of a relative idele and its inverse. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean index eb6861b5a2..60a289610f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Lattice.lean @@ -20,7 +20,8 @@ local integrality properties can fail. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean index aabec2d58c..6fcfdccc44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/LocalTensorDecomposition.lean @@ -20,7 +20,8 @@ place. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean index c1b6760cdf..3659c01f3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/IntegralTensorSupport/Localization.lean @@ -20,7 +20,8 @@ integrality after localization. open scoped NumberField TensorProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean index 3d16b0690e..965398d928 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/LocalComponents.lean @@ -22,7 +22,8 @@ tensor decomposition has been established. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean index d606c27af5..cf3ddefe3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedAction.lean @@ -21,7 +21,8 @@ coordinatewise tensor-conjugation action. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean index 5a51108fe6..347f7a92d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Adele/RestrictedProduct.lean @@ -26,7 +26,8 @@ chosen-basis lattice with the product of local integer rings. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index 7e6dd4aa0d..063b8208be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -21,7 +21,8 @@ determinant norms in a field tower. open scoped NumberField TensorProduct RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean index e657eb6972..4673c2d03f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/All.lean @@ -33,4 +33,3 @@ classes in extensions, normal-closure and splitting results, ray class groups, S-units, and the ramification and degree results needed by global applications. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean index 3040ca8190..88f596f498 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean index 87890f2696..cbeca9315a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionComparison.lean @@ -28,7 +28,8 @@ completions at the corresponding finite places. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean index e8e7394e5d..74dfe6d2cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/AdicCompletionMap.lean @@ -21,7 +21,8 @@ completions. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean index c9433da6ff..08905dac43 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/All.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.C public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.All /-! # Completions of number fields and their local comparisons -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean index 7cca010164..b76cc4e049 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ChosenLocalization.lean @@ -21,7 +21,8 @@ unramifiedness for that actual completed extension. open scoped NumberField ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean index 9f111b0ba8..c22418c9d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/Comparison.lean @@ -27,7 +27,8 @@ local factor comparison used in the adelic restricted-product bridge. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean index f26affd5c0..14c3bc2925 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/ExtensionIndex.lean @@ -32,7 +32,8 @@ closure shows that the centres are precisely the finite places above `v`. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean index 275917ceee..0358ccc654 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/FinitePlaceAdicCompletionCongrEquiv.lean @@ -20,7 +20,8 @@ for transporting local Hilbert pairings. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean index b801d8adec..5bcad6c0ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/IntegerRingComparison.lean @@ -27,7 +27,8 @@ residue field of a rational finite-place completion. open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean index 62130f7819..63248c2664 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/LocalizedValuation.lean @@ -23,7 +23,8 @@ localized valuation ring with the integral closure of the base valuation ring. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean index 52550ed652..95dbe6bde7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean index f111100241..6bb6ab3b13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/All.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.C public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Completion.UnramifiedComparison.RamificationIndex /-! # Unramified comparisons between completions and prime ideals -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean index 686191ae02..c291b1882f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/CompletionToIdeal.lean @@ -23,7 +23,8 @@ a finite Galois extension. open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean index 3d9e7554e4..896e9a47ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/IdealToCompletion.lean @@ -22,7 +22,8 @@ completion. open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean index 8894995e25..70605fbebb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/LocalNorm.lean @@ -20,7 +20,8 @@ norm subgroup of the chosen localized completion. open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean index 77e7f930c3..6c56a159ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Completion/UnramifiedComparison/RamificationIndex.lean @@ -29,7 +29,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean index 82170a27b7..ab42432f1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/CompositumEmbedding.lean @@ -19,7 +19,8 @@ inertia-field compositum in one cyclotomic target. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean index eefa81a73d..910384a0a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -19,7 +19,8 @@ canonical factor embeddings and their elementary degree bounds. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean index 68669e7c55..2c796d41f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.G /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean index 330c171417..d83ce46529 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/AbsoluteAbelianization.lean @@ -21,7 +21,8 @@ construction uniform in every characteristic. @[expose] public section -noncomputable section +noncomputable +section open scoped IsMulCommutative diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean index b2df6dcd24..84b62bcdfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/All.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.G public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Galois.UnboundedDegree /-! # Galois subextensions and fixed-field constructions -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean index a6de113ae9..b60f5aeafc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeDegreeSubextension.lean @@ -20,7 +20,8 @@ the remaining extension has degree `[L : K] / p`. @[expose] public section -noncomputable section +noncomputable +section variable {K L : Type} [Field K] [Field L] [Algebra K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean index 0a94f83a01..5d34ccde4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/CyclicPrimeSubextension.lean @@ -28,7 +28,8 @@ there ascends to `L`. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean index 96e86a47d2..d30ae664ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/InfiniteBaseChange.lean @@ -20,7 +20,8 @@ compositum. @[expose] public section -noncomputable section +noncomputable +section namespace IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean index 4cad88b6af..d34a82a7f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteAbelianization.lean @@ -20,7 +20,8 @@ an abstract group isomorphism. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean index 85249847f5..82621d42ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean @@ -19,7 +19,8 @@ topologies, and hence their topological abelianizations. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean index f34e38de8a..a70bfe9dcc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MaximalAbelianSubextension.lean @@ -20,7 +20,8 @@ Galois intermediate field contained in the distinguished copy. @[expose] public section -noncomputable section +noncomputable +section open scoped IsMulCommutative diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean index 361694b988..a8f407d790 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/RelativeAbelianization.lean @@ -19,7 +19,8 @@ intermediate field fixed by the closed commutator subgroup. open scoped IsMulCommutative -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean index d4112064d0..5d29958eab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele.lean @@ -36,4 +36,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean index 0952c6dc9f..9e303b14ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/All.lean @@ -39,4 +39,3 @@ Public aggregate for the idele group and the idele class group of a number field. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean index 218aabc781..3ba4c2997f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/BaseChange.lean @@ -24,7 +24,8 @@ closure to the Galois valuation-extension comparison. open scoped NumberField TensorProduct RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean index 8cad8c788e..f49b91d560 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Basic.lean @@ -26,7 +26,8 @@ is the unit group of the finite product of the archimedean completions. open scoped NumberField RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable (K : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean index b7132372d1..599a31a1b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup.lean @@ -26,4 +26,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index af3071d8c6..5252564893 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -34,7 +34,8 @@ open scoped NumberField TensorProduct open NumberField open IsDedekindDomain -noncomputable section +noncomputable +section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean index c51990a8a5..fd1382da19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivAdeleTopology.lean @@ -21,7 +21,8 @@ completion map preserves the local valuation subring. open scoped NumberField RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean index d71b3b7a61..402d7510e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivFiniteIntegral.lean @@ -21,7 +21,8 @@ needed for continuity of adelic transport. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean index c1dd9de427..036d7aab29 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivIdeleClassTopology.lean @@ -23,7 +23,8 @@ have the previously defined algebraic maps as their underlying maps. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean index 1cd6a42ea5..da3da05893 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquivTopology.lean @@ -20,7 +20,8 @@ local continuity input for transporting the restricted-product topology. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean index 3a637673d7..64ca6175b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/All.lean @@ -29,4 +29,3 @@ Public aggregate for the ordinary ideal class quotient of the ideles and its base-change, norm-comparison, tower, and algebra-equivalence constructions. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean index bcd54b0957..e0781ef8b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/BaseChange.lean @@ -32,7 +32,8 @@ determinant-norm base-change identity. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean index f433a8ca4d..443c40e01d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/ConnectedComponentQuotientCongr.lean @@ -21,7 +21,8 @@ of the corresponding quotient topological groups. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean index 5e0030e26c..9b2fe68787 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Core.lean @@ -22,7 +22,8 @@ ordinary ideal class group. open scoped NumberField RestrictedProduct WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean index 561f26749d..7a959305cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/InfiniteAlgEquiv.lean @@ -20,7 +20,8 @@ inverse. This is the archimedean local input for the topology of `adeleCongr`. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean index c869db3026..bb1a546c7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibComparison.lean @@ -22,7 +22,8 @@ needed for the public local--global reciprocity theorem is recorded below. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean index 3c2388f721..b529511a46 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/MathlibTopologyComparison.lean @@ -22,7 +22,8 @@ the continuous map on idèles. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean index f89379cf16..d1ca5717d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormComparison.lean @@ -25,7 +25,8 @@ proved in relative coordinates be stated with the usual norm open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean index 9f8b91cac2..d45f4e77ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/NormalClosureNorm.lean @@ -25,7 +25,8 @@ with the norm subgroup of the original extension. open scoped NumberField open NumberField -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean index 462c619fbd..eced64caa0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/Tower.lean @@ -27,7 +27,8 @@ quotients form a natural right-exact sequence. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean index 58fbc3251c..2bd55e0ae1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerAlgEquivNaturality.lean @@ -28,7 +28,8 @@ local components is introduced. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section variable {K K' L L' : Type} diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean index e41c6b09e7..c444caa043 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/TowerBaseChange.lean @@ -22,7 +22,8 @@ the ordinary ideles of `L`. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean index e65aca3a19..401c2acfbc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean index 51b9f08dbd..656afc2da6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SupportedBridge /-! # Cohomology of ideles and supported local decompositions -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean index 517afc8fe2..f5e64f66a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Decomposition.lean @@ -43,7 +43,8 @@ show that every unramified induced integer-unit block has trivial open scoped NumberField RestrictedProduct ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean index ade93cf339..9325393a7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -29,7 +29,8 @@ norm is proved from the Galois product formula. open scoped BigOperators NumberField open NumberField -noncomputable section +noncomputable +section open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean index 7fe978fabc..c65cf2fe57 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean @@ -27,7 +27,8 @@ its cardinality, and hence the norm index, is at least `|G| = [L : K]`. open scoped NumberField open NumberField -noncomputable section +noncomputable +section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean index 165e167352..1680858468 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean index b7be4e555a..81c59a22ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/All.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Cohomology.SPlaces.Reassociation /-! # Cohomological decompositions over finite sets of places -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean index 43c49ba26c..3755fd349a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean index ef111439e0..2b074a4837 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/All.lean @@ -17,4 +17,3 @@ Public aggregate for the local, finite-family, and factor-transport Herbrand calculations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean index 8668ed1fac..3a5967d8af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean @@ -20,7 +20,8 @@ unrestricted relative S-idele factors. open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean index dac440e2de..e92cd522f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyCardinality.lean @@ -19,7 +19,8 @@ finiteness results and the canonical family instance providers. open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean index 21d64e2d4a..09ce55e1f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/FamilyFinite.lean @@ -19,7 +19,8 @@ unrestricted places. open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean index dc29228a1a..d21758b0e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Local.lean @@ -22,7 +22,8 @@ of all infinite places and the finite places in `S`. open scoped NumberField BigOperators ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean index 93d19e3e81..75aceb1cf2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/LocalBlocks.lean @@ -24,7 +24,8 @@ the local tensor decomposition. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open LocalClassFieldTheory open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean index 6d44d0f857..9627e196d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced.lean @@ -20,4 +20,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean index 401843d306..61caf0fd0b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/All.lean @@ -23,4 +23,3 @@ This is the public import entry point for the local integral induced-block construction and its chosen-finite-place specialization. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean index 47669b3159..9aa859c2a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlace.lean @@ -22,7 +22,8 @@ cohomology consequences. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean index 38704ea070..6c35b65164 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceAction.lean @@ -26,7 +26,8 @@ proofs from elaborating it together with the tensor-block API. open scoped NumberField ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean index 763983392b..35ebebea1a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlock.lean @@ -21,7 +21,8 @@ lemmas into the transport used by the cohomology layer. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean index 09f99084d5..e18c3bbbe6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquiv.lean @@ -20,7 +20,8 @@ and the induced module of chosen local integer units. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean index 15c9d43e90..e4d297c621 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockEquivApply.lean @@ -20,7 +20,8 @@ equivalence on underlying field units. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean index a1a8d0f951..2bb5890139 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInclusion.lean @@ -19,7 +19,8 @@ ordinary local multiplicative block and proves injectivity. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean index 96d2329ed5..a148e0acf1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockInducedSmul.lean @@ -19,7 +19,8 @@ equivariant for the global Galois action. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean index bb5b50ac11..db3b1915ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/ChosenPlaceIntegralBlockTensorSmul.lean @@ -20,7 +20,8 @@ restricted global Galois action. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean index 4a5fae99b6..f803747ec7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/CompletionTransport.lean @@ -20,7 +20,8 @@ right coset of a decomposition group to the chosen algebraic localization. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean index c89869e637..81952df0b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section 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 index 8f96714ddc..110f29c8de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Action.lean @@ -19,7 +19,8 @@ extensions of a finite place with the corresponding induced module. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification 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 index 3b7353934b..1e374e5470 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/All.lean @@ -17,4 +17,3 @@ Public facade for the shared completion spine, action, product equivalence, and inclusion leaves. -/ -@[expose] public section 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 index 9c828be472..52ff4803df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Equiv.lean @@ -19,7 +19,8 @@ induced integer-unit module. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification 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 index 1a75de8856..63da9888c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Inclusion.lean @@ -19,7 +19,8 @@ multiplicative induced block and proves injectivity. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification 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 index d0081d590e..9dcef3c6f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/OutsideIntegralInduced/LocalInduction/Spine.lean @@ -21,7 +21,8 @@ structures used by every integral local-induction leaf. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean index 77ec507d9e..21c46fb21a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Reassociation.lean @@ -24,7 +24,8 @@ actions. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean index 7a271be5f8..6f75f85e6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SupportedBridge.lean @@ -30,7 +30,8 @@ relative ideles with the ordinary supported idele subgroup of `L`. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean index 4347ce36ef..612ca2d19f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension.lean @@ -25,4 +25,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean index 0fe030d8bb..850ea014c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/All.lean @@ -28,4 +28,3 @@ Public aggregate for base change, extension, and norm maps on ideles and idele classes. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean index 817d96b9ae..bb03c5e36d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/BaseChange.lean @@ -26,7 +26,8 @@ idele norm formal linear-algebra operations. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section variable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean index a5a8928a60..c406d98675 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/ClassGroup.lean @@ -26,7 +26,8 @@ quotients and prove it injective. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section variable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean index 06e3e5ca8e..9e928f8bf4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/EmbeddingNorm.lean @@ -22,7 +22,8 @@ product over all `K`-embeddings `L → M`. open scoped BigOperators TensorProduct open NumberField -noncomputable section +noncomputable +section namespace RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean index dae4c9183b..1bdc40df91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisDescent.lean @@ -25,7 +25,8 @@ the fixed subgroup with the embedded copy of `C_K`. open scoped NumberField open NumberField -noncomputable section +noncomputable +section variable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean index a112a71848..bdcf18f660 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/GaloisNorm.lean @@ -23,7 +23,8 @@ is the product of all Galois conjugates. open scoped BigOperators TensorProduct open NumberField -noncomputable section +noncomputable +section namespace RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean index b60b62180b..01fe192fcc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdealClass.lean @@ -26,7 +26,8 @@ ideal classes. open scoped NumberField TensorProduct nonZeroDivisors open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean index 8788b57918..377981b4e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleClassBaseChange.lean @@ -24,7 +24,8 @@ extension map on ordinary idele classes. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean index 39f3b6b059..0593d0b243 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNorm.lean @@ -22,7 +22,8 @@ field transports that existing norm to the usual map open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean index 7770a3ebc2..51b86e0124 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/IdeleNormComponents.lean @@ -25,7 +25,8 @@ forms of the local idele norm formula. open scoped BigOperators NumberField TensorProduct NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean index a57161fe89..5cb2a8b0ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/InfiniteOnePlaceBaseNorm.lean @@ -24,7 +24,8 @@ degree power. open scoped BigOperators NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean index da69a89b73..ea687b5e46 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalComponent.lean @@ -25,7 +25,8 @@ norm calculation to a genuine relative idele. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean index 2698500718..b88c62ec85 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/LocalNorm.lean @@ -22,7 +22,8 @@ this calculation to the canonical completion decomposition. open scoped BigOperators TensorProduct -noncomputable section +noncomputable +section namespace RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean index aa6d0ff323..0a91b3f6ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormLocalOrder.lean @@ -34,7 +34,8 @@ also concrete: open scoped NumberField ValuativeRel WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace FiniteIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean index 032caec992..d300294655 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/NormProperties.lean @@ -23,7 +23,8 @@ principal ideles and Galois conjugation. open scoped BigOperators open NumberField -noncomputable section +noncomputable +section namespace RelativeIdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean index 886dd8d17a..ca8043fe3d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Extension/OnePlaceBaseNorm.lean @@ -24,7 +24,8 @@ local-degree power. open scoped BigOperators NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean index 1d1ed96260..81bb684950 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FiniteMathlibTopologyComparison.lean @@ -23,7 +23,8 @@ continuous maps on local factors. open scoped NumberField RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean index 3cef96ff2a..017bc759cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/FinitePrime.lean @@ -27,7 +27,8 @@ class. These constructions are independent of class field theory. open scoped NumberField -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean index 111afbf89a..53a7a4921b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdealMap.lean @@ -24,7 +24,8 @@ the kernel with the ideles integral at every finite place. open scoped NumberField RestrictedProduct WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean index 85220e00c9..2e993b4539 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/IdentityComponent.lean @@ -21,7 +21,8 @@ class group as a closed normal subgroup and names the corresponding quotient. open scoped NNReal NumberField Topology -noncomputable section +noncomputable +section variable (K : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean index e459683ad1..b9e3404f6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/LocallyCompact.lean @@ -23,7 +23,8 @@ compact, and then applying the restricted-product theorem. open scoped NumberField RestrictedProduct Valued open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable (K : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean index b2cce55d9d..0ff2515d73 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Norm.lean @@ -23,7 +23,8 @@ compatible local determinant-norm preimages into a global relative idele. open scoped NumberField TensorProduct RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean index eaf18f1301..a136538015 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean index 323019709b..41ef4c6b3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/All.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormApproximation.InfinitePlaces /-! # Norm approximation at finite and infinite places -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean index 0bd18400c4..4b734c5444 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/FinitePlaces.lean @@ -39,7 +39,8 @@ none of the local conclusions is included as input data. open scoped NumberField NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean index 51211cfea1..0a8c27455e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormApproximation/InfinitePlaces.lean @@ -30,7 +30,8 @@ open scoped NumberField TensorProduct open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean index 2353969b40..6b4f60dca8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormCore.lean @@ -23,7 +23,8 @@ norm. This is the convention for which principal ideles have norm one. open scoped NumberField RestrictedProduct NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean index 44f865a893..1b92381628 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -27,7 +27,8 @@ open scoped NumberField Pointwise RestrictedProduct NNReal open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean index 843cfc330f..9113a7a663 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean index c5b27cfe89..6522fec314 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/All.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.NormTopology.NormOne /-! # Topological properties of idele norms -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean index d0d032e603..39adef7651 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ArchimedeanNorm.lean @@ -19,7 +19,8 @@ preserved by the ordinary norm in a finite number-field extension. open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean index 95a0fd13ee..153c173f58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/Continuity.lean @@ -29,7 +29,8 @@ uses the topological-group structure to obtain continuity everywhere. open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean index f8dda36069..dda8f8d35c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -21,7 +21,8 @@ reciprocity. open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean index 0e0de58c9d..59200d5cce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/FiniteNormArithmetic.lean @@ -26,7 +26,8 @@ finite positive norm under scalar extension. open scoped BigOperators NNReal NumberField NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean index f8ca564ba3..44ae4624d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/IdeleClassNorm.lean @@ -21,7 +21,8 @@ the norm-one idele-class subgroups. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace IdeleClassGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean index d2894b1cf4..25ebb31a09 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/NormOne.lean @@ -20,7 +20,8 @@ norm-one idele subgroups. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean index 8e2c359b50..8792fc2bbe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean @@ -24,7 +24,8 @@ open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean index 25876b02b0..c47b055b98 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean @@ -20,7 +20,8 @@ cohomology across that identification. @[expose] public section -noncomputable section +noncomputable +section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean index 05db230fd5..18f66c2420 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalCore.lean @@ -19,7 +19,8 @@ embedding of `Kˣ` into the idele group and the resulting idele class group. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable (K : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean index 41405fac47..675dbf274e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalNorm.lean @@ -21,7 +21,8 @@ copy of `Kˣ`, and hence descends to the idele class group. open scoped NumberField RestrictedProduct NNReal WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean index 28afb1643a..39a4b56832 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PrincipalTopology.lean @@ -26,7 +26,8 @@ whose topology is discrete. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean index 525e122425..32489fb35b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean index ea246ceda1..fc7593b268 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.I public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Idele.Relative.Support /-! # Relative ideles, tensor norms, and support -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean index d0f2219d13..cc27af332b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FiniteIntegralNormPreimage.lean @@ -35,7 +35,8 @@ input needed to assemble pointwise local norm preimages globally. open scoped NumberField TensorProduct ValuativeRel NNReal open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean index af85d48b77..459eb792aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/FinitePlaceTensorNorm.lean @@ -31,7 +31,8 @@ in that subgroup, and its corresponding local quotient class is one. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean index 8ac05de8c2..a84de42b95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/InfinitePlaceTensorNorm.lean @@ -23,7 +23,8 @@ finite-place tensor-norm comparison. open scoped NumberField TensorProduct NumberField.LiesOver open NumberField -noncomputable section +noncomputable +section open LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean index e54707b674..037a4aa106 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/SPlaces.lean @@ -30,7 +30,8 @@ relative idele group. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean index fb4c7cee6e..a89a188731 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Relative/Support.lean @@ -31,7 +31,8 @@ integral compatibility of the relative tensor decomposition. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean index a7de1e691e..2e7bdfba3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/RestrictedProductUnitsTopology.lean @@ -23,7 +23,8 @@ has the restricted-product topology of the local unit groups. open Filter open scoped RestrictedProduct -noncomputable section +noncomputable +section namespace RestrictedProduct @@ -102,47 +103,51 @@ noncomputable def unitsContinuousMulEquiv (Πʳ i, [(R i)ˣ, (Submonoid.ofClass (B i)).units]) := by let e := unitsEquiv (B := B) (𝓕 := cofinite) R refine { toMulEquiv := e, continuous_toFun := ?_, continuous_invFun := ?_ } - · 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 + · 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 z + intro y + apply Units.ext apply RestrictedProduct.ext intro i rfl - rw [← hx] - exact (isOpenEmbedding_units_inclusion (B := B) hBopen hT).continuousAt_iff.mp - hLocal.continuousAt - · 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 index 14da130799..d6483965e6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SPlaces.lean @@ -22,7 +22,8 @@ archimedean place is always included, a finite set open scoped NumberField RestrictedProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean index 89b9f2b5c1..8a84f80f96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -23,7 +23,8 @@ relative idele. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace IdeleGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean index c0bfc40915..d90c6034f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean @@ -32,7 +32,8 @@ union of the (finite) supports of those representatives is a finite set open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean index 4880c58349..5349bf41ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Topology.lean @@ -20,7 +20,8 @@ component map. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable (K : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean index a01dc4b3c6..8764af78ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NormalClosure.lean @@ -20,7 +20,8 @@ the original field is embedded by the canonical chosen lift. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean index 4a949f2aae..826aa8bfc7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField.lean @@ -26,4 +26,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.N /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean index 1d6eb19cd0..d55f552bf9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/All.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.N public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.NumberField.TameDifferentTrace /-! # Finite and everywhere-unramified towers of number fields -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean index 92a96c7521..1093b89678 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedEtaleBridge.lean @@ -20,7 +20,8 @@ notions of formal unramifiedness and étaleness for rings of integers. open scoped NumberField -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean index e3db7154ec..50bab5ed19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/FiniteUnramifiedTower.lean @@ -21,7 +21,8 @@ proved from multiplicativity of ramification indices. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section attribute [local instance] Ideal.Quotient.field diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean index 4d8b523a80..985745cb57 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/GaloisDifferentBound.lean @@ -27,7 +27,8 @@ an assumed different-exponent formula is used. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean index c7ed65a2ca..f4caded7f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/PlaceEquiv.lean @@ -18,7 +18,8 @@ equivalences reindex placewise products without changing their mathematics. @[expose] public section -noncomputable section +noncomputable +section open scoped NumberField open NumberField IsDedekindDomain diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean index eae8233c2a..d85291aafd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/SupportedDiscriminantBound.lean @@ -30,7 +30,8 @@ whole extension degree. open scoped NumberField open NumberField UniqueFactorizationMonoid -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean index 9e31d95216..716f97c183 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/NumberField/TameDifferentTrace.lean @@ -29,7 +29,8 @@ factor cannot divide the different. The factor need not be prime. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Discriminant diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean index d88141ec12..9873c99588 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.P /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean index c08337d3dd..c6f03ad5e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/All.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.P public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.PowerResidueSymbols.Ideal /-! # Power residue symbols over finite fields and ideals -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean index 0d640cf731..5ff4a6db24 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/PowerResidueSymbols/Ideal.lean @@ -26,7 +26,8 @@ For a nonzero integral ideal `I`, `(a/I)` is the finite product of open scoped NumberField BigOperators open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace PowerResidueSymbols diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean index b6e77a1341..ae22a11fca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean index d6acd3479f..ef937a4e90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/All.lean @@ -19,4 +19,3 @@ Public aggregate for finite ramification support, rational prime ideals, everywhere-unramified rational extensions, and global degree bounds. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean index b6c48fbb60..1eaafde4e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeFromChosenPrimes.lean @@ -19,7 +19,8 @@ finite-prime inertia, and the finite abelian product bound. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean index 1ef26ab03a..ae7fc3081e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/DegreeProduct.lean @@ -20,7 +20,8 @@ group calculation from the arithmetic construction of the chosen primes. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean index f105f91a48..19232d48c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/FiniteRamifiedPrimes.lean @@ -17,7 +17,8 @@ height-one primes of either the extension ring or the base ring ramify. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] FractionRing.liftAlgebra FractionRing.isScalarTower_liftAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean index 6e346e5b82..9e19bb988a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/RationalPrime.lean @@ -17,7 +17,8 @@ rational prime with its usual principal ideal. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean index 1c650dd577..71172b9799 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean index 3747b3b9ae..47d3fdc111 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/All.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.Ramification.Splitting.PrimeOrderFixedField /-! # Splitting of finite places in field extensions -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean index c08a5114b6..663f714ecb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlace.lean @@ -30,7 +30,8 @@ degree one. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean index 0fb99a4321..55aaed458b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/FinitePlaceIdeal.lean @@ -24,7 +24,8 @@ normal-closure splitting reductions. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean index b066586148..4c947d9a13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/NormalClosure.lean @@ -37,7 +37,8 @@ completely already in `M`. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean index eb724e962b..a2dd44f7d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/Splitting/PrimeOrderFixedField.lean @@ -29,7 +29,8 @@ completely in `L / K'`. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open AlgebraicNumberTheory.Valuations open HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean index 02b3c630c2..2e6b23cf76 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Ramification/UnramifiedRationals.lean @@ -19,7 +19,8 @@ prime ideals of the ring of integers. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Ramification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean index ef5d46f052..7a30b7d344 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass.lean @@ -22,4 +22,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean index 6104060103..5aa54ea5d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/All.lean @@ -25,4 +25,3 @@ Public aggregate for approximation, congruence subgroups, and ray class groups of number fields. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean index 7a70f792c9..0073f6d5d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Approximation.lean @@ -21,7 +21,8 @@ move a given idele into all of those cosets by a single principal idele. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean index abc33b7b93..98f5690d5a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Basic.lean @@ -21,7 +21,8 @@ A full modulus, including a selected set of real places, is defined in open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean index 4bde655142..d1f15acc1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/FullModulus.lean @@ -20,7 +20,8 @@ idèle-class congruence subgroups without fixing an archimedean convention. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean index 4b3984c4ba..044dc9128d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Ideal.lean @@ -26,7 +26,8 @@ develops the approximation maps used in ray-class ideal constructions. open scoped NumberField WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean index 2cbe7545bc..bfc600428b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/IdealNorm.lean @@ -34,7 +34,8 @@ principal ray ideals, is the norm-defined ideal group open scoped BigOperators NumberField Topology open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean index fd9ddf5a51..76b7622151 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/LocalConductor.lean @@ -21,7 +21,8 @@ global class field. open scoped NumberField -noncomputable section +noncomputable +section namespace RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean index c40cdf3212..ad83142902 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Narrow.lean @@ -19,7 +19,8 @@ global unit signs through the narrow and ordinary class groups. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean index 2dfb2fae44..31aa8ceddb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/OrdinaryClassGroupComparison.lean @@ -23,7 +23,8 @@ finite-prime classes. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory @@ -51,10 +52,11 @@ private theorem ordinary_rayPrincipalIdealSubgroup_eq_range : rw [rayPrincipalIdealSubgroup, hSet] _ = _ := Subgroup.closure_eq _ -private noncomputable def ordinaryRayIdealsEquiv : +/-- For the trivial modulus, every fractional ideal is prime to the modulus. -/ +noncomputable def ordinaryRayIdealsEquiv : rayClassPrimeToIdeals (ordinaryRayClassModulus K) ≃* NumberFieldFractionalIdealGroup K := - (MulEquiv.subgroupCongr ordinary_rayClassPrimeToIdeals_eq_top).trans + (MulEquiv.subgroupCongr (by exact ordinary_rayClassPrimeToIdeals_eq_top)).trans Subgroup.topEquiv private theorem ordinaryRayIdealsEquiv_apply @@ -91,7 +93,7 @@ noncomputable def ordinaryRayClassGroupEquivClassGroup : (rayPrincipalIdealSubgroupInPrimeTo (ordinaryRayClassModulus K)) (toPrincipalIdeal (𝓞 K) K).range ordinaryRayIdealsEquiv - ordinary_rayPrincipalIdealSubgroup_map).trans + (by exact ordinary_rayPrincipalIdealSubgroup_map)).trans (ClassGroup.equiv K).symm /-- The equivalence takes the ordinary ray class of a finite prime to the diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean index 098c0b1b11..3c1e15cba1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PrimeGeneration.lean @@ -20,7 +20,8 @@ Frobenius-normalized ray reciprocity maps. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean index af3631a1e4..538d7344be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/PublicHigherUnitComparison.lean @@ -21,7 +21,8 @@ comparison at the boundary between the two APIs. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean index 9f022c8c72..7f1240452a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -28,7 +28,8 @@ isomorphism with `(ZMod m)ˣ`. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace RayClass diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean index e912ecbd92..de4f89218f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Topology.lean @@ -28,7 +28,8 @@ open scoped NumberField RestrictedProduct WithZero open NumberField IsDedekindDomain open Topology -noncomputable section +noncomputable +section variable {K : Type*} [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean index 7c39d7de8c..45e187840c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.S /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean index ef0c21a0ba..6a7593e2a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/All.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.S Public aggregate for the rank and logarithmic-lattice theory of S-units. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean index 85b5775bee..5aba812cfd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -26,7 +26,8 @@ open IsDedekindDomain Module open CyclicCohomology.ProfiniteCohomology.Herbrand open CyclicCohomology -noncomputable section +noncomputable +section variable (K L : Type*) [Field K] [NumberField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index d26f7a39b5..bc21577aa5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -24,7 +24,8 @@ permutation-lattice calculation. open scoped BigOperators NumberField nonZeroDivisors Pointwise open IsDedekindDomain Module -noncomputable section +noncomputable +section open CyclicCohomology.ProfiniteCohomology.Herbrand open CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean index bec7b27807..5a1376d8a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/LogLattice.lean @@ -27,7 +27,8 @@ lattice. @[expose] public section -noncomputable section +noncomputable +section open IsDedekindDomain Module open scoped NumberField nonZeroDivisors @@ -1197,7 +1198,7 @@ noncomputable def rootsOfUnityEquivTorsion : open scoped Classical in /-- A linear section of the quotient by torsion. It exists because the quotient is a free, hence projective, `ℤ`-module. -/ -private noncomputable def torsionQuotientSection : +noncomputable def torsionQuotientSection : FreeQuotient (K := K) S →ₗ[ℤ] Additive (SUnitGroup (K := K) S) := (Module.projective_lifting_property @@ -1218,7 +1219,7 @@ private theorem torsionQuotientSection_spec : open scoped Classical in /-- Splitting the exact sequence consisting of torsion, the `S`-unit group, and its torsion-free quotient. -/ -private noncomputable def torsionProdFreeQuotientEquiv : +noncomputable def torsionProdFreeQuotientEquiv : Additive (SUnitGroup (K := K) S) ≃ₗ[ℤ] TorsionAdditive (K := K) S × FreeQuotient (K := K) S := @@ -1226,7 +1227,9 @@ private noncomputable def torsionProdFreeQuotientEquiv : (TorsionAdditive (K := K) S).injective_subtype (by rw [Submodule.range_subtype, Submodule.ker_mkQ]) - (torsionQuotientSection_spec (K := K) S)).symm + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean index c9039ec4da..137dd31d39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Rank.lean @@ -23,7 +23,8 @@ understood to be present. @[expose] public section -noncomputable section +noncomputable +section open IsDedekindDomain open scoped NumberField nonZeroDivisors diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean index c90b4b5d92..33d4af16c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SeparableClosureEmbedding.lean @@ -18,7 +18,8 @@ chosen separable closure of its base field. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean index 8368f9255f..f97a1fd60a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/TensorProduct.lean @@ -27,7 +27,8 @@ dimension of the tensor product. open scoped TensorProduct -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean index 25dcdc8678..112b4d697a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/All.lean @@ -36,4 +36,3 @@ For a smaller production dependency closure, import `KroneckerWeber` directly. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean index d8870164b2..6350ab8a81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorem /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean index 4a9483b324..a15c06360c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/All.lean @@ -22,4 +22,3 @@ definition leaves. Topic-level `All` modules and this root module are aggregation-only, and no public definition imports an implementation module. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean index 8902e28edc..7dbde4630f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields.lean @@ -31,4 +31,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsA /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean index 6814cdfa74..9f420859fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/All.lean @@ -30,4 +30,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsA /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean index 46a86800f0..e7cd3ea152 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNorm.lean @@ -21,7 +21,8 @@ rule to a multiplicative map on all nonzero fractional ideals. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean index 2b2e6a3235..240ff9aa94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/FractionalIdealNormExponentMap.lean @@ -24,7 +24,8 @@ degree. The resulting map on finitely supported exponent vectors is additive. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean index c96bd4dd66..a4695342e6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/IsRayCongruent.lean @@ -17,7 +17,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsA open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean index 89a7f90a54..bfda24181d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowClassGroup.lean @@ -22,7 +22,8 @@ ideal-theoretic definition does not depend on the ray class group. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean index 90d0864ff2..cb553b2c5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/NarrowRayClassModulus.lean @@ -14,7 +14,8 @@ public import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification @[expose] public section -noncomputable section +noncomputable +section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean index e3f8879f3a..9a150d4fb4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayArtin.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.ConductorsA @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory.RayClassFieldRealization diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean index a7b4369d70..4dabe97258 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealModulusProjection.lean @@ -23,7 +23,8 @@ ideals give the canonical quotient map from the larger modulus to the smaller. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory @@ -120,7 +121,7 @@ def rayClassIdealModulusProjection {m n : RayClassModulus K} (hmn : m ≤ n) : RayClassGroup n →* RayClassGroup m := by let hI : rayClassPrimeToIdeals n ≤ rayClassPrimeToIdeals m := - rayPrimeToIdeals_antitone hmn + by exact rayPrimeToIdeals_antitone hmn letI : (rayPrincipalIdealSubgroupInPrimeTo m).Normal := Subgroup.normal_of_isMulCommutative _ refine QuotientGroup.map @@ -132,6 +133,6 @@ def rayClassIdealModulusProjection rayPrincipalIdealSubgroup n at hI' change (I : NumberFieldFractionalIdealGroup K) ∈ rayPrincipalIdealSubgroup m - exact rayPrincipalIdeals_antitone hmn hI' + 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 index 2dab4d4336..b0583b6bcb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassIdealNorm.lean @@ -24,7 +24,8 @@ identify ideal norms with idèle-class norms. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean index 11de337828..87d3d9cae1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassModulus.lean @@ -22,7 +22,8 @@ A modulus consists of finite-prime exponents and a finite set of real places. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean index c24ae5d09c..32c5fad159 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassOfFinitePrime.lean @@ -19,7 +19,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAn open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory @@ -42,7 +43,7 @@ def rayClassOfFinitePrime (v : HeightOneSpectrum (𝓞 K)) (hv : v ∉ m.finitePart.support) : RayClassGroup m := QuotientGroup.mk' (rayPrincipalIdealSubgroupInPrimeTo m) - ⟨finitePrimeFractionalIdeal v, finitePrimeFractionalIdeal_mem_primeTo m v hv⟩ + ⟨finitePrimeFractionalIdeal v, by exact finitePrimeFractionalIdeal_mem_primeTo m v hv⟩ /-- The ordinary ideal class represented by a finite prime. -/ def ordinaryRayClassOfFinitePrime diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean index a1c5725db3..9b154703c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquiv.lean @@ -19,7 +19,8 @@ the first isomorphism theorem. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean index 82df7592cf..3a766ab245 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/ConductorsAndRayClassFields/RayLocalHigherUnitGroup.lean @@ -17,7 +17,8 @@ public import Mathlib.RingTheory.Ideal.Quotient.Operations open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean index a5836f4a21..c6355f8221 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAn /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean index 5a8407a41f..9fe4445457 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/All.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.FrobeniusAn /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean index bb10f54402..d42e591a56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAt.lean @@ -19,7 +19,8 @@ public import Mathlib.RingTheory.Frobenius open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean index 6af3acbe52..454c0ea13a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/FinitePrimeFractionalIdeal.lean @@ -18,7 +18,8 @@ public import Mathlib.RingTheory.DedekindDomain.Factorization open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean index a0ea8430f2..6e9e7811ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/FrobeniusAndHilbertClassFields/NumberFieldFractionalIdealFactorization.lean @@ -24,7 +24,8 @@ entirely in Mathlib and public Definitions vocabulary. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean index 8cba5ca69c..62c0aca3e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.GlobalClass /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean index da358172a1..972c84ba48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/All.lean @@ -19,4 +19,3 @@ This module collects the reader-facing finite and topological vocabulary. It imports definitions only; assertions are in the corresponding `Theorems` module. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean index 8635883994..19dcc1bd3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianExtension.lean @@ -18,7 +18,8 @@ separable closure. It contains no class-field-theory implementation. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean index fff3b62812..229a15f88b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquiv.lean @@ -19,7 +19,8 @@ This is the specific isomorphism induced by the Artin map in open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean index 998aa91525..75f33a0949 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/GlobalClassFieldTheory/FinitePlaceTensorNormSubgroup.lean @@ -23,7 +23,8 @@ factors above `v`; it does not choose a single completion of `L`. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean index 6a6a69d612..b79e6c7244 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.Up /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean index 126707d84f..d499a6e1c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/All.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.Up /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean index ce8c73c91d..a1c3e49a67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunction.lean @@ -20,7 +20,8 @@ identity. Its slope on `(m, m + 1)` is `|G_(m+1)| / |G_0|`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean index 18c4553c0d..a779406472 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/HerbrandFunctionAtLowerIndex.lean @@ -19,7 +19,8 @@ public import Mathlib.SetTheory.Cardinal.Finite open scoped BigOperators -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean index b21d463997..752a67fe55 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -20,7 +20,8 @@ local extensions in the theorem layer. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean index f9a2dd17a6..31a84a89b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/IsUpperRamificationJump.lean @@ -17,7 +17,8 @@ at the index itself. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean index 3947eb7dfa..3628205f05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/LowerRamificationGroup.lean @@ -13,7 +13,8 @@ public import Mathlib.RingTheory.Valuation.RamificationGroup @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean index 160c8456be..3769f86b27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/RealLowerRamificationGroup.lean @@ -20,7 +20,8 @@ and natural indices recover the usual `m^(n+1)` displacement condition. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean index 6aa5052090..513fc89050 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/UpperRamificationGroup.lean @@ -17,7 +17,8 @@ Herbrand index `ψ(t)`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean index 7458a61140..3cc92a2560 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols.lean @@ -25,4 +25,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymb /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean index 2076a443df..a2dbf6ae70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/All.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HilbertSymb /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean index e9e7872c03..be4c954230 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalHilbertPairingFiniteFactor.lean @@ -18,7 +18,8 @@ public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalHilbertPairingFamily diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean index 234f377441..4cbffb6290 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/GlobalInfinitePlaceHilbertSymbol.lean @@ -17,7 +17,8 @@ public import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean index ae61151024..809bf61406 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HilbertSymbols/KummerAlgebraNormSubgroup.lean @@ -18,7 +18,8 @@ irreducibility assumption on the polynomial. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean index 3c63ee40cc..327c0e8957 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassF /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean index b7bc8045a3..7a95c674ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/All.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassF /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean index 15dee1becc..21469708b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormHom.lean @@ -13,7 +13,8 @@ public import Mathlib.RingTheory.Norm.Basic @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean index bf4d5cd31f..ad10f4e692 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormQuotient.lean @@ -14,7 +14,8 @@ public import Mathlib.GroupTheory.QuotientGroup.Basic @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean index f89d2b0288..d837c2652a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FieldNormSubgroup.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassF @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean index bc7b3ab542..8455ea1ec1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/FiniteAbelianLocalExtension.lean @@ -15,7 +15,8 @@ public import Mathlib.FieldTheory.IsSepClosed @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean index fdd7189ed6..39a56ebbe9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/LocalClassFieldTheory/IsFieldNorm.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.LocalClassF @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean index 3b2771386e..2807dcb61a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorem /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean index e3dabefc99..26cb431c64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/NormTheorems/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.NormTheorem /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean index 064c0d91ea..7cdbc7c9ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean index 818c8214f4..3d88cd7c39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/All.lean @@ -20,4 +20,3 @@ Artin maps, decomposition, and principalization. Reader-facing statements are collected in `ClassFieldTheory.Theorems.GlobalClassFieldTheory.All`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean index f1cee534bd..e3ae1152c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean index a58fa5a5e3..8436693e7b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/All.lean @@ -24,4 +24,3 @@ This aggregate exports the cyclic idele-class norm-index calculation, the Hasse norm principle, and the rational idele-class formation. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean index 6544d05ff3..fcd88f0720 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/CyclicIdeleClassNormIndex.lean @@ -41,7 +41,8 @@ principal relative ideles. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean index b1b406c281..60af3ee84f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/HasseNormPrinciple.lean @@ -40,7 +40,8 @@ follows from degree-minus-one Tate-cohomology vanishing. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean index f3833fead3..8d90939dc6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassFormation.lean @@ -27,7 +27,8 @@ open NumberField open CyclicCohomology ClassFormation open LocalClassFieldTheory -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean index 3777aea984..99e08a8669 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean index 9e9551a174..626e3a83ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/All.lean @@ -21,4 +21,3 @@ This aggregate preserves the public import path while the implementation is organized by the mathematical stages of the norm-index argument. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean index a498f1b2ba..e74e94ef78 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/ArchimedeanPowerIndex.lean @@ -24,7 +24,8 @@ open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean index a29435db46..e6b37ffbeb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlaceCompletionInstances.lean @@ -22,7 +22,8 @@ arithmetic. open scoped NumberField ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean index f2e86dbc01..f03e95be85 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/FinitePlacePowerIndex.lean @@ -35,7 +35,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField renaming open scoped NumberField NNReal ValuativeRel TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean index 2dd08b1001..38952c6bcf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/LocalResidueArithmetic.lean @@ -46,7 +46,8 @@ open scoped NumberField NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean index c44d43927c..e00fafa990 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/NormContainment.lean @@ -38,7 +38,8 @@ open KummerTheory open LocalFieldTheory open LocalFieldTheory.IsNonarchimedeanLocalField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index e9a0f4bde2..2f637e5819 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -30,7 +30,8 @@ open KummerTheory open LocalFieldTheory open LocalFieldTheory.IsNonarchimedeanLocalField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean index 0191db485d..a4103ce841 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedIdeleIndex.lean @@ -25,7 +25,8 @@ open KummerTheory open LocalFieldTheory open LocalFieldTheory.IsNonarchimedeanLocalField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean index c681403d5f..48f960908c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/SupportedPrincipalQuotient.lean @@ -27,7 +27,8 @@ open KummerTheory open LocalFieldTheory open LocalFieldTheory.IsNonarchimedeanLocalField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index d524d48b32..e1d31e3d96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -29,7 +29,8 @@ open HilbertRamification open KummerTheory open LocalFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean index db5d866195..b1b5ba6ecd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitSubgroup.lean @@ -22,7 +22,8 @@ open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean index 852f6e7a03..6d54c95d04 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/KummerLocalNormContainment.lean @@ -28,7 +28,8 @@ open HilbertRamification open KummerTheory open LocalFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean index 78222ea456..55eb72a150 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/MathlibNormInterface.lean @@ -22,7 +22,8 @@ Hasse norm theorem into the implementation-independent predicates in open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean index a062682721..a54b70954f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean index 57f67ed44f..de4afd9a65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/All.lean @@ -21,4 +21,3 @@ selection, decomposition-field identifications, and the final local-power kernel theorem. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean index 0bb2b8f35e..a745247674 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/BasePlaceSelection.lean @@ -23,7 +23,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean index 96bb3e0e20..41feee1439 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/Conclusion.lean @@ -22,7 +22,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean index f2e1480a7e..53367847d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/CoordinatePlaces.lean @@ -22,7 +22,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean index 463a4027c8..b527bf2c35 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/DecompositionFields.lean @@ -23,7 +23,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 5c2245cdc9..be678cad74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -23,7 +23,8 @@ The results are independent of the S-unit Kummer construction. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean index 808c3d032d..7e418af82b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/PrimeSet.lean @@ -20,7 +20,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean index c399658eb2..dbd63a9a28 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/RestrictionKernel.lean @@ -21,7 +21,8 @@ open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean index 550846d7b6..efc9dad3ae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitLocalPowerMap.lean @@ -35,7 +35,8 @@ open HilbertRamification open KummerTheory open LocalFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean index 49b44d8ad9..4ee76af52c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean @@ -22,7 +22,8 @@ open scoped NumberField NNReal IsMulCommutative open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.ClassFieldAxiom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean index 3b64e56270..9971dd26a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean index ec73d63b07..070e1bc320 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. # Cohomological tools for global class field theory -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean index f6a8877503..eba59f1d1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CofinitelySplitFiniteExtension.lean @@ -26,7 +26,8 @@ conclusion. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean index bf1a21bb93..1d9864a7fb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/CyclicPrimePowerFullDecomposition.lean @@ -30,7 +30,8 @@ class norm is surjective. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index bb877bab42..21f924946a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -43,7 +43,8 @@ sequence from `S`-units to supported ideles and idele classes. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section open RelativeIdeleGroup.Cohomology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean index 375f1a05b2..9aaba28960 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields.lean @@ -87,4 +87,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean index 1c38652988..00f7421e9a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -34,7 +34,8 @@ and the chosen local Artin map on one-place ideles. open scoped NumberField NumberField.LiesOver -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean index 1bd977adc2..31ead1e4e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorRamification.lean @@ -20,7 +20,8 @@ contained in that locus. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean index 33bc53dca5..2edfb60e5e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianLocalConductorComparison.lean @@ -23,7 +23,8 @@ conductor exponent of the chosen localized extension. open scoped NumberField NNReal ValuativeRel -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean index 701289d63d..307bde63c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianNormConductor.lean @@ -28,7 +28,8 @@ unramifiedness. open scoped NumberField NNReal ValuativeRel -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean index f004d47729..2ddb201804 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/All.lean @@ -92,4 +92,3 @@ theory, and the actual big and small Hilbert class fields with their maximality and reciprocity characterizations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean index 2347e8cdd4..909f10c37b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticClassFieldCorrespondence.lean @@ -30,7 +30,8 @@ are fixed rather than merely asserted to exist. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean index 6b9a38324d..e88ff144d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticHilbertClassFieldReciprocity.lean @@ -28,7 +28,8 @@ factor remains a `ContinuousMulEquiv`. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean index 209c242e9e..430c0e545c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticRayClassFieldReciprocity.lean @@ -22,7 +22,8 @@ quotient topology. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean index d0e2442d33..62b21ce274 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ArithmeticUnramifiedPrimeArtin.lean @@ -23,7 +23,8 @@ prime idèle maps to arithmetic Frobenius. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean index 55b1d9a1e2..101da29740 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassField.lean @@ -22,7 +22,8 @@ the narrow finite conductor/ramification criterion. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean index 1b7924e638..3c65e5e16f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldMathlibArtin.lean @@ -26,7 +26,8 @@ reciprocity therefore gives its narrow-class-group Artin isomorphism. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean index dfdd266d1b..b499f156e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldNaturality.lean @@ -23,7 +23,8 @@ group, with formulas on genuine idele representatives. open scoped NumberField NumberField.LiesOver TensorProduct -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean index 6bac7113f3..0b776e7b70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/BigHilbertClassFieldOverOriginalBase.lean @@ -21,7 +21,8 @@ number field, with degree equal to the narrow class number. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean index d3f491770b..878aab1c5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClassFieldRealization.lean @@ -21,7 +21,8 @@ carried by the abstract package, so this actual extension is abelian Galois. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean index b236fe7aba..7d82ebfedd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldConstruction.lean @@ -22,7 +22,8 @@ leaves so their elaboration environments do not remain resident here. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean index 58b39742ca..d10de7dad2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldNormRange.lean @@ -18,7 +18,8 @@ idèle-class norm range over the canonical fixed-field base. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean index 32889aa923..de83b54dd2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldOriginalField.lean @@ -18,7 +18,8 @@ canonical norm-range computation back to the original idèle class group. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean index f52d1f1545..609b42fcdf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean index e589a9f365..5ca71b129b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean index 717eae7b34..927e005f09 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/All.lean @@ -15,4 +15,3 @@ This facade exports the underlying multiplicative equivalence of the already compiled topological reciprocity provider and its evaluation formula. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean index 04e1710c90..67aeca153f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Construction.lean @@ -23,7 +23,8 @@ global reciprocity instance tower. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean index f58244e230..543fb8455e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Algebraic/Evaluation.lean @@ -19,7 +19,8 @@ is inherited without reconstructing the selected class-field instance tower. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean index 2d1df23f2f..a346bde406 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/All.lean @@ -20,4 +20,3 @@ prevents downstream ray-class-field consumers from rebuilding the entire reciprocity layer as one declaration block. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean index 2888befe5c..d570a6db4f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Degree.lean @@ -19,7 +19,8 @@ idèle-class norm range. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean index a2d69fea91..fb84c130d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/GlobalNormResidue.lean @@ -19,7 +19,8 @@ the global norm-residue symbol to the corresponding quotient class. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean index 50d684d7aa..724d96e998 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean index 7f2caf1945..6008568202 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/All.lean @@ -18,4 +18,3 @@ This facade exports the generic norm-range transport, the continuous reciprocity composite, and its evaluation law. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean index 2cd00828a6..e160c76374 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Construction.lean @@ -20,7 +20,8 @@ instances are reconstructed here. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean index 35a0316045..0f52ffa6bf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/Evaluation.lean @@ -18,7 +18,8 @@ the generic transported-reciprocity calculation. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean index 8fc06cb1ff..8aeaa50d86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationCore.lean @@ -19,7 +19,8 @@ domain-specific selected-field construction. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean index c1fc1bad0f..01a5708949 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/EvaluationValue.lean @@ -20,7 +20,8 @@ equivalent to the historical formula. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean index 2b6c2854e7..b966e8d861 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ClosedFiniteIndexClassFieldReciprocity/Topological/QuotientTransport.lean @@ -18,7 +18,8 @@ instances or domain-specific class-field tower are required. @[expose] public section -noncomputable section +noncomputable +section namespace QuotientGroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean index 23cf6215a9..05b319724b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/Conductor.lean @@ -28,7 +28,8 @@ assemble into a genuine finitely supported modulus. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean index a00c6a44e0..9e944d195f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -28,7 +28,8 @@ forces the narrow finite conductor ray prime class itself to be trivial. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean index 57349a2ed2..ee135a90c2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorInfinitePart.lean @@ -19,7 +19,8 @@ contained in the target subgroup. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean index bc32e491fe..cdb65b22a6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLattice.lean @@ -22,7 +22,8 @@ complementary divisibility by the pointwise minimum. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean index 8e1df58b3d..923e7ce8f9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorLocalComparison.lean @@ -26,7 +26,8 @@ component. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean index a5349a44d6..2c0052f7d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorPrimeArtin.lean @@ -23,7 +23,8 @@ compatibility, order relations, and maximal ray-class criteria. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean index 0863dfb383..1b36942edc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean @@ -21,7 +21,8 @@ conductor ray-class presentations are maximal. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean index f0d0c6831a..b228f6a126 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorSupport.lean @@ -34,7 +34,8 @@ corollary. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean index 24185fd591..714e8e7c3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicConductorUniqueness.lean @@ -21,7 +21,8 @@ cyclic class-field correspondence at a fixed narrow finite conductor. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean index 743ba358f2..c61717ded4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormConductor.lean @@ -22,7 +22,8 @@ residual norm-subgroup image order and the extension degree. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean index 4b5db0305f..4c31c15633 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicNormTower.lean @@ -21,7 +21,8 @@ sequence and its exact cardinal factorization. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean index 7a6c4b296f..a36c4e5a79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean @@ -25,7 +25,8 @@ subgroup at its narrow finite conductor. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean index a120a76e6b..e119aeba51 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclotomicKummerNormDescent.lean @@ -32,7 +32,8 @@ open scoped NumberField open NumberField IsDedekindDomain open KummerTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean index 211a73bb1a..94e8587a23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/EmbeddedAbelianSubextension.lean @@ -23,7 +23,8 @@ needed by concrete class-field realizations. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean index 1d3f03cc81..b4f0f7a203 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldContainment.lean @@ -37,7 +37,8 @@ number field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean index d642e6d6c9..38ce165ed0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondence.lean @@ -29,7 +29,8 @@ correspond to products. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean index 09b591271a..98206c417f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteAbelianClassFieldCorrespondenceTopology.lean @@ -28,7 +28,8 @@ by `ClosedFiniteIndexClassField`. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean index 7c775d5a20..cfc4f5d31c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FiniteIndexNormClassField.lean @@ -30,7 +30,8 @@ field, as an exact determinant-norm subgroup. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean index b96ee4201f..ea71cf6cd9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FinitePlaceArtinQuotient.lean @@ -21,7 +21,8 @@ group. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean index ba8ee64333..6b3b0aa7df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/FullConductorRayClassField.lean @@ -21,7 +21,8 @@ minimality theorem for the full conductor. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean index 251cb550da..77cb526bd4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -21,7 +21,8 @@ description of the kernel of that transition. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean index 6485c7cc7d..0d1a29fba1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximalSubextension.lean @@ -30,7 +30,8 @@ big Hilbert class field by the order-reversing finite classification. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean index 5a409ac474..7ee3a09ac8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean @@ -21,7 +21,8 @@ extension has the canonical Hilbert reciprocity quotient. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean index bbf4c12b36..704668d2b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean @@ -25,7 +25,8 @@ prime ideal. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean index a20c71a670..9cb0bc1363 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldRealization.lean @@ -36,7 +36,8 @@ the ordinary class number for the small Hilbert class field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean index a06f1ee7d1..dfd7ff09b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean index c138a650b5..cffe26db20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/All.lean @@ -19,4 +19,3 @@ independently compiled big/small, realized-base/original-base reciprocity specializations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean index 8387ed2676..29af99c908 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -20,7 +20,8 @@ field of the selected big Hilbert class field. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean index 120b70466e..f632442433 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigOriginal.lean @@ -19,7 +19,8 @@ specialization and reuses the shared reciprocity transport provider. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean index ecbfa7ff35..c90bbd7a27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -19,7 +19,8 @@ field of the selected small Hilbert class field. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean index 1237372a2d..b7ca3b8f43 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallOriginal.lean @@ -19,7 +19,8 @@ specialization and reuses the shared reciprocity transport provider. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean index 6c4087851c..6ffb3167f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/Transport.lean @@ -20,7 +20,8 @@ composite. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean index 26a59cd4ca..6ccb1ccb44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldUnramifiedMaximality.lean @@ -27,7 +27,8 @@ unramifiedness at every finite prime. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean index ce5805455f..d9624b5a10 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertNormCharacterization.lean @@ -26,7 +26,8 @@ factorization and the resulting divisibility of orders. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean index c0643877ed..281010aec1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/InfiniteAbelianClassFieldCorrespondence.lean @@ -20,7 +20,8 @@ order-reversing infinite abelian class-field correspondence. open scoped NumberField -noncomputable section +noncomputable +section namespace ClosedSubgroup diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean index a1c9da8261..11c8df0971 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/KummerNormDescent.lean @@ -35,7 +35,8 @@ extension and then viewed over the original number field. open scoped BigOperators NumberField NumberField.LiesOver open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean index fe335f4387..31fec13f48 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean @@ -51,7 +51,8 @@ Frobenius at every unramified finite prime. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean index b5c3525194..056c36b394 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibGlobalReciprocity.lean @@ -37,7 +37,8 @@ class-field existence, and infinite correspondence modules without adding parallel names or existence wrappers. -/ -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean index 948b1dbd86..8ad13c14c1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormConductor.lean @@ -36,7 +36,8 @@ is deliberately not defined here. open scoped NumberField IsMulCommutative -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean index 4acd143e01..92e367f0f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean @@ -31,7 +31,8 @@ the distinguished copy `E` back to the original field `L`. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean index 92e5fcdaaf..ca6a9139c9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -21,7 +21,8 @@ conductor, equivalently the two finite quotient groups have the same order. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean index 830c417712..e81158472f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormTowerConductor.lean @@ -32,7 +32,8 @@ conductor. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean index fc088d3008..fc1b8d6a45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/OrdinaryNormClassField.lean @@ -27,7 +27,8 @@ so its conclusion is an equality of genuine determinant-norm ranges. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean index cff3008db3..ddf8cb7fa6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PowerCongruenceCore.lean @@ -31,7 +31,8 @@ global class fields. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean index ac89eea66b..801f86a879 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealArtinKernelComparison.lean @@ -24,7 +24,8 @@ ideal-theoretic Artin map on the same ray modulus. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean index 37014783f9..367b2074ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormArtinKernel.lean @@ -24,7 +24,8 @@ argument and is not asserted here. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean index f230c28fa8..db9fdd4c2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicIdealNormQuotientComparison.lean @@ -22,7 +22,8 @@ file records the exact comparison, including the principal-ray kernel. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean index 989f4a2ae9..de365156e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/PublicRayClassComparison.lean @@ -38,7 +38,8 @@ ray-class-field statements in the parent `Theorems` directory. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.GlobalClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean index e7e6afd5e7..aa46d27c86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RationalRayPrimeClass.lean @@ -24,7 +24,8 @@ compare rational ray reciprocity with the cyclotomic character. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index 8030f3eb5b..c8bf6e55f6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -42,7 +42,8 @@ that original field, and obtain the genuine reciprocity equivalence open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean index e9034267d0..68d60739f7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassModulusProjection.lean @@ -21,7 +21,8 @@ to transport this map. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean index 06c763fe5f..b07dc95d74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassPrimeIdele.lean @@ -23,7 +23,8 @@ constructions use exactly the same prime representative. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean index 35007fd92e..bd942c1109 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupFieldAntitone.lean @@ -18,7 +18,8 @@ a smaller subgroup, as actual subfields of the fixed separable closure. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean index 438d054bea..c1d785ea83 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassSubgroupPrimeArtin.lean @@ -20,7 +20,8 @@ prime idèle, with the arithmetic global Artin symbol of that field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean index 509835c77b..cfc2ecb3bf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayFrobeniusRigidity.lean @@ -25,7 +25,8 @@ of the given modulus and the extension's full conductor. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean index 2721ac6995..dd00a919e9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayPrimeGeneration.lean @@ -21,7 +21,8 @@ fractional ideals and the idelic-to-ideal ray-class equivalence. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index ed92bb537b..73075d97d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -32,7 +32,8 @@ argument. open scoped NumberField BigOperators -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean index 37c6ddd4a5..f43a929f45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormRealization.lean @@ -25,7 +25,8 @@ norm-residue index formula. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean index d2345110f7..b3e5f0fe03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassField.lean @@ -23,7 +23,8 @@ order is the class number. open scoped NumberField IsMulCommutative -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index 6437992228..8089294c5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -28,7 +28,8 @@ the Artin map, with its prime normalization obtained from the prime idèle. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory.SmallHilbertClassFieldComparison diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean index ab6017ae3a..cddec97b22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMaximalSubextension.lean @@ -24,7 +24,8 @@ inside the selected field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean index 8caed53bb4..c43c142f04 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldNaturality.lean @@ -22,7 +22,8 @@ therefore compatible with the canonical quotient--class-group equivalences. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean index 280721c6d8..07c4d0a050 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldOverOriginalBase.lean @@ -25,7 +25,8 @@ in the principal ideal theorem. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean index a90f913375..fcb859cbed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertNormCharacterization.lean @@ -29,7 +29,8 @@ by the class number. open scoped IsMulCommutative NumberField NumberField.LiesOver -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean index 4926765c8e..e825da6e14 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeArtin.lean @@ -29,7 +29,8 @@ place splits completely. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean index fd5c93f022..7ada595426 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/UnramifiedPrimeNormClass.lean @@ -28,7 +28,8 @@ the order of the global class divides the local degree. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace GlobalClassFields diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean index 4f05b7a6c1..3c3a9861d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory.lean @@ -32,4 +32,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean index 67d97ae2fc..90fbdfd9d3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/AbstractCapitulation.lean @@ -28,7 +28,8 @@ realization or norm-subgroup equality is assumed here. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean index c6f6cb0ee3..54c05bd194 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/All.lean @@ -37,4 +37,3 @@ transfer square, and principalization of every integral and fractional ideal in the selected small Hilbert class field. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean index 7994258891..34cfcd969b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealArtin.lean @@ -24,7 +24,8 @@ norm kernel, and induces the canonical ideal class-field isomorphism. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean index f591fb3d3d..7a430c7f52 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/ArithmeticIdealDecompositionLaw.lean @@ -21,7 +21,8 @@ genuine arithmetic Frobenius automorphism. @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean index 0ef624a030..6a64ea312d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinMap.lean @@ -27,7 +27,8 @@ group. open scoped NumberField BigOperators NumberField.LiesOver -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean index c113845626..5ebeb1458f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealArtinQuotient.lean @@ -19,7 +19,8 @@ has kernel `H_m`. The first isomorphism theorem therefore identifies open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean index 92bc0020ac..1cfa8c9bad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealDecompositionLaw.lean @@ -31,7 +31,8 @@ are related by the global ideal decomposition law. open scoped NumberField BigOperators -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean index bd3fab050c..343d755be3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealFrobenius.lean @@ -20,7 +20,8 @@ The general unramified Galois identity `r * f = n` belongs to @[expose] public section open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean index 4436acb80f..222a2c8912 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -25,7 +25,8 @@ entirely in terms of this norm-defined ideal group. open scoped NumberField IsMulCommutative -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean index 3b4135d8f7..bdca264715 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitation.lean @@ -21,7 +21,8 @@ range in every ray class group. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean index 90719e455c..65d1a23357 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationCore.lean @@ -18,7 +18,8 @@ equality and the finite-extension ideal Artin kernel theorem. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean index 673a344ff2..11a7123eaa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/NormLimitationStatement.lean @@ -20,7 +20,8 @@ declaration signatures avoids repeatedly normalizing the full finite tower. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean index 67fe3c7314..fff4eabd28 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTheorem.lean @@ -22,7 +22,8 @@ map forms the naturality square with the existing ideal-class extension open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean index f4bd3e6044..94af020108 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTower.lean @@ -22,7 +22,8 @@ commutator-intermediate-field and transfer APIs can be applied to the tower. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean index 2d62bb9e69..fb2371d96b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/PrincipalIdealTransfer.lean @@ -35,7 +35,8 @@ norm maps. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean index 9c51177f54..98c5975482 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalAbstractExtensionToOrdinary.lean @@ -15,7 +15,8 @@ Compatibility of abstract extension with ordinary idele classes. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean index 670d9f8cb5..776909f694 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean index a8ec04a775..a6bb2a008b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/All.lean @@ -21,4 +21,3 @@ independently compiled representative, quotient, compatibility, membership, zero-transport, and final finite-norm-class leaves. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean index c24e06c5db..0adaaf4afd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Compatibility.lean @@ -16,7 +16,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean index baec060a07..0ddb507b99 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FieldSpine.lean @@ -18,7 +18,8 @@ The public dependent type aliases are compiled once here. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean index 9dbb2f7071..1a2f92317e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/FiniteNormClass.lean @@ -17,7 +17,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean index e15405d9e8..d7a88ea679 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/MembershipTypes.lean @@ -17,7 +17,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean index afe955d606..198e6c3a4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Quotient.lean @@ -16,7 +16,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean index d02dbabc5b..4f6ed79f22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/Representatives.lean @@ -16,7 +16,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean index 175decd64b..70e71fa7e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -18,7 +18,8 @@ the shared fixed-field instance providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean index 6e6a28a77f..8e0dc81c78 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFixedFieldBaseChange.lean @@ -16,7 +16,8 @@ base change. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean index 7860e45e48..01bbfdca71 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertPrincipalization.lean @@ -33,7 +33,8 @@ of principalization over the original number field. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean index 49a3461cc5..589a513752 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertSplitting.lean @@ -20,7 +20,8 @@ ideal class, and it is trivial precisely when the prime ideal is principal. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean index 15b65f26a1..ee0d4cc555 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean @@ -31,7 +31,8 @@ Hilbert class field with the original field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean index 7b00b700b6..9c86f8c214 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -30,7 +30,8 @@ itself. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean index 7d3480f7b3..955a372c36 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerUnramified.lean @@ -24,7 +24,8 @@ unramifiedness at both finite and infinite places. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace IdealClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean index 40478710e9..3af54777a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity.lean @@ -94,4 +94,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 97e391d3e8..1e98b1d19b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -27,7 +27,8 @@ either field is introduced. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean index 29e2736ba1..bcaafa0967 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/All.lean @@ -102,4 +102,3 @@ Hilbert product formula, general power-residue reciprocity with explicit bad-place correction, and Gauss quadratic reciprocity over `ℚ`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean index 00eafb7a95..41f2eef116 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ArithmeticNormalization.lean @@ -32,7 +32,8 @@ open scoped IsMulCommutative NumberField open NumberField IsDedekindDomain open IdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean index 2bfa3de7aa..ec97e44b18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean index 098b2ef948..c3465ee720 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/All.lean @@ -21,4 +21,3 @@ the complex-conjugation overextension at a ramified real place, and the resulting infinite-place local-global Artin comparison. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean index 65c41b3512..89d07adc4c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceCompatibility.lean @@ -22,7 +22,8 @@ open scoped IsMulCommutative open NumberField open IdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean index ae2478064c..1d3d077d6a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/InfinitePlaceOverfield.lean @@ -19,7 +19,8 @@ complex place, and identifies ambient complex conjugation on that field. open scoped IsMulCommutative open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index 1ac5f2a413..28cafcbdd6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -21,7 +21,8 @@ and proves that restriction to the rational cyclotomic factor is faithful. open scoped IsMulCommutative open AlgebraicNumberTheory NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean index e8c3feb947..e2258612c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/OverextensionArtin.lean @@ -21,7 +21,8 @@ open scoped IsMulCommutative open NumberField open IdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean index 51832c425b..eacb434957 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RamifiedOverextension.lean @@ -19,7 +19,8 @@ quadratic overextension above it, and the faithful cyclotomic restriction. open scoped IsMulCommutative open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean index 4773c4236f..5774e3da19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/RationalComplexification.lean @@ -23,7 +23,8 @@ open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain open IdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index 0c3d0d6cf8..13d6a5a2ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -28,7 +28,8 @@ reciprocity comparison is assumed in their definitions. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean index 95235a2fc2..60e9738c81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -37,7 +37,8 @@ supplies the norm-range field of the concrete henselian valuation data. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean index d8be3fec37..860d71d601 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValue.lean @@ -34,7 +34,8 @@ hypothesis is substituted for it here. @[expose] public section -noncomputable section +noncomputable +section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean index eb41248c9d..4cd4005125 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleValueTopology.lean @@ -22,7 +22,8 @@ been proved. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean index 130fa55bf5..7dc9f19256 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicNormOneCorrection.lean @@ -24,7 +24,8 @@ value is trivial, so the normalized value is unchanged. open scoped NNReal NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean index dce9fd87e5..c605f29900 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicPrincipalIdele.lean @@ -30,7 +30,8 @@ the explicit cyclotomic action; no such compatibility is assumed here. open scoped BigOperators NumberField IsMulCommutative open NumberField IsDedekindDomain ClassFormation -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean index 5a6aebe710..6bc61c1cf0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -44,7 +44,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU continuousMulEquivOfCompactToT2 -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean index 33eafb0c3f..71b46b4549 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedGeometricRestriction.lean @@ -25,7 +25,8 @@ infinite global Artin map is the ordinary finite global Artin map. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean index 9e179931ca..d30397cd9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedLocalGlobalCompatibility.lean @@ -20,7 +20,8 @@ finite one-place idele class with the chosen local Artin homomorphism. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean index 0671f4c145..fead08ceb2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicUnramifiedRestriction.lean @@ -22,7 +22,8 @@ cyclotomic Artin map with the actual global norm-residue map. open scoped IsMulCommutative NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean index 6ee23493f5..03529360c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicZHatBaseChange.lean @@ -39,7 +39,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU continuousMulEquivOfCompactToT2 -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean index 45dec48cdb..487b47dbeb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealization.lean @@ -22,7 +22,8 @@ then transports abstract reciprocity back to the original tower. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean index 59bae469a6..bae296820b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationCore.lean @@ -35,7 +35,8 @@ quotient is introduced here. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean index f45b96c175..ac4770d7ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationFinitePlace.lean @@ -20,7 +20,8 @@ places and completions in the original number-field tower. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean index 84bbec9798..e7c12e9168 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationNormQuotient.lean @@ -20,7 +20,8 @@ reciprocity data to the original finite Galois extension. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean index dcf43033a7..31f17229b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteGaloisRealizationSubextension.lean @@ -21,7 +21,8 @@ normality, and finite-index data for abstract reciprocity. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean index 326363b6bc..5c9509efa7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteIdeleArtin.lean @@ -34,7 +34,8 @@ open scoped IsMulCommutative NumberField NNReal ValuativeRel open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean index 39f5d59878..d46b152e9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FiniteLocalFamily.lean @@ -23,7 +23,8 @@ open scoped NumberField BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean index 238d1d9a88..45aa9c8267 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertComparison.lean @@ -20,7 +20,8 @@ established finite-place Hilbert symbol. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean index 2bb5257ed2..0829696dee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicHilbertProductFormula.lean @@ -20,7 +20,8 @@ of the global Hilbert product formula. open scoped BigOperators NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean index 3d9e039706..1b9551229e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceAdicLocalField.lean @@ -27,7 +27,8 @@ valuation relation is passed explicitly, not registered globally. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean index af8fd6cb9e..67716591da 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean index 3a82fdd3a3..e46ef666fa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/All.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean index ca75e79775..52425a9882 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Conjugation.lean @@ -21,7 +21,8 @@ This module identifies localized completions associated with conjugate extension open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean index cd68e82cd6..187edf0caa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Construction.lean @@ -31,7 +31,8 @@ This module constructs the local Artin map for a chosen extension of a finite pl open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean index 3d84f3729b..8f709e8d4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/Core.lean @@ -24,7 +24,8 @@ This module identifies the image with the chosen decomposition group and the ker open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean index 4f5c710dfe..554f07b8d8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/CrossLocalRestriction.lean @@ -20,7 +20,8 @@ This module compares localized completions in a square of number fields with dif open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean index ec53d9099d..6bc2c3ac3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/NormRestriction.lean @@ -20,7 +20,8 @@ of number fields and their chosen completed local extensions. open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean index 9af083a875..713f51c4ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -19,7 +19,8 @@ This module restricts finite-place extensions through an intermediate field and open scoped IsMulCommutative NNReal NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean index 7e5697bbc6..4d7d275f8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/UnramifiedNormalization.lean @@ -23,7 +23,8 @@ open scoped NumberField ValuativeRel open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations LocalFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean index 008107c167..8729cb4d5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceCyclotomicFrobeniusLift.lean @@ -39,7 +39,8 @@ open ClassFormation open NumberField IsDedekindDomain open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean index a00b256c59..e6d84eb4d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtin.lean @@ -25,7 +25,8 @@ open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean index d77be02493..e7b40451d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinCompatibility.lean @@ -39,7 +39,8 @@ open scoped NumberField BigOperators IsMulCommutative open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean index 9e54499ad8..e85962e811 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalArtinFiniteSupportApproximation.lean @@ -32,7 +32,8 @@ open scoped NumberField TensorProduct BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean index ead6bc1aa8..a2fc4da504 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean index 88d404b3f1..e12ca25df0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/All.lean @@ -27,4 +27,3 @@ Public aggregate for the finite-place Kummer character comparison, finite support of the Hilbert factors, and the infinite-place comparison. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean index 4404263570..7a81b2cea9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/Core.lean @@ -27,7 +27,8 @@ automorphism without building that comparison into the definition. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean index bf3b7ca510..00fa159591 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceCharacterComparison.lean @@ -23,7 +23,8 @@ which proves compatibility with the two Artin actions. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean index c6325b85a5..a5f268ec97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceComparison.lean @@ -21,7 +21,8 @@ rebuild the localized-completion instance tower. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean index ba3e6ab882..55c73d67aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceFiniteSupport.lean @@ -23,7 +23,8 @@ is needed here. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean index 05fed5447c..d7a48aff4e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/FinitePlaceLocalGlobal.lean @@ -23,7 +23,8 @@ rebuild their instance towers. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean index 4b9e829efa..b2ceaefb42 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlace.lean @@ -22,7 +22,8 @@ The definition below records that evaluation directly in `μₙ(K)`. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean index 2dc8ac982e..f739eeeb27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceCharacter.lean @@ -23,7 +23,8 @@ leaf rather than being introduced as an assumption. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean index 34c878fd32..f6b7729b89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegative.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean index 3387b034bd..d40452c5eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeRoot.lean @@ -17,7 +17,8 @@ public import Mathlib.Analysis.Complex.Order open scoped ComplexConjugate ComplexOrder NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean index e9d1b0de16..11feb32541 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceNegativeUnit.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean index 4e0976664c..3a821c9f01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlacePositive.lean @@ -23,7 +23,8 @@ Artin automorphism and its Kummer root character are trivial. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean index 31f8617dff..ae7f383464 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRamification.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean index 1967b26584..75fd865b1a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealComparison.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean index 48ac7bbc13..934ef70f9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalHilbertSymbol/InfinitePlaceRealSquare.lean @@ -20,7 +20,8 @@ infinite-place Hilbert-symbol comparison. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index 60355852eb..5e365c226c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -37,7 +37,8 @@ the actual ordinary idele-class norm. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean index ec9240bc49..eaab190925 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -25,7 +25,8 @@ states global reciprocity at its full finite-Galois generality. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean index 553d9d82cc..71ddefeba4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianizationNaturality.lean @@ -23,7 +23,8 @@ abelianizations. The intermediate extension `M / K` is not assumed Galois. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean index 01960aa4ca..e50ae45122 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueNaturality.lean @@ -21,7 +21,8 @@ statement is directly usable by fixed-field overextension arguments. open scoped IsMulCommutative -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean index 2be119123a..13ab6edc94 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean @@ -21,7 +21,8 @@ can therefore be transported without changing their normalization. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean index 459bb19dba..31bcb51522 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFiniteFactorNaturality.lean @@ -21,7 +21,8 @@ commuting square for the two field embeddings is the only geometric input. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean index ea891f30f0..678002b38f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormula.lean @@ -24,7 +24,8 @@ on a principal idele therefore makes this product equal to one. open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean index 1316b03613..cb9bcd8a83 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertProductFormulaAlgEquiv.lean @@ -22,7 +22,8 @@ and the ordinary infinite product by the equivalence of infinite places. open scoped BigOperators NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean index 93255c17b1..d2fe01dcf1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitAbstractFixedField.lean @@ -17,7 +17,8 @@ abstract fixed fields. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index 7502fc6211..ef404289fb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -22,7 +22,8 @@ maps, and the induced absolute Galois representation. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean index 2aca6a5240..8a1e5f7867 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtension.lean @@ -16,7 +16,8 @@ the relative idele class group of its two actual fixed fields. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean index eaabc63fb0..76290c4de1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionAction.lean @@ -16,7 +16,8 @@ finite-extension Galois action. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean index fc37bffe44..44385d0354 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitExtensionNorm.lean @@ -16,7 +16,8 @@ idele-class extension attached to the abstract subgroup tower. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean index 0f1755edfe..4b2a62fdb0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevel.lean @@ -20,7 +20,8 @@ their tower compatibility live in the reusable core leaf. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean index 6b3306f392..6c726f9688 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteLevelCore.lean @@ -22,7 +22,8 @@ canonical embeddings into the rational idele-class direct limit. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean index 861c7cb094..388e1b7021 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormCore.lean @@ -19,7 +19,8 @@ proof from rebuilding the helper environment. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean index ca16b29372..3b5b1b1159 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormProof.lean @@ -18,7 +18,8 @@ thin wrapper around those providers. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean index 1cf9fabe32..71d6d623ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFiniteTowerNormStatement.lean @@ -21,7 +21,8 @@ fresh command environment. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean index e5d872513b..7e99097b8c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescent.lean @@ -17,7 +17,8 @@ idèle-class direct limit. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean index 51c3984691..06e85f3d07 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPointDescentCore.lean @@ -20,7 +20,8 @@ of the intermediate field. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean index bc765a3248..9dbd4dea1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitFixedPoints.lean @@ -17,7 +17,8 @@ identified with the corresponding fixed subgroup of the direct limit. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean index a54edd91b7..32abb9c743 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitNormQuotient.lean @@ -17,7 +17,8 @@ ordinary idele-class norm range and quotient of the actual fixed-field extension @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean index e0109fea7d..841012a0b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassNormTopology.lean @@ -23,7 +23,8 @@ ordinary idele-class topology after transport to the actual fixed field. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index 9eb11ff657..76c91bd249 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -27,7 +27,8 @@ norm produces a norm-one idele without changing its Artin symbol. open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean index fc3ca7146f..48a0338f40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean @@ -21,7 +21,8 @@ ordinary quotient topology. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean index d3bc4c0c01..bc92b10b5e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinSurjectivity.lean @@ -25,7 +25,8 @@ open scoped IsMulCommutative NNReal NumberField Topology open NumberField IsDedekindDomain open NumberField.Units.dirichletUnitTheorem -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean index d9c6628a5e..f4cd6aba9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteHilbertFactorNaturality.lean @@ -22,7 +22,8 @@ the product formula when a field is replaced by a small model. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean index da30ba78cf..ac25d3fc92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteLocalGlobalArtinCompatibility.lean @@ -30,7 +30,8 @@ open scoped NumberField open NumberField open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean index fbbf8a7de1..6be3c81211 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -30,7 +30,8 @@ open scoped BigOperators IsMulCommutative NumberField open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean index c48040ff2b..36b93bdfb5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IntermediateNormAbelianization.lean @@ -20,7 +20,8 @@ image. No normality of the intermediate extension over the base is assumed. @[expose] public section -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean index 1b406188ea..8c7ef0b581 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean index 1c380d78eb..f27e0e7a9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/All.lean @@ -19,4 +19,3 @@ factorization of the global norm-residue map through every finite-place local Artin map. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean index 81c2dffe27..856e2393bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/Factorization.lean @@ -23,7 +23,8 @@ open NumberField open AlgebraicNumberTheory.Valuations open HilbertRamification -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean index 85a0a8527b..886b8cca43 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicAuxiliaryField.lean @@ -28,7 +28,8 @@ open HilbertRamification open CyclicCohomology open KummerTheory ClassFormation -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean index 8734e97856..e29ea329ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -24,7 +24,8 @@ open HilbertRamification open CyclicCohomology open KummerTheory ClassFormation -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean index a2af78e86e..63337e94b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/SeparableClosurePadicLift.lean @@ -25,7 +25,8 @@ open IdeleGroup RelativeIdeleGroup open AlgebraicNumberTheory.Valuations open HilbertRamification -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean index 9aa27ca618..c6a5fea222 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibHilbertProductFormula.lean @@ -18,7 +18,8 @@ roots of unity to Mathlib's `rootsOfUnity`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean index 1e89dcd39c..1cbd79ad26 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MathlibTopologicalGlobalReciprocity.lean @@ -24,7 +24,8 @@ universe transport for the public statement is separate. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory.Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean index f05a04651e..d4271ee16d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianGlobalArtin.lean @@ -21,7 +21,8 @@ idele-representative evaluation and its finite Galois projections. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean index 8bb49bfb28..988a23a0c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/MaximalAbelianKernel.lean @@ -27,7 +27,8 @@ supplies the detecting finite Galois coordinate. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean index 0420884301..1802563971 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/NormQuotient.lean @@ -19,7 +19,8 @@ global norm-residue-symbol constructions. open scoped NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean index b8c94c16d4..593738be18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/OnePlaceNormKernel.lean @@ -26,7 +26,8 @@ open scoped NumberField TensorProduct open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index f5fdedb631..f195019226 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -38,7 +38,8 @@ group of roots of unity. open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean index f5edd8fbb0..54996d2744 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ProductFormula.lean @@ -26,7 +26,8 @@ open scoped NumberField BigOperators open NumberField IsDedekindDomain open IdeleGroup RelativeIdeleGroup -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean index f8b3549332..c6c4acf70e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicArithmeticProduct.lean @@ -24,7 +24,8 @@ that normalization. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean index 15e6ba2c3c..2c0d749c00 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicCharacterRigidity.lean @@ -20,7 +20,8 @@ automorphism of the full rational cyclotomic field has square one. -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean index 397c115af5..11f7d89226 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlace.lean @@ -24,7 +24,8 @@ of its normalized finite-place absolute value. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 10a3ef6df6..2d079a344c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -49,7 +49,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean index a87ea85153..1b78eebd4d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicLocalization.lean @@ -25,7 +25,8 @@ open NumberField IsDedekindDomain open AlgebraicNumberTheory.Valuations open LocalClassFieldTheory -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index 899966c375..b82f486742 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -25,7 +25,8 @@ away-from-`p` finite product. The construction also applies to `k = 0`. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean index d5b5b3e4f6..882385360f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalPrimeFactor.lean @@ -19,7 +19,8 @@ proved in `RationalCyclotomicFinitePlaceArtin`. -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean index 4de527f4f4..74368fd320 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalProduct.lean @@ -24,7 +24,8 @@ and proves that every rational principal idele has trivial value. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean index ca3a064b94..f43e1fd7a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicRayNorm.lean @@ -34,7 +34,8 @@ trivial. open scoped NNReal NumberField ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean index 0e8ff80673..d6d4e175e2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicZHatRigidity.lean @@ -22,7 +22,8 @@ coordinate of the rational cyclotomic `ZHat`-extension. open scoped NumberField IsMulCommutative open NumberField ClassFormation -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean index 89cbe00e70..96e97e4d05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrimeFactorization.lean @@ -22,7 +22,8 @@ identify the reduction of a natural unit modulo `p ^ k`. @[expose] public section open scoped BigOperators -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean index c5213e62e0..2f9ccfeac4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalPrincipalLocalUnit.lean @@ -59,7 +59,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean index 9dc53532aa..60f51b9077 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -19,7 +19,8 @@ derives Gauss's quadratic reciprocity law. open scoped BigOperators NumberField NumberTheorySymbols ValuativeRel WithZero open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean index b694286aee..d37aa29ec3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidue.lean @@ -29,7 +29,8 @@ recovers the previously constructed actual global norm-residue symbol. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean index a4aa23c6d2..f378922f67 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/TopologicalGlobalNormResidueAbelianization.lean @@ -31,7 +31,8 @@ isomorphisms between finite groups. open scoped IsMulCommutative NumberField open NumberField -noncomputable section +noncomputable +section namespace GlobalClassFieldTheory namespace Reciprocity diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean index 1fa6dc6b19..c9b56c752f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/HasseArf.lean @@ -83,7 +83,8 @@ only at natural-number indices, every upper jump of a finite Abelian local extension is integral (with the separate possible endpoint `-1`). -/ -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean index 7ea44384d0..5358ff373c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber.lean @@ -25,4 +25,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Unramifi /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean index f8ccf49115..3674bd824c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/All.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KroneckerWeber.Unramifi /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean index d10780d955..1d8107beb3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Core.lean @@ -38,7 +38,8 @@ semantic support modules under `KroneckerWeber.Global`; this root exposes the canonical theorem statement. -/ -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean index cb8b69de15..583d22b6ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Final.lean @@ -22,7 +22,8 @@ product bounds its degree by the degree of the conductor cyclotomic field. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean index 13341ff6cb..fa0147f14d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumCyclotomicTarget.lean @@ -18,7 +18,8 @@ At a ramified prime `p`, the structured local embedding of `L` has order @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean index cfd61b84dc..4c68cc18cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumGlobalEmbedding.lean @@ -17,7 +17,8 @@ valued compositum construction. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean index e5b8ca27dc..f46e6f304d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLeftFactors.lean @@ -22,7 +22,8 @@ in the global-factor file by `map_ratCast`. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean index 0c9a32dac1..cb13579fc4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumLocalizationEmbedding.lean @@ -19,7 +19,8 @@ identifies the restriction to the chosen localization as a genuine @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean index 653221ad81..829aec9f3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuationInertiaBound.lean @@ -19,7 +19,8 @@ bound therefore gives the sharp factor `φ(p^e)`. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean index 3b21cf82d0..aeecc6f486 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalCompositumValuedEmbedding.lean @@ -19,7 +19,8 @@ normal-compositum embedding preserves this exact left restriction. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean index 277f0bef27..1dbfe35903 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/GlobalPadicPrimePowInertiaBound.lean @@ -22,7 +22,8 @@ the exact `p`-primary factor `φ(p ^ n)`. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean index a875c3527e..d16dc23fef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/LocalCyclotomicEmbedding.lean @@ -29,7 +29,8 @@ then applies it to localizations of finite abelian extensions of `ℚ`. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber @@ -217,7 +218,8 @@ end KroneckerWeber end -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 29fe9f433a..791b71aaff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -22,7 +22,8 @@ the native quotient and finite Krull topologies. open scoped IsMulCommutative NumberField Cyclotomic -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index 197f8ba696..f83673a837 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -29,7 +29,8 @@ equality of degrees or an abstract comparison of finite groups. open scoped IsMulCommutative NumberField Cyclotomic -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean index db704cc708..4c6830e210 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RayClassComparison.lean @@ -23,7 +23,8 @@ field is `ℚ(μ_m)`. open scoped NumberField Cyclotomic -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean index 06b51a1965..4fdcb7761b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/Setup.lean @@ -27,7 +27,8 @@ larger degree than the cyclotomic subfield. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean index 1e8a6e4f5e..d913eb6454 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/UnramifiedCompositumSupport.lean @@ -29,7 +29,8 @@ original inertia automorphism. @[expose] public section -noncomputable section +noncomputable +section namespace KroneckerWeber diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean index c8e80f20ba..7aef854c0c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean index c419103ef7..18acb2b818 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.A Public root for the reusable Kummer-theory layer used by abstract class formations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean index 030a59bfa7..2cb42a8210 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.S /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean index 3f214a669f..de79b0fd76 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/All.lean @@ -19,4 +19,3 @@ unramified unit criterion, and the perfect Kummer pairing for actual field extensions. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean index dd49776dc5..b5dfff73f4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/CyclotomicPrimeBaseChange.lean @@ -26,7 +26,8 @@ is an actual field, Galois of degree `p` over `K(μ_p)`. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean index e540fb5d8b..0ecf8e46bf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/FinitePlaceDecomposition.lean @@ -31,7 +31,8 @@ open AlgebraicNumberTheory.Valuations open HilbertRamification open LocalClassFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean index 83ef1ac4cf..1259f4e5cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitKummerUnramified.lean @@ -35,7 +35,8 @@ open AlgebraicNumberTheory.Valuations open HilbertRamification open HilbertRamification.Dedekind -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean index 085838d5a2..099c5bb3be 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.S /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean index 55d20da142..68e3acbc45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/All.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.KummerTheory.Concrete.S /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean index c1180b3182..43a58f35d4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/Core.lean @@ -25,7 +25,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean index def19a3781..b5ce9742c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/EnlargedSUnitRestriction.lean @@ -21,7 +21,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean index 82f49857f3..840520d8eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FiniteRadicalSupport.lean @@ -20,7 +20,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean index 95db6c7528..77340ca4ca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/FullSUnitKummerExtension.lean @@ -22,7 +22,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean index 3e445a95f1..55dd1370ab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitLocalPowerKernel.lean @@ -21,7 +21,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean index 95bdb7f0a3..2093681138 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SUnitPreparation/SUnitPowerQuotient.lean @@ -23,7 +23,8 @@ open scoped NumberField IsMulCommutative NNReal ValuativeRel open NumberField IsDedekindDomain open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean index 0bed458d39..57bc2d0cf2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KummerTheory/Concrete/SimpleExtensionLocalBehavior.lean @@ -57,7 +57,8 @@ open HilbertRamification open LocalFieldTheory open LocalClassFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean index 4f91c47b0a..be4278545a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.L /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean index 03a6ecfdc6..c7e588b6b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/All.lean @@ -44,4 +44,3 @@ Absolute and profinite reciprocity: - `LocalClassFieldTheory.profiniteLocalReciprocity` -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean index 84f4c686ca..a068819dff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation.lean @@ -31,4 +31,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean index e81f635f0c..7d4e91650f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/All.lean @@ -34,4 +34,3 @@ Public aggregate for the normal-basis, unit-filtration, valuation, and cohomology calculations establishing the local class-field axiom. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean index fab5c7a08c..55bddb314e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanHilbert90.lean @@ -32,7 +32,8 @@ open HilbertRamification open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean index f356ad1d74..6af3896bb0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ArchimedeanNormQuotient.lean @@ -25,7 +25,8 @@ open LocalFieldTheory open CyclicCohomology.ProfiniteCohomology.Herbrand open CyclicCohomology -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean index 92e5bfdf75..6cf99f52d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/CohomologyBridge.lean @@ -28,7 +28,8 @@ Galois representation on `Lˣ`. The comparison uses the standard Galois action on units; it does not introduce a replacement coefficient object. -/ -noncomputable section +noncomputable +section open scoped BigOperators @@ -82,14 +83,14 @@ def additiveFixedUnitsEquivInvariants : Keeping this construction polymorphic prevents typeclass search from unfolding the concrete Galois representation while it looks for the quotient's additive structure. -/ -private def additiveEquivToQuotientHom +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`. -/ -private def additiveHomToMultiplicativeHom +def additiveHomToMultiplicativeHom {G B : Type} [Group G] [AddCommGroup B] (f : Additive G →+ B) : G →* Multiplicative B := AddMonoidHom.toMultiplicativeRight f @@ -98,14 +99,14 @@ private def additiveHomToMultiplicativeHom This is passed explicitly at concrete call sites to avoid rediscovering it by unfolding the coefficient representation. -/ @[implicit_reducible] -private def multiplicativeQuotientGroup +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. -/ -private def kernelOfAdditiveQuotientHom +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)) @@ -113,7 +114,7 @@ private def kernelOfAdditiveQuotientHom /-- First-isomorphism-theorem comparison for a surjection onto a multiplicative additive quotient. -/ -private def quotientMulEquivOfSurjectiveAdditiveQuotient +def quotientMulEquivOfSurjectiveAdditiveQuotient {G M : Type} [CommGroup G] [AddCommGroup M] (N : Submodule ℤ M) (S : Subgroup G) (f : G →* Multiplicative (M ⧸ N)) @@ -127,7 +128,7 @@ private def quotientMulEquivOfSurjectiveAdditiveQuotient /-- Forget the type tags in an equivalence whose codomain is the multiplicative form of an additive group. -/ -private def mulEquivMultiplicativeToEquiv +def mulEquivMultiplicativeToEquiv {G B : Type} [Group G] [AddCommGroup B] (e : G ≃* Multiplicative B) : G ≃ B where toFun q := Multiplicative.toAdd (e q) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean index 9146454304..2195d8e45b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean @@ -29,7 +29,8 @@ preceding normal-basis calculation `h(G, O_Lˣ) = 1` for the actual action on integer units. -/ -noncomputable section +noncomputable +section open scoped ValuativeRel open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean index f0b2f7e758..5db77745f8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FilteredLiftingSequence.lean @@ -24,7 +24,8 @@ explicit parameter, discharged for the normal-basis filtration in the next file. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean index ee83d327ff..ef748aac68 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Hilbert90.lean @@ -19,7 +19,8 @@ namespace LocalClassFieldTheory open CyclicCohomology -noncomputable section +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean index 31bd2fcc02..964ae8c11c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -33,7 +33,8 @@ Herbrand groups of `V`, together with finiteness of the quotient, gives `h(G, 𝒪_Lˣ) = 1` by the Herbrand-quotient multiplicativity theorem. -/ -noncomputable section +noncomputable +section open scoped ValuativeRel open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean index 93b668066f..3a394fe477 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean index 5dea0fdb3d..c4ed3d9faa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/All.lean @@ -18,4 +18,3 @@ Aggregate for the local block families, their induced and tensor constructions, and the resulting class-field axiom. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean index 87ae73b7ae..6f5aeb4b8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean index b0bd8aca2a..be9073ce3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/All.lean @@ -16,4 +16,3 @@ Public facade for the canonical family instances and the degree-zero and degree-minus-one Herbrand equivalences. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean index 8e6b4ab2fc..6a5a5be93c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/H0.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean index 0b3d3c326e..f4578f567f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/HMinusOne.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean index d38f311dba..55626c8a06 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Family/Instances.lean @@ -17,7 +17,8 @@ family of places. It is the finite-support part of the localized class formation @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean index f3a5f883c8..6dad9827b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/FamilyClassAxiom.lean @@ -35,7 +35,8 @@ of the finite family of localized class-formation blocks: open scoped BigOperators -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean index 5c14a16517..8f7fac487a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Induced.lean @@ -25,7 +25,8 @@ For finite extensions this is the entire metric completion by open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean index fbe4ac8b7f..bcedd0a1c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/Tensor.lean @@ -29,7 +29,8 @@ the induced local-block calculation. open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean index 93698e550a..a8cdb98a65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalBlocks/TensorNorm.lean @@ -39,7 +39,8 @@ calculation and multiplicative weak approximation. open scoped BigOperators TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean index ace5e47038..af513567eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean index a6a64a0570..ef5974ba08 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Algebra.lean @@ -24,7 +24,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean index 5245432b67..be299538a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/All.lean @@ -19,4 +19,3 @@ Public facade for the change-of-group, localized algebra, Galois generator, low-degree Herbrand equivalence, finiteness, and cardinality leaves. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean index e80de73f7a..5862870d43 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.C /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean index b092deeb30..87d912f5ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/All.lean @@ -17,4 +17,3 @@ Public facade for the degree-zero, degree-minus-one, triviality, and Herbrand quotient leaves. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean index 1d8c4379b8..494bbb3da5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/H0.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean index 80167bcf4e..59b0e8f13c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/HMinusOne.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean index 16aab01563..d0374f9d31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Quotient.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean index 6179cf978c..2848e5bc0d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Cardinality/Trivial.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean index 858d23a6c9..f114ee7cfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/CompMulEquiv.lean @@ -41,7 +41,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean index 9ffc583184..fd318c3f71 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Finite.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean index 4bd9cb2b0b..76e112c128 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/Generator.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean index ff6c6ed7f0..ce42dfd20c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/LocalizedCompletionCohomology/HerbrandEquiv.lean @@ -21,7 +21,8 @@ open CyclicCohomology open CyclicCohomology.ProfiniteCohomology.Herbrand open scoped TensorProduct -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index 9d01e203c8..165da552b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -27,7 +27,8 @@ cohomology of `Lˣ` has cardinalities `[L : K]` in degree zero and `1` in degree minus one. -/ -noncomputable section +noncomputable +section open scoped ValuativeRel open IsNonarchimedeanLocalField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean index 8ce8e8d564..568ebed1b1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasis.lean @@ -34,7 +34,8 @@ open LocalFieldTheory open CyclicCohomology -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean index d6da5ea8cf..f4050bb07e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisCohomology.lean @@ -23,7 +23,8 @@ 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 +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean index f0ec216a05..2de2fd276a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisFiniteQuotient.lean @@ -18,7 +18,8 @@ open LocalFieldTheory open CyclicCohomology -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean index 32a58be152..e0d111dd4c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGaloisAction.lean @@ -21,7 +21,8 @@ open LocalFieldTheory open CyclicCohomology -noncomputable section +noncomputable +section universe uG uA u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean index 2368b35c0d..9e8c737e40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisGradedLifting.lean @@ -21,7 +21,8 @@ open LocalFieldTheory open CyclicCohomology -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean index 5ef32d6104..94af21c16f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisInfiniteProduct.lean @@ -20,7 +20,8 @@ open CyclicCohomology open CyclicCohomology LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean index 9768b2144a..9e3cde38b8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/NormalBasisRecursiveLifting.lean @@ -26,7 +26,8 @@ of the local field turns the resulting formal recursion into an actual norm or coboundary in the initial subgroup. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean index 97b6ed8be4..370290406b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/PrincipalUnitGraded.lean @@ -17,7 +17,8 @@ namespace LocalClassFieldTheory open CyclicCohomology LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean index 26714631aa..6342c309ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Valuation.lean @@ -19,7 +19,8 @@ namespace LocalClassFieldTheory open LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean index ec63b35ccb..bf124698b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -28,7 +28,8 @@ 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 +noncomputable +section open scoped ValuativeRel open CyclicCohomology.ProfiniteCohomology.Herbrand diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean index c20ae8882d..2d2887cf50 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValueGroupCohomology.lean @@ -21,7 +21,8 @@ open LocalFieldTheory open CyclicCohomology -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean index 6039b82f48..6a60df9abc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean index 5dad4f0cd7..ce2ed4b176 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/All.lean @@ -20,4 +20,3 @@ local Artin map, and the unconditional finite local existence order isomorphism. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean index 0d6547b78f..d39978d0d0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Conductor.lean @@ -24,7 +24,8 @@ the principal-unit neighbourhood basis. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean index 30a95a0b96..cf45317b39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean index cbd27a01e9..1c55983fa2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/All.lean @@ -16,4 +16,3 @@ The prime-power and prime-to-`p` norm-subgroup computations used by local Kronecker--Weber, exposed as reusable finite local class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean index 88e889d44d..e1e47a4344 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/PrincipalUnits.lean @@ -38,7 +38,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuati expSeriesFieldOfWithZeroValuation -noncomputable section +noncomputable +section open scoped ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean index efe13ecb56..eb1f7c5174 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/StandardSubgroup.lean @@ -18,7 +18,8 @@ of the standard unramified/principal-unit intersection lemma. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean index a69d11abec..d913ca2a5c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/CyclotomicNorm/Unramified.lean @@ -44,7 +44,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming target_valuationSubring_eq_of_finite_separable -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean index be80599c24..b4ba64c2d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence.lean @@ -40,4 +40,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean index 0cc5041e8a..6b37c36336 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/All.lean @@ -48,4 +48,3 @@ provides a characteristic-independent finite abelian factor with its exact norm subgroup. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean index 2be4583986..09bd266536 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CharacteristicZero.lean @@ -20,7 +20,8 @@ isomorphism. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean index 42993a428f..0197f50af8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/Classification.lean @@ -20,7 +20,8 @@ multiplicative group. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean index c5d0c5a7a8..e9b52a5f20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/CyclotomicKummerDescent.lean @@ -20,7 +20,8 @@ finite Galois extension whose norm subgroup is contained in `Kˣⁿ`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean index d125c6a4c8..dbb7339033 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristic.lean @@ -177,7 +177,8 @@ subgroup lies in any prescribed open finite-index subgroup of `Kˣ`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean index 23c1d8f77b..0fc0b950e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/EqualCharacteristicDominatingExtension.lean @@ -20,7 +20,8 @@ source-producing field extension used for descent of filtered reciprocity. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean index 32e630e37e..f2e46498a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/FiniteUnramifiedField.lean @@ -26,7 +26,8 @@ existing `arithmeticFrobeniusOfUnramifiedValuation`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean index 64b8ec6378..a84d66ae70 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/KummerNormOpen.lean @@ -23,7 +23,8 @@ group, is open for the norm topology. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean index 856e8b970b..768fafd561 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LocalAbsoluteData.lean @@ -20,7 +20,8 @@ these definitions. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index c890de9250..e7c2f8c19e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -23,7 +23,8 @@ of their compositum. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean index 276d28a073..931ec4856b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MathlibFieldClassification.lean @@ -20,7 +20,8 @@ abelian intermediate fields of Mathlib's chosen separable closure. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean index 35338827f1..c67cfd461f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/MaximalKummerNorm.lean @@ -20,7 +20,8 @@ exponent-`n` Kummer extension with the subgroup of `n`-th powers. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean index e1d22417e6..4df470e58c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupOrderEmbedding.lean @@ -22,7 +22,8 @@ existence-theorem input. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean index 7746fcfd31..e8d2a85bc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupRingEquiv.lean @@ -18,7 +18,8 @@ local class-field theory is transported to a small representative. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean index 3c5053c0f8..d993ac69d1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/NormSubgroupSurjectivity.lean @@ -21,7 +21,8 @@ and constructs norm-topology witnesses from concrete finite Galois extensions. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean index 41d9ea7268..5f30e6c443 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/OrderReversal.lean @@ -24,7 +24,8 @@ the norm subgroup of a finite abelian extension. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean index 4c06f6d597..468bb246ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianFields.lean @@ -18,7 +18,8 @@ their inclusion order. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean index 2f5ea024e7..9d68cd14ba 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkChosenFiniteAbelianNorms.lean @@ -17,7 +17,8 @@ subgroup, not merely an abstract subgroup assigned by a classification. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean index d216fd1c9c..12ad783b73 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianFields.lean @@ -19,7 +19,8 @@ transported along the base-field equivalence. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean index fc17b33afb..6560a160e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkFiniteAbelianNorms.lean @@ -17,7 +17,8 @@ that intermediate field over the equivalent small base field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean index 0164563536..4df5cec6ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkIntermediateFields.lean @@ -18,7 +18,8 @@ isomorphism, with the actual underlying subfields unchanged. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean index b11ff76d93..2b263910cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkLocalClassification.lean @@ -18,7 +18,8 @@ nonarchimedean local field. The transfer respects the actual field-norm subgroup @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean index 0e4d646ba9..99d48b5b6c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkOpenSubgroups.lean @@ -19,7 +19,8 @@ units. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean index def44b6d23..b50c10539e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/ShrinkSeparableClosure.lean @@ -18,7 +18,8 @@ compatible equivalence with Mathlib's chosen separable closure of `Shrink K`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean index 764b438338..673b83b19b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardDominatingExtension.lean @@ -20,7 +20,8 @@ embedding. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean index c9fa8d9a10..42aee6ba8a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardLubinTate.lean @@ -26,7 +26,8 @@ characteristic-independent. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean index 5ae99989e7..3d1bf29b57 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/StandardSubgroupIntersection.lean @@ -23,7 +23,8 @@ This is the elementary subgroup calculation used in local existence proofs. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean index 0f5eb2347a..3c2f6eab60 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedLubinTateDiagonal.lean @@ -18,7 +18,8 @@ canonical API definitionally aligned with that reusable construction. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean index d2b668dc5b..ec14359ba3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormContainment.lean @@ -23,7 +23,8 @@ local field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean index 96c17a5d93..f2b81817a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnramifiedNormSubgroup.lean @@ -21,7 +21,8 @@ the canonical identification of the quotient with ZMod n. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean index 5963cba735..10b99df448 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/UnshrinkFiniteAbelianFields.lean @@ -16,7 +16,8 @@ The converse to the small-base transport: an intermediate field over @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean index bf9d7453ab..bff47962bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity.lean @@ -64,4 +64,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean index f8fc88e3d1..984df0bffa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbsoluteUnitsFixedField.lean @@ -31,7 +31,8 @@ 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 +noncomputable +section variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean index 5d82ad8a45..f87260cded 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldNorm.lean @@ -28,7 +28,8 @@ identifies the two presentations. In particular, it does not assume that the finite fixed field is normal over the local ground field. -/ -noncomputable section +noncomputable +section open scoped ValuativeRel variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean index c2b73e73b1..166500a864 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/AbstractFixedFieldUnits.lean @@ -32,7 +32,8 @@ essential for transporting the actual Tate groups rather than only their underlying norm quotients. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean index 1d1b8d6255..a6df126791 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/All.lean @@ -67,4 +67,3 @@ Exhaustive aggregate for the finite-level reciprocity equivalence, the continuou its norm kernel and surjectivity, and the local class-formation construction beneath them. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index 945308dc30..7d1ed8b189 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -30,7 +30,8 @@ to an automorphism of the separable closure, and the abstract reciprocity naturality theorem supplies the required naturality. -/ -noncomputable section +noncomputable +section variable (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean index 00b506a6ef..f423b7a98a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean @@ -18,7 +18,8 @@ sends the transported base-field norm to the represented Galois automorphism. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index 7352724f26..db0412225a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -36,7 +36,8 @@ The coefficient module remains `(SeparableClosure K)ˣ`; this is essential in imperfect positive characteristic. -/ -noncomputable section +noncomputable +section variable (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean index 78e0c0d274..1b4383eee4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConjugationNaturality.lean @@ -19,7 +19,8 @@ bundles the resulting map on the topological abelianization continuously. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean index 492332a368..31ae0a0f0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Core.lean @@ -79,4 +79,3 @@ specializations import this module without depending on the public aggregate that later re-exports them. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean index c659343c7a..1d0d815e71 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean index c3a82ccdd0..3bc4177510 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/AbstractUnramified.lean @@ -151,7 +151,8 @@ used in the Hasse--Arf development. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean index 321b229156..f016d7ee9b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/All.lean @@ -22,4 +22,3 @@ Public aggregate for the filtered Artin-map API and its unramified, equal-characteristic, compositum, and finite-Abelian specializations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean index 0b3bac536e..05897d264e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Compositum.lean @@ -22,7 +22,8 @@ joint injectivity of the two restriction maps. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean index 537734b1d6..762b3a6ecd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Core.lean @@ -21,7 +21,8 @@ conductor cutoff without assuming that comparison. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean index 4d14227316..76ffb7c49e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristic.lean @@ -25,7 +25,8 @@ field range then transports both the Artin and upper filtrations back. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean index 2ed4c73b1c..d9d60185c2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/EqualCharacteristicStandardCompositum.lean @@ -21,7 +21,8 @@ injectivity of restriction therefore gives filtered reciprocity upstairs. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean index a516db0e5a..1cab6c434f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/FiniteAbelian.lean @@ -40,7 +40,8 @@ open _root_.RamificationTheory.HilbertRamification.ValuationSubring renaming ramificationGroup_eq_bot_iff_residueChar_not_dvd_inertia_card -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean index c311ee29a7..b48d21fc2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/InertiaUnramifiedExtension.lean @@ -21,7 +21,8 @@ result along the infinite Galois correspondence. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace 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 index bc113233d7..de08d05f6e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/StandardCompositum.lean @@ -22,7 +22,8 @@ the two restriction maps gives the equality on their compositum. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean index a82d541600..64b3cf1e3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Filtered/Unramified.lean @@ -18,7 +18,8 @@ so every positive principal-unit image is trivial. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean index 69ce4a0fbf..3d856df2b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilySubgroupKernel.lean @@ -21,7 +21,8 @@ families on every Galois subgroup. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean index 8d2fa653a4..383bc74c6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbelianFamilyUnramifiedCompositum.lean @@ -24,7 +24,8 @@ inputs to cyclic-quotient rigidity. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean index e7b5b479e5..c3b85a7907 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteAbstractFixedField.lean @@ -29,7 +29,8 @@ field. It is the field-theoretic input needed before the local class-field-axio applied. -/ -noncomputable section +noncomputable +section variable (k Ω : Type) [Field k] [Field Ω] [Algebra k Ω] [IsGalois k Ω] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean index f6ad0a8979..2a0c10ff8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteExtensionClassFieldAxiom.lean @@ -36,7 +36,8 @@ valuation ring is proved integral over the base valuation ring; no local-field structure on the target is assumed. -/ -noncomputable section +noncomputable +section open scoped NNReal ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean index f88b8c35a6..0f37dabde1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteGaloisRealization.lean @@ -30,7 +30,8 @@ No perfectness hypothesis is imposed; this includes equal-characteristic local fields such as finite extensions of `𝔽_q((t))`. -/ -noncomputable section +noncomputable +section variable (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean index 6b45905c6d..5017fda855 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -38,7 +38,8 @@ valuation on that fixed field. This file compares those presentations by the uniqueness of the finite extension valuation. -/ -noncomputable section +noncomputable +section open scoped ValuativeRel open HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean index c3f730dc6b..54d9eccb1a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFrobenius.lean @@ -32,7 +32,8 @@ Frobenius `x ↦ x ^ #k`, and the exponent map is obtained by factoring its integer powers through `ZMod [L : k]`. -/ -noncomputable section +noncomputable +section universe u v w @@ -40,7 +41,7 @@ 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. -/ -private def finiteResidueFrobeniusIntegerPowers : +def finiteResidueFrobeniusIntegerPowers : ℤ →+ Additive (L ≃ₐ[k] L) := zmultiplesHom (Additive (L ≃ₐ[k] L)) (Additive.ofMul (FiniteField.frobeniusAlgEquivOfAlgebraic k L)) @@ -62,7 +63,7 @@ def finiteResidueFrobeniusExponentHom : AddMonoidHom.toMultiplicative (ZMod.lift (Module.finrank k L) ⟨finiteResidueFrobeniusIntegerPowers k L, - finiteResidueFrobeniusIntegerPowers_degree_eq_zero k L⟩) + by exact finiteResidueFrobeniusIntegerPowers_degree_eq_zero k L⟩) /-- An integer residue exponent maps to the corresponding power of Frobenius. -/ @[simp] @@ -73,7 +74,7 @@ theorem finiteResidueFrobeniusExponentHom_intCast (m : ℤ) : change (ZMod.lift (Module.finrank k L) ⟨finiteResidueFrobeniusIntegerPowers k L, - finiteResidueFrobeniusIntegerPowers_degree_eq_zero 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean index d67d9008ea..7c85aa1915 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueValuationComparison.lean @@ -27,7 +27,8 @@ valuation-ring comparison used in the finite local reciprocity construction befo degrees. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean index d8d3d31cae..328697ecaa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteSubgroupResidueDegree.lean @@ -27,7 +27,8 @@ residue field, so it also applies when the fixed field is not normal over the original local field. -/ -noncomputable section +noncomputable +section open scoped Pointwise ValuativeRel open HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index 60e0310a56..b8eac08d84 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -20,7 +20,8 @@ made discrete merely to obtain continuity. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean index 91664f3df8..ce39211168 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean index 83b7926aa7..4d80a7fa61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/All.lean @@ -28,4 +28,3 @@ Aggregate for the comparison of intrinsic Frobenius and norm-residue maps in fixed fields, including their ambient-prime and base-change transports. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean index 98455fa330..6bac0f7cf3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -19,7 +19,8 @@ the group itself. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean index 341ff05b39..a0ad41efa5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeComparison.lean @@ -18,7 +18,8 @@ agree on norm classes and therefore agree pointwise. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean index 9ef2570335..4668203dcc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeNormTransport.lean @@ -18,7 +18,8 @@ norm-residue symbols on transported prime norms. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean index 1f09308da5..649f1e49fd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeSymbolSetup.lean @@ -18,7 +18,8 @@ original embedded Galois group. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean index cc15770dfa..51b0897e6f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeTarget.lean @@ -18,7 +18,8 @@ intrinsic lift and proves its compatibility with quotient equivalences. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean index 4eeb5deb9a..59cfdf98f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitness.lean @@ -9,17 +9,18 @@ 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 -public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTarget - -@[expose] public section This module constructs a valuation-one prime witness for each abelianized Galois element using the corresponding intrinsic Frobenius lift. -/ -noncomputable section +@[expose] public section + +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean index 5fed43ef6c..e20babd9a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientPrimeWitnessComparison.lean @@ -20,7 +20,8 @@ ambient fixed-field norm-residue construction. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean index 5fdee79e19..bf7bb762fe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean index 3269f84632..e6628e26ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/All.lean @@ -18,4 +18,3 @@ This aggregate exposes the intrinsic-to-ambient base, extension, inertia, and norm-quotient comparisons for finite fixed fields. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean index 0d17deb26d..c03134d03b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedExtensionQuotient.lean @@ -17,7 +17,8 @@ This module identifies extension subgroups transported through an embedded finit @[expose] public section -noncomputable section +noncomputable +section namespace 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 index 4ce9efa6e3..a333701a32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/EmbeddedInertiaComparison.lean @@ -17,7 +17,8 @@ This module transports extension inertia between an intrinsic finite extension a @[expose] public section -noncomputable section +noncomputable +section namespace 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 index 01f3ef7618..66c4e8f684 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldNormQuotient.lean @@ -19,7 +19,8 @@ This module compares cohomological finite norm quotients with ordinary field-nor @[expose] public section -noncomputable section +noncomputable +section namespace 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 index 71a12674d4..220a970a9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/FixedFieldSpecialization.lean @@ -17,7 +17,8 @@ This module specializes the embedded subgroup and inertia comparisons to actual @[expose] public section -noncomputable section +noncomputable +section namespace 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 index d73a38fd7a..39e4033a7e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/BaseComparison/IntrinsicBaseEquivalence.lean @@ -18,7 +18,8 @@ This module compares the intrinsic absolute Galois base of a finite extension wi @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean index 6b02f03d30..c6184beb14 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F This facade preserves the import path for the subgroup transports and fixed-field equivalences. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean index f1c9cd34bf..6bb65e0b2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Fields.lean @@ -16,7 +16,8 @@ The transported Frobenius subgroups determine equivalent fixed fields. @[expose] public section -noncomputable section +noncomputable +section namespace 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 index a3c9d8301f..c0ee5c3d14 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/EmbeddedFrobeniusTransport/Groups.lean @@ -22,7 +22,8 @@ This module transports inertia, Frobenius elements, and fixed fields across an e @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean index 75bcd45a8a..26717a0912 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusArtinComparison.lean @@ -17,7 +17,8 @@ finite fixed-field extension with its ambient fixed-field norm-residue symbol. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean index 76393f2beb..e8153f339f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusClosure.lean @@ -17,7 +17,8 @@ the quotient transport has been constructed. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean index cc406c543e..f071a1ec9e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusFixedField.lean @@ -17,7 +17,8 @@ the intrinsic-to-ambient closure equivalence. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean index 7f84a58466..7ce6efc3aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/IntrinsicFrobeniusQuotientTransport.lean @@ -17,7 +17,8 @@ maps Frobenius elements before the closure comparisons. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean index bbd07b1a68..0f774c5fb2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/NormRestriction.lean @@ -16,7 +16,8 @@ This module proves norm--restriction naturality for actual finite abelian local @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean index bd7e45b05f..29487f72b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/PrimeComparison.lean @@ -17,7 +17,8 @@ This module compares intrinsic local Artin maps with the ambient fixed-field nor @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 7f00fb1ecc..acee7fcea0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -31,7 +31,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming valuationSubring_pullback_of_hasExtension_valuation -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean index c25780663f..dff003fb21 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -21,7 +21,8 @@ Galois ambient field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index ef5c90540e..c219449eb3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -22,7 +22,8 @@ field, and both norms are then the same product of conjugates. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean index 2a96b496bb..d84a79f9a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GaloisExtensionQuotient.lean @@ -27,7 +27,8 @@ that the resulting abstract class-formation quotient is canonically the actual g `Gal(E/K)`. -/ -noncomputable section +noncomputable +section variable (K Ω : Type) [Field K] [Field Ω] [Algebra K Ω] [IsGalois K Ω] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean index bc021a0a36..ed16393239 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -23,7 +23,8 @@ naturality then becomes the actual restriction homomorphism @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean index b82eb6431d..6537f44ed5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean @@ -30,7 +30,8 @@ in `ℤ̂`. Its range is proved to be exactly the ordinary integers inside source-producing parts of the Henselian valuation condition. -/ -noncomputable section +noncomputable +section variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean index b1b6b4cf79..47a6191445 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -25,7 +25,8 @@ to an inclusion `E ≤ F`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean index 3ca501e04c..24fc0d8940 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntrinsicAbsoluteData.lean @@ -18,7 +18,8 @@ separable closure. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean index 922f1d2bf8..f4aed649cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalClassFieldAxiom.lean @@ -31,7 +31,8 @@ then transport its two cardinality statements back to the abstract class-field-axiom predicate. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean index eb9bcdb25a..920100317a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalHenselianValuation.lean @@ -32,7 +32,8 @@ field, including a non-normal one, the image after the abstract norm is the ordinary residue-degree multiple of that value group. -/ -noncomputable section +noncomputable +section open scoped NNReal ValuativeRel /-- **Finite local reciprocity.** The normalized valuation of a nonarchimedean local diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index c344fea72b..a5aa8e636c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -52,7 +52,8 @@ is algebraically closed because its extension to the residue of perfect over the finite base residue field. -/ -noncomputable section +noncomputable +section open scoped Pointwise ValuativeRel open HilbertRamification.ValuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean index 667631323f..54891cb36f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/Main.lean @@ -27,7 +27,8 @@ into the abstract reciprocity theorem. The resulting isomorphism is independent embedding used to realize the finite Galois extension in that closure. -/ -noncomputable section +noncomputable +section variable (K L : Type) [Field K] [Field L] [Algebra K L] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean index 7aeed278ac..cb6788f096 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/MathlibInterface.lean @@ -25,7 +25,8 @@ structure. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory.LocalCFT diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean index 2f4d01404f..5b01e1c238 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidue.lean @@ -19,7 +19,8 @@ the native topologies. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean index 08b5d4a02d..8a8bb5ff85 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean @@ -17,7 +17,8 @@ between finite abelian intermediate fields of the fixed separable closure. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean index 183af27b4b..e237f291f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -33,7 +33,8 @@ global statement from the compatible finite Frobenius coordinates: * inversion gives the continuous degree map of the finite local reciprocity construction. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean index 96b0482791..938e8e47aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean @@ -29,7 +29,8 @@ map in finite local reciprocity. The construction itself does not require a bijectivity hypothesis. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean index b435f83d2c..b0d8aa6cc8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueActionIndex.lean @@ -30,7 +30,8 @@ fixing group of a finite residue subextension, its degree image has the ordinary residue-field index. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean index e2e5fa633d..1ca8600d14 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean @@ -30,7 +30,8 @@ Frobenius homomorphism itself; no equivalence with a chosen algebraic closure and no generator of a finite cyclic group enters its definition. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean index bb6be29b91..c6be1d8ce2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicallyClosed.lean @@ -25,7 +25,8 @@ intrinsic finite-field degree map to the residue of an algebraic closure of a local field. -/ -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean index d0e669bbbc..6b3ffefc2c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueDatum.lean @@ -29,7 +29,8 @@ degree. This is the finite-coordinate comparison needed in the local-field specialization. -/ -noncomputable section +noncomputable +section variable (k Omega : Type) [Field k] [Fintype k] [Field Omega] [Algebra k Omega] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean index f03920b754..cc1fa5a158 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SemilinearNaturality.lean @@ -18,7 +18,8 @@ vertical extension and applies the genuine norm--restriction theorem. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean index 3d42436350..8ee4a7752f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -32,7 +32,8 @@ identification to compare the abstract class-formation coset norm with the ordin norm, without a normality assumption on `E / K`. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean index d46b94a93d..9e77275ad7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableNormProduct.lean @@ -20,7 +20,8 @@ The ambient field need not be a normal extension of the base field. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean index 0d726c3719..2fcff8d96f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableUnitsNorm.lean @@ -32,7 +32,8 @@ is proved first for an arbitrary (possibly infinite) Galois ambient field, so it does not require the ground field to be perfect. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean index b52fc9fba6..5fd30e927a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean @@ -25,7 +25,8 @@ transport the local class-field-axiom theorem: reindexing a representation along isomorphism and replacing a representation by an isomorphic one. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean index 92e924d778..7df8145c30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -31,7 +31,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming valuationSubring_isIntegralClosure_of_isIntegral -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index ec0a4ce6e8..8d4a4f25f3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -34,7 +34,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming target_valuationSubring_eq_of_finite_separable -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean index dea106f8ca..0b70643934 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormComparison.lean @@ -23,7 +23,8 @@ the valuation quotient have the same finite cardinality. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean index 59ca28e566..372b4b4026 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedNormalization.lean @@ -26,7 +26,8 @@ Frobenius, both algebraically and in the topological abelianization. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean index 644eaedec9..1cca3aea97 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedReciprocity.lean @@ -18,7 +18,8 @@ abelianization of that cyclic group. -/ @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean index 427847d26c..4e8ae33c5f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -21,7 +21,8 @@ Artin map takes an inverse uniformizer to this automorphism. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean index 34c3da708d..3b9fe228a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ValuationSemilinear.lean @@ -22,7 +22,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming hasExtension_valuation_of_valuationSubring_pullback -noncomputable section +noncomputable +section namespace ClassFieldTower.Martinet.Shafarevich diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean index a3edfb0ea5..2804d014a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean index a0a6e55346..e91c35f978 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/All.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified` Lean module. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index 7c06b42a5f..30683fb31f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -24,7 +24,8 @@ The norm statements are the corresponding actual norm surjections. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean index 19e6632146..41df804379 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Norm.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean index 146afebe31..2de56cae05 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean index 1bc444c3a0..63b3f33e6b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F /-! Provides the public declarations in the `LocalClassFieldTheory.Finite.Unramified.PrincipalUnits` Lean module. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean index cdce8c75ac..5e98f9b493 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -14,7 +14,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean index 7b2f0b0b09..26a0063f33 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Lift.lean @@ -12,7 +12,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean index c6d0d7d38c..4ffd9d67fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Nonarchimed @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean index 76f82eb3cf..69ff50124f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -13,7 +13,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean index ad4cc6d9b4..4afef4779e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean index aaebc668ce..40a16c55a5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Uniformizer.lean @@ -21,7 +21,8 @@ valuation quotient API. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean index 97fe72ecc1..b5466ca9c4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -25,7 +25,8 @@ ramification index to be one. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean index 7a20468233..526d4bfd3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.I /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean index 0f1bcbb5a8..58ff597e7d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtin.lean @@ -18,7 +18,8 @@ compatibility. @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean index b3fee7d064..047670373d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteArtinRestriction.lean @@ -16,7 +16,8 @@ its canonical finite Artin map, not merely the same norm kernel. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTower.Martinet.Shafarevich diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean index 82185e7fd1..da2ac7d3c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotientTransitions.lean @@ -17,7 +17,8 @@ transition on the profinite side and restriction on the Galois side. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean index 3e35b93bc5..1e06387af4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteFiniteQuotients.lean @@ -22,7 +22,8 @@ subextension. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean index 8aa312e0cb..dcac2345d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbsoluteGaloisAbelianization.lean @@ -18,7 +18,8 @@ the established local names as definitional wrappers for downstream users. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean index 8f8392d655..bd7f5380d2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/AbstractProfiniteCompletionComparison.lean @@ -21,7 +21,8 @@ isomorphic as topological groups. @[expose] public section -noncomputable section +noncomputable +section open scoped Pointwise @@ -186,7 +187,7 @@ section Comparison variable (G : Type u) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] /-- The model-valued completion map used internally to establish continuity. -/ -private def abstractProfiniteCompletionModelMapMonoidHom : +def abstractProfiniteCompletionModelMapMonoidHom : G →* TopologicalProfiniteCompletion (AbstractProfiniteSource G) := (topologicalProfiniteCompletionMap (AbstractProfiniteSource G)).toMonoidHom.comp (AbstractProfiniteSource.mulEquiv G).symm.toMonoidHom diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean index 881308dac1..97bc244a0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/All.lean @@ -27,4 +27,3 @@ Artin maps, the absolute local Artin map, and the profinite local reciprocity equivalence. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean index 5adc5d2c3b..a303ac61c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteAbelianQuotientKernels.lean @@ -23,7 +23,8 @@ multiplicative group. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean index 73ca1317de..daa8d2b22e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -20,7 +20,8 @@ isomorphisms. @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean index fbf71046f3..c930e50ceb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/LocalMultiplicativeCompletion.lean @@ -22,7 +22,8 @@ finite quotients is injective. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean index 3e6ad231c6..8cda805203 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletion.lean @@ -25,7 +25,8 @@ closed subgroups; it does not depend on a separate copied inverse-system impleme @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory open scoped Pointwise @@ -117,7 +118,7 @@ noncomputable def openFiniteQuotient (openFiniteQuotientDiagram G).obj H /-- The product of all open finite quotients. -/ -private abbrev openFiniteQuotientProduct : ProfiniteGrp := +abbrev openFiniteQuotientProduct : ProfiniteGrp := ProfiniteGrp.pi (fun H : OpenFiniteIndexNormalSubgroup G => openFiniteQuotient G H) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean index b3a55fb588..248bdd57b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteCompletionCriteria.lean @@ -19,7 +19,8 @@ local reciprocity from the arithmetic existence theorem. @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean index 5aa50abdb4..b9cb6ef04e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/ProfiniteLocalReciprocity.lean @@ -26,7 +26,8 @@ existence theorem. @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean index 009b35f4ad..493ff6cd52 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/TopologicalAbelianizationCongr.lean @@ -19,7 +19,8 @@ to a continuous multiplicative equivalence of topological abelianizations. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory @@ -51,13 +52,14 @@ private theorem topologicalCommutatorClosure_le_comap exact Subgroup.mem_map_of_mem e.toMulEquiv.toMonoidHom hx · exact (Subgroup.isClosed_topologicalClosure _).preimage e.continuous -private def topologicalAbelianizationMap (e : G ≃ₜ* H) : +/-- 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 - (topologicalCommutatorClosure_le_comap e) + (by exact topologicalCommutatorClosure_le_comap e) @[simp] private theorem topologicalAbelianizationMap_mk @@ -74,7 +76,8 @@ private theorem topologicalAbelianizationMap_continuous change Continuous (QuotientGroup.mk ∘ e.toHomeomorph) exact QuotientGroup.continuous_mk.comp e.continuous -private def topologicalAbelianizationMulEquiv (e : G ≃ₜ* H) : +/-- The multiplicative equivalence induced on topological abelianizations. -/ +def topologicalAbelianizationMulEquiv (e : G ≃ₜ* H) : TopologicalAbelianization G ≃* TopologicalAbelianization H where toFun := topologicalAbelianizationMap e invFun := topologicalAbelianizationMap e.symm @@ -93,8 +96,8 @@ continuous multiplicative equivalence of topological abelianizations. -/ noncomputable def topologicalAbelianizationCongr (e : G ≃ₜ* H) : TopologicalAbelianization G ≃ₜ* TopologicalAbelianization H := { topologicalAbelianizationMulEquiv e with - continuous_toFun := topologicalAbelianizationMap_continuous e - continuous_invFun := topologicalAbelianizationMap_continuous e.symm } + continuous_toFun := by exact topologicalAbelianizationMap_continuous e + continuous_invFun := by exact topologicalAbelianizationMap_continuous e.symm } /-- States the theorem `topologicalAbelianizationCongr_mk`. -/ @[simp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean index c4cef3a732..194786b77e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer.lean @@ -22,4 +22,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.K /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean index 4d8ca3b310..aa5c3d6f25 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/All.lean @@ -25,4 +25,3 @@ Aggregate for the local Hilbert symbol, its laws, and the maximal local Kummer pairing, including the tame power-residue formula. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean index 69f268d360..cae697b7a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/CanonicalKummerNorm.lean @@ -22,7 +22,8 @@ the algebra norm through that isomorphism. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean index 23dfb8d056..f51c08c5d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerExponentTower.lean @@ -18,7 +18,8 @@ the chosen simple extensions form an actual tower in the separable closure. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean index 103b837c47..b7a0d5717b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/KummerNormPowerClassDegree.lean @@ -25,7 +25,8 @@ particular choice of a radical in their types. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory.LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean index dd4128b94c..34a7373435 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertExponentCompatibility.lean @@ -19,7 +19,8 @@ simple Kummer tower makes its values compatible as the exponent varies. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory.Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean index e4ea56ae6b..c4a0a3ac27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairing.lean @@ -21,7 +21,8 @@ identifies the maximal pairing with the existing local Hilbert symbol. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 67c6d41908..1db43b722b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -19,7 +19,8 @@ group. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory namespace Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean index ed124b35df..04bfc5106d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbol.lean @@ -23,7 +23,8 @@ automorphism, transported back to `μₙ(K)`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory namespace Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean index dad122e0d2..58cc0da2e6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertSymbolLaws.lean @@ -20,7 +20,8 @@ injective. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory namespace Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean index f8ef75f153..6d97183a12 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MathlibHilbertPairing.lean @@ -22,7 +22,8 @@ power-class group and root-of-unity subgroup. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean index 9cbd54b23e..ede6fb2988 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean @@ -19,7 +19,8 @@ the simple-extension definition of the local Hilbert symbol remains separate. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory namespace Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean index 4e9a692acb..510bdd73ed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/PowerResidueTameFormula.lean @@ -27,7 +27,8 @@ residue symbol, and derives the tame formula for the local Hilbert symbol. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace LocalClassFieldTheory namespace Kummer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean index ee0bf97cc5..18e03cab9c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/SmallHilbertPairingTransport.lean @@ -18,7 +18,8 @@ statements back across the field equivalence. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean index 07609cb3a6..6ae322742d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication.lean @@ -30,4 +30,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.L /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean index ca2fa42936..139abe0436 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/All.lean @@ -37,4 +37,3 @@ standard levels and for the transported Laurent-series model. The lower `LocalClassFieldTheory`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean index fa288cf2dd..d02c8adb15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicRealFilteredComparison.lean @@ -20,7 +20,8 @@ ceiling-step comparison. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean index e1cc4cbedc..7f3303676e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean @@ -22,7 +22,8 @@ the same kernel, giving integral filtered reciprocity over the target field. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean index f79ba0e281..e8b5bf61b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean @@ -21,7 +21,8 @@ filtration, so real filtered reciprocity holds on the named factor. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean index 8dd8f3dfaa..019f59551d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedLevelTower.lean @@ -20,7 +20,8 @@ underlying Galois automorphisms. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean index 2319c7615d..8b21b2df8b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -18,7 +18,8 @@ the zeroth and terminal Artin groups use the exact transported norm subgroup. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean index 57505e9452..4104967c18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRamification.lean @@ -94,7 +94,8 @@ ramification filtrations. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean index 9c1f912e8d..6029a2dae9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedUpperRestriction.lean @@ -19,7 +19,8 @@ transported target-field algebra. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean index a5bd7631ea..c3a15c8579 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicUpperFiltration.lean @@ -21,7 +21,8 @@ ramification group `G^k`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean index 7306f71340..ec0b000f64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LaurentPrincipalUnitTransport.lean @@ -19,7 +19,8 @@ corresponding target principal-unit level. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index e936c7f0d2..9e1564a2ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -24,7 +24,8 @@ transports both the finite Galois structure and the actual field-norm subgroup. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean index 1488c83645..53788f25cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormIndex.lean @@ -20,7 +20,8 @@ field theory application layer, not to the reusable Lubin--Tate library. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean index 58166aee4c..1272d7efc4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/NormSubgroup.lean @@ -20,7 +20,8 @@ index here, in the application layer, so the containment becomes an equality. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean index 5ed9b57ad8..71fc2309b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/PadicMultiplicativeArtinComparison.lean @@ -27,7 +27,8 @@ action on the chosen primitive root is the explicit cyclotomic action. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean index 1461a8434c..51886d15ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardArtinComparison.lean @@ -29,7 +29,8 @@ power-series action. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean index 4057b3f1d0..3fb0948b3b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFilteredArtinComparison.lean @@ -40,7 +40,8 @@ the independently known uniformizer norm. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean index 0c94c3de24..9e0cd0b3c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardFixedFieldComparison.lean @@ -20,7 +20,8 @@ Artin principal-unit filtration and the local upper filtration. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean index ec889b34b9..2d4890ba23 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormIndex.lean @@ -21,7 +21,8 @@ Lubin--Tate level over the canonical local-field package, this gives index @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean index 4995530d6f..a9486582b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardNormSubgroupExact.lean @@ -21,7 +21,8 @@ nonzero indices are equal, so the containment is an equality. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean index 6c269ca18d..f00aecfc03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/StandardSubgroupIndex.lean @@ -28,7 +28,8 @@ finite standard Lubin--Tate unit-parameter count. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean index 47bbc14e80..2bbd1f4dc9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/TransportedNormSubgroupExact.lean @@ -17,7 +17,8 @@ subgroup formula. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean index 1466fb53ad..4c4b54f23b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean index 8571aea0ce..7b2db141ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/All.lean @@ -14,4 +14,3 @@ Public root for reusable local-field infrastructure. This layer may depend on `V but not on `RamificationTheory`, `ClassFormation`, or `LocalClassFieldTheory`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean index a36f795ce3..8ed62a3f7b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean index efe1f8994d..501144a226 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/All.lean @@ -14,4 +14,3 @@ Aggregate for p-adic additive subgroups, units, local-field instances, and cyclotomic extensions. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean index d1a554f84e..4630069379 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean index 40d6639a9f..23cd570075 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic. Aggregate for the totally ramified and unramified cyclotomic constructions. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean index 85988cdb1e..0efe7084b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean index f9c2fcf9ff..755eef8ba1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/All.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalFieldTheory.Padic. The prime-to-`p` cyclotomic construction and its arithmetic Frobenius. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index 959fdc3ec2..a00198de0a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -54,7 +54,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming residueField_finiteDimensional_of_moduleFinite -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean index bcaacb0312..cc6c8ab881 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean index ec477c1525..8f50c74c5a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/All.lean @@ -25,4 +25,3 @@ The equal-characteristic construction is organized by its mathematical stages below `LubinTate.EqualCharacteristic`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean index 17e3c1b3b3..3b1a7432b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean index f0152b7060..f1927ba124 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/All.lean @@ -29,4 +29,3 @@ Each mathematical stage has a reader-facing aggregate below namespace. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean index 7394933831..8b1321d955 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel.lean @@ -40,4 +40,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean index be1566a3f3..e81ceb659c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/All.lean @@ -43,4 +43,3 @@ Public aggregate for completed level fields, Frobenius fixed fields, and completed norm calculations. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index c26066da86..6a1f395864 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -25,7 +25,8 @@ The repository's primitive polynomial indexed by `n` cuts out division level @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal Polynomial PowerSeries Topology WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean index 17f5ef36ad..316a33d94d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedPrimitiveAction.lean @@ -27,7 +27,8 @@ kept as distinct parameters. Repository index `n` is division level `n + 1`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean index 373f385148..0f26141e3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedPolynomialEvaluation.lean @@ -19,7 +19,8 @@ construction when it is used at completed points. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean index db7a67d18e..9e06a45b58 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizer.lean @@ -26,7 +26,8 @@ This is the changed-uniformizer algebra used in the proof of the completed theta @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean index 680178c215..0a30c2cfe3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedUniformizerNormalization.lean @@ -19,7 +19,8 @@ changed-level norm argument. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean index 748dc7083d..1617d5d1c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusBaseEquiv.lean @@ -17,7 +17,8 @@ Laurent base `k((T))`; hence the lift is an actual `k((T))`-automorphism. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean index bd39a2282f..b0bae2f624 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusContinuity.lean @@ -20,7 +20,8 @@ directly in the completed theta-intertwining theorem. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries NNReal Polynomial PowerSeries Topology Valued WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean index 189850d6a9..54c6046f15 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedField.lean @@ -20,7 +20,8 @@ target `uT` Lubin--Tate level through `Sigma`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean index 9a92cf283d..98b77a4fa7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldAlgebra.lean @@ -17,7 +17,8 @@ generic scalar-action instances in later norm calculations. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean index 2ee57070fa..48d71b64f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldCoefficientDescent.lean @@ -17,7 +17,8 @@ completed unramified field to the original Laurent base. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean index 3947ccde95..7feac7668e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldDegree.lean @@ -18,7 +18,8 @@ Together with the fixed-field generation theorem this gives the exact extension @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean index c432c3a8b8..f2e0fe3031 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldGeneration.lean @@ -17,7 +17,8 @@ extension. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean index 6473beb489..422df29777 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPowerBasis.lean @@ -16,7 +16,8 @@ of elements fixed by the prescribed completed Frobenius. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean index a1dc31a1da..16ec34a735 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean @@ -19,7 +19,8 @@ Comparing degrees shows that this point generates the whole completed level. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean index 7fc2803013..3adae08b0f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedNorm.lean @@ -20,7 +20,8 @@ primitive Eisenstein polynomial, and the chosen sign convention gives @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean index 7addc2530b..e49e67915e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusLift.lean @@ -20,7 +20,8 @@ generator. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean index 72b924b68c..d9767efda9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -26,7 +26,8 @@ evaluation point for the theta series of the completed theta-intertwining theore @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal Polynomial PowerSeries Topology WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean index a0595fd94c..220bc7b0f6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean @@ -22,7 +22,8 @@ algebraic input for extending arithmetic Frobenius to the completed level. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean index 9ed35251a5..2b077e1cde 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveIrreducible.lean @@ -22,7 +22,8 @@ is extended to the completed level field. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean index c7144625f5..4adbce933c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean @@ -26,7 +26,8 @@ and follows the source torsion orbit until the finite bracket terminates. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal NormedField PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean index 9aee9f77c7..8cadc0c441 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracket.lean @@ -25,7 +25,8 @@ normalization `u⁻¹T -> T` used in Corollary the Lubin–Tate endomorphism com @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean index 1a14d9ab4f..63fc29f307 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectLubinTateBracketRecursion.lean @@ -25,7 +25,8 @@ to the finite brackets acting on division points. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean index 334104389e..bf08efa7c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean @@ -21,7 +21,8 @@ embedding of the finite target Lubin--Tate level into the completed field. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean index b8f1574e88..f15a5a65de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -24,7 +24,8 @@ same division level. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal NormedField PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean index 99d663658e..753e4fe37f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean @@ -25,7 +25,8 @@ recursion. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean index 6cf0d872ae..cff382da08 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -24,7 +24,8 @@ on the completed division point. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal NormedField PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean index 466b20a7b2..dff3a461bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaIteration.lean @@ -18,7 +18,8 @@ Frobenius repeatedly to the formal identity @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean index 1a1554f6b0..7f0d27eb92 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaSeries.lean @@ -25,7 +25,8 @@ companion modules. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean index cf78663546..628c6ec23b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -19,7 +19,8 @@ division point in the completed level field. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal PowerSeries PowerSeries.WithPiTopology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean index e662c4cefd..b3daade980 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaLocalInverse.lean @@ -18,7 +18,8 @@ isometry on the maximal ideal. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped LaurentSeries NNReal NormedField PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean index 8614e5a1b6..aca80da288 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean index 2efa2e41b2..6c2d93b317 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/All.lean @@ -18,4 +18,3 @@ equal-characteristic local field uses finite local reciprocity and is exported by `LocalClassFieldTheory.LubinTateApplication`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean index 12d1a55626..5f1f3ab497 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentLocalField.lean @@ -22,7 +22,8 @@ Lubin--Tate construction. @[expose] public section -noncomputable section +noncomputable +section open Filter Set diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean index bdc4503170..8e7b861b33 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentModel.lean @@ -20,7 +20,8 @@ or norm-subgroup statement is assumed. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean index 069774c818..93ed42e5a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Existence/LaurentUniformizerNormalization.lean @@ -19,7 +19,8 @@ canonical normalized additive valuation sends `T⁻¹` to `1`. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean index dec135d338..dd3f31bbff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean index 9cd1cf4ba4..b1e5366669 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/All.lean @@ -26,4 +26,3 @@ Public aggregate for division torsion, finite level fields, and their Galois and norm structure. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean index 05912caf65..c7a05ffa3c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/AmbientDivisionTorsion.lean @@ -18,7 +18,8 @@ closure, where the nonzero division points live. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean index 80c239ce4b..d50d4b288b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/DivisionPolynomial.lean @@ -24,7 +24,8 @@ primitive root in the separable closure. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean index e73853b3f2..1587882a77 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FiniteParameters.lean @@ -21,7 +21,8 @@ of the primitive polynomial. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean index 126551ab56..016d9804ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/FreeRankOne.lean @@ -25,7 +25,8 @@ level `n + 1`. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean index faf181f064..24e46e1248 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAbelian.lean @@ -23,7 +23,8 @@ power-basis generator, hence everywhere. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean index 68d324c3af..1290be7fc7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelAutomorphisms.lean @@ -28,7 +28,8 @@ root-counting argument below. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean index ea7f69fb5c..5ee484e71b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelField.lean @@ -20,7 +20,8 @@ with the primitive division polynomial and gives the exact degree @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean index 93a4ae6323..fa06fff688 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/LevelFieldTower.lean @@ -18,7 +18,8 @@ level fields nevertheless form an increasing tower. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean index 6f89da8119..6ffbcbc46c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/NormUniformizer.lean @@ -18,7 +18,8 @@ therefore gives the norm identity `N(-λ) = T`. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean index ca8b673b45..af9dbe3236 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveAction.lean @@ -20,7 +20,8 @@ automorphism or normality is assumed here. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean index 1db49ab93b..0ffb2eeb91 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveIrreducible.lean @@ -21,7 +21,8 @@ its constant coefficient is exactly `T`. It is therefore Eisenstein at @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean index f0bc24b97d..69e65cc40a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/PrimitiveTorsion.lean @@ -20,7 +20,8 @@ used here. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean index 23bc6be906..d2ac6a7afd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FiniteLevel/UnitQuotientGalois.lean @@ -90,7 +90,8 @@ quotient to the Galois group. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean index d3ff765b5f..3fad65924f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean index a0bd32a7da..879ca98ec0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/All.lean @@ -17,4 +17,3 @@ Public aggregate for the Lubin--Tate action and its division-module endomorphisms. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean index 7269326097..9617a5fedc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/AmbientBracketAction.lean @@ -21,7 +21,8 @@ Lubin--Tate level fields. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean index 16dc49e114..2d8573bb10 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean @@ -22,7 +22,8 @@ keeps this shift explicit. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean index fe1fbba8e8..ae0f302b3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateAction.lean @@ -17,7 +17,8 @@ from `EqualCharacteristicLubinTateEnd` into the action of @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean index 92db0a3241..1af63112ee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -29,7 +29,8 @@ ordinary scalar multiplication in the ambient field. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean index 99bed2f21a..9a3ccbb6cc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean index ddb9f61c8e..f5ed4ea77d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/All.lean @@ -17,4 +17,3 @@ Public aggregate for coefficient Frobenius, Laurent-series Frobenius, and the completed unramified field. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean index a8870c9284..220fc53d41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CoefficientFrobenius.lean @@ -27,7 +27,8 @@ This is an equal-characteristic specialization of the general local-field constr @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean index c4f91189b7..c7c88a1f42 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/CompletedUnramifiedField.lean @@ -28,7 +28,8 @@ evaluation or norm-subgroup arguments. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Polynomial PowerSeries PowerSeries.WithPiTopology Topology Valued WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean index 568b1a861f..cee6dd7763 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/ContractingEquation.lean @@ -28,7 +28,8 @@ or external existence assumption is needed. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean index 5ae9408b61..e8fd61491d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Frobenius/LaurentSeriesFrobenius.lean @@ -31,7 +31,8 @@ postulate an abstract unramified extension. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries @@ -212,9 +213,9 @@ 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 - (laurentSeriesCoefficientBasis_linearIndependent b) - (laurentSeriesCoefficientBasis_span b).ge + 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean index 55325b3910..31c07dad19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean index 3d44bc6c75..b15d45af18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/All.lean @@ -29,4 +29,3 @@ reciprocity, is exported by `LocalClassFieldTheory.LubinTateApplication`. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean index 2a2028afec..05707bade6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEmbedding.lean @@ -19,7 +19,8 @@ codomain restriction for the finite-dimensional comparison. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean index 5cb1aca90b..3b0e55c6d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldEquiv.lean @@ -17,7 +17,8 @@ have the same degree `(q - 1) q^n`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean index 9138a3f2e0..9298eb32b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldMembership.lean @@ -14,7 +14,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean index 7134809fc4..42c7ae9d30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFixedFieldSurjective.lean @@ -18,7 +18,8 @@ The standard level and the fixed field have the same finite degree @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean index 283f5ca9da..539e578d9f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitFrobeniusFixed.lean @@ -18,7 +18,8 @@ Frobenius attached to `a` acts trivially on the standard primitive @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean index 53a9eac7f5..b87b591942 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean index f88660b3f0..a10fc3816e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnits.lean @@ -21,7 +21,8 @@ unit group is `U^(n+1)`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean index 233c0cb199..fd68fd7a78 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitsNorm.lean @@ -21,7 +21,8 @@ then puts every level-`n+1` higher unit in the standard norm subgroup. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean index a993021931..e1ea220ff0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/LevelAlgebra.lean @@ -19,7 +19,8 @@ typeclass searches. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean index 9b51efc596..a0ea0c2e47 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/StandardSubgroupNorm.lean @@ -17,7 +17,8 @@ the division-level inclusion `(T⁻¹) × U^(n+1) ≤ N(L_n/K)`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean index 9ff5eb04c6..78cc45cf22 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UniformizerNorm.lean @@ -19,7 +19,8 @@ and index arguments. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean index d64e96d491..70b1114450 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean @@ -27,7 +27,8 @@ the same cardinality for `K^x / ( U^(n+1))`. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean index ee6dfb3b0e..b5aa048f5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitTransport.lean @@ -26,7 +26,8 @@ Laurent unit multiplying `T` in the changed uniformizer of the completed theta-i @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean index 2cacd64de7..4bb6d626f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean index 86130c199e..639897964c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/All.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean index 864ad1a20a..b143473ab1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/Core.lean @@ -26,7 +26,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt herbrandSlope -noncomputable section +noncomputable +section open scoped LaurentSeries Pointwise PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean index 9c1f14fd0c..de126c6571 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/DisplacementValuation.lean @@ -19,7 +19,8 @@ the corresponding unit parameter. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Pointwise PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean index 5263826a8a..2486cb3c74 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/GaloisAction.lean @@ -18,7 +18,8 @@ Lubin--Tate bracket. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean index 5c42b8401c..b0f87f2b5e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/LowerGroups.lean @@ -20,7 +20,8 @@ their exact cardinalities. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries Pointwise PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index 3406364c70..7b2a8d0e6c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -37,7 +37,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming hasUniqueValuationExtension_of_finite_separable -noncomputable section +noncomputable +section open scoped LaurentSeries Pointwise PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean index 25c28763a9..b41f43eb2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/RealIndexSteps.lean @@ -19,7 +19,8 @@ the real upper filtration is constant on the natural-ceiling steps. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean index d2876bcb36..02ff26a032 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.EqualCharacte /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean index 53af8fff1c..30ef7db1c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/All.lean @@ -18,4 +18,3 @@ Public aggregate for theta coefficients, the theta series, evaluation, and the first theta identity. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean index 4bd9c8f7db..e3bb546891 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean @@ -32,7 +32,8 @@ by `theta^phi o e_bar = e o theta` when `pi = u * bar_pi`. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean index cba7ff05f3..2ed2c1bacb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaEvaluation.lean @@ -22,7 +22,8 @@ analytic evaluation map. @[expose] public section -noncomputable section +noncomputable +section open scoped LaurentSeries PowerSeries PowerSeries.WithPiTopology Topology Valued WithZero diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean index 0dd043d326..6adb564837 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -25,7 +25,8 @@ unique contracting solutions forced by commutation with @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean index 27829699b5..39a67e59ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaSeries.lean @@ -25,7 +25,8 @@ convergence or evaluation hypothesis is inserted into its definition. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean index b6a2866a24..946e641bc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaUniqueness.lean @@ -18,7 +18,8 @@ the equal-characteristic specialization. The identity @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean index d8f7f59c91..283bbb0d17 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel.lean @@ -39,4 +39,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FiniteLevel.U /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean index 46f5275528..8480591d53 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/All.lean @@ -46,4 +46,3 @@ primitive uniformizer. It also exports stability of a standard level under a principal-unit change of its defining uniformizer. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean index b726a42bab..26e4f3c4de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -28,7 +28,8 @@ higher-unit hypothesis is used. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean index 6054199c25..cad5a58c7c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedPrimitiveEvaluation.lean @@ -35,7 +35,8 @@ Krasner comparison of the original and changed finite levels. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean index 0547fab78c..aba7db466d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedUniformizer.lean @@ -39,7 +39,8 @@ assumed here. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean index 2005d0a313..8a09d1d4e2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean @@ -26,7 +26,8 @@ nilpotent and is therefore a valid evaluation point. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean index 47ba3d57dc..3b81c4384b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedIterates.lean @@ -23,7 +23,8 @@ equal to the totally ramified level degree `(q - 1) q ^ n`. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean index ecd9046605..4dc9b3833d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/DivisionPolynomial.lean @@ -35,7 +35,8 @@ Lubin--Tate extensions is made here. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean index a05f0d9eb8..b9ad3085c7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameterFiltration.lean @@ -18,7 +18,8 @@ filtration. For `1 ≤ k ≤ n + 1`, that image has cardinality @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean index 49534cd03e..e247a60499 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/FiniteParameters.lean @@ -26,7 +26,8 @@ parameter quotient. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean index 821b9ef3cd..79ed2717a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/GaloisParameterFiltration.lean @@ -20,7 +20,8 @@ valuation-ring unit representatives, and preserves the expected cardinality @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean index d130529199..0ad81e35b4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HerbrandFormula.lean @@ -20,7 +20,8 @@ is the Galois image of the `k`-th principal-unit subgroup and has order @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean index 72074f948c..5e992a680a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -47,7 +47,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU isUnit_one_add_of_mem_maximalIdeal_pow -noncomputable section +noncomputable +section open scoped Polynomial IntermediateField diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean index 841407283a..a9c470a2c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAbelian.lean @@ -24,7 +24,8 @@ to the Galois group. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean index 6580b38ac4..af3ffed149 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelAutomorphisms.lean @@ -22,7 +22,8 @@ field degree, hence that every standard level is Galois. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean index e123ee2756..c5c9d2b003 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelFieldTower.lean @@ -18,7 +18,8 @@ that the resulting simple fields nevertheless form an increasing tower. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean index aa13761426..cd586c2400 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LevelValuation.lean @@ -20,7 +20,8 @@ needed by the genuine lower- and upper-numbering ramification groups. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean index 4b814c9e34..df1974c74c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LocalUpperRamification.lean @@ -26,7 +26,8 @@ integral upper group at `k` with the kernel of restriction to level `k - 1`. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean index c1415d9e17..5299fbf04b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamification.lean @@ -21,7 +21,8 @@ displacement of that one element. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean index e1b743de81..b67b83b546 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/LowerRamificationFormula.lean @@ -21,7 +21,8 @@ Its cardinality is therefore `q ^ (n + 1 - k)`. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean index 4780700902..c253600487 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormSubgroup.lean @@ -22,7 +22,8 @@ norm calculation. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean index 502a5aa4bc..20f93f62e2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/NormUniformizer.lean @@ -19,7 +19,8 @@ uniformizer. The power-basis norm formula therefore gives @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean index 0afe330449..00b9eed123 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ParameterCongruence.lean @@ -28,7 +28,8 @@ levels. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean index 31bd4a465b..284cf003b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -27,7 +27,8 @@ action from valuation-ring units to the standard finite unit parameters. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean index 7ba0842434..22c4d01909 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -27,7 +27,8 @@ valuation of the topologically nilpotent input that it multiplies. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean index 11ad9c57f1..61aaaff2a0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveEisenstein.lean @@ -30,7 +30,8 @@ The argument is independent of the characteristic of `F`. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean index fce68a0c44..86b1e97c32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveRoot.lean @@ -30,7 +30,8 @@ in the base field. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean index 67061fb279..a82062e198 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveTorsion.lean @@ -23,7 +23,8 @@ does not vanish. All arguments are characteristic-independent. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean index fb0f5b99a3..4dbd618ae7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveUniformizer.lean @@ -31,7 +31,8 @@ one. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial @@ -232,7 +233,15 @@ 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 (standardLubinTateLevelCompleteDVFData_exists 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean index 221353e03c..1aada7c154 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/StandardLocalField.lean @@ -24,7 +24,8 @@ interfaces. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean index 03c7ff4a95..2a0c7000d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/UpperRamification.lean @@ -18,7 +18,8 @@ integral-closure valuation on a standard finite Lubin--Tate level. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean index f1ad305836..ff55e4bd1b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.FormalModule. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean index 053b582eec..33bd08fd2a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/All.lean @@ -27,4 +27,3 @@ existence-and-uniqueness construction, including the resulting standard commutative formal group and its coefficient-ring endomorphisms. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean index d113590de9..95a7cc2af7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/CoefficientEquation.lean @@ -17,7 +17,8 @@ has a unique solution in the valuation ring. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean index 4819b0490d..6ea0bec17a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/DegreeStabilization.lean @@ -26,7 +26,8 @@ truncation of the outer series. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean index 281c2f2e6d..5001581882 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Intertwiner.lean @@ -18,7 +18,8 @@ module defines the multivariable intertwining equation and its additive defect. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean index ae7e76ef1b..0353230886 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/LinearTerm.lean @@ -17,7 +17,8 @@ from the corresponding linear form has total order at least two. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate namespace SameUniformizer diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean index c7c5054509..45aa01aff6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCoefficient.lean @@ -19,7 +19,8 @@ total degree `m ≥ 2`, the remaining scalar equation has factor @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean index e2e0867f81..741d15f274 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveCorrection.lean @@ -17,7 +17,8 @@ term and cancels the defect coefficient in precisely that total degree. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean index 4cdb517384..2c1d0c9dbf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/RecursiveIntertwiner.lean @@ -25,7 +25,8 @@ construction. @[expose] public section -noncomputable section +noncomputable +section universe u v w @@ -44,12 +45,13 @@ theorem linearForm_hasLinearTerm HasLinearTerm (linearForm L) L := by simp [HasLinearTerm] -private abbrev Approximation +/-- 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. -/ -private noncomputable def degreeIndexList (m : ℕ) : +noncomputable def degreeIndexList (m : ℕ) : List {d : sigma →₀ ℕ // d.degree = m} := letI : Fintype {d : sigma →₀ ℕ // d.degree = m} := (Finsupp.finite_of_degree_eq m).fintype @@ -68,7 +70,7 @@ private theorem mem_degreeIndexList /-- One step in a fixed-degree correction list, bundled with preservation of the prescribed linear term. -/ -private noncomputable def correctionStep +noncomputable def correctionStep (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) (e ebar : LubinTateSeries F pi) {L : sigma → F.valuationSubring} @@ -83,7 +85,7 @@ private noncomputable def correctionStep correctedIntertwiner_hasLinearTerm hpi e ebar H.2 d.1 hd⟩ /-- Apply a list of fixed-degree monomial corrections from left to right. -/ -private noncomputable def correctList +noncomputable def correctList (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) (e ebar : LubinTateSeries F pi) {L : sigma → F.valuationSubring} @@ -255,7 +257,7 @@ private theorem coeff_defect_correctList_eq_zero_of_mem ih (correctionStep hpi e ebar hm H d) hds' hqds /-- Correct every monomial in one fixed total degree. -/ -private noncomputable def correctDegree +noncomputable def correctDegree (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) (e ebar : LubinTateSeries F pi) {L : sigma → F.valuationSubring} @@ -299,7 +301,7 @@ private theorem coeff_defect_correctDegree_eq_zero /-- The bundled finite-degree approximations. Stage zero is the prescribed linear form, and stage `n + 1` corrects total degree `n + 2`. -/ -private noncomputable def approximation +noncomputable def approximation (hpi : F.toCompleteDVF.valuation.IsUniformizer (pi : K)) (e ebar : LubinTateSeries F pi) (L : sigma → F.valuationSubring) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean index 1182e3b7f3..b668655962 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Reduction.lean @@ -21,7 +21,8 @@ coefficient of the defect is divisible by the chosen uniformizer. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean index ec29e35405..f217727d30 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/Series.lean @@ -20,7 +20,8 @@ in the structure itself, so the coefficient package can be reused independently. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean index f3efa0f9d3..ca125b238f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardFormalGroup.lean @@ -26,7 +26,8 @@ one-variable power-series composition. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators attribute [local instance] Classical.propDecidable @@ -340,7 +341,8 @@ section StandardFormalGroup variable (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) -private abbrev standardSeries : +/-- The standard Lubin–Tate series used to construct the two-variable formal group. -/ +abbrev standardSeries : LubinTateSeries F π := standardLubinTateSeries hπ @@ -714,7 +716,8 @@ section StandardEndomorphisms variable (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) -private abbrev standardSeries' : +/-- The standard Lubin–Tate series used to construct the scalar endomorphisms. -/ +abbrev standardSeries' : LubinTateSeries F π := standardLubinTateSeries hπ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean index bc43a544c6..2d5ecf65b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FormalModule/StandardSeries.lean @@ -21,7 +21,8 @@ polynomial input without making an equal-characteristic assumption. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean index 71ab790df4..edf01288e1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic.lean @@ -33,4 +33,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.Multipl /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean index bb00acdfb1..5f9a79872f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/All.lean @@ -36,4 +36,3 @@ Aggregate for the multiplicative Lubin--Tate series and its completed-level, Frobenius, residue, fixed-field, and changed-uniformizer constructions. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean index 0c0753aeb5..d5f71f2d1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean @@ -31,7 +31,8 @@ uses mathlib's equivalence `W(ZMod p) ≃+* ℤ_[p]`, and `φ` is @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean index b4ec519ce9..e36d55c0dc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.Changed /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean index 9ef02f7257..bc805acb03 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/All.lean @@ -18,4 +18,3 @@ This aggregate exposes the completed series, defect correction, intertwiner construction, scalar endomorphisms, and final semilinear compatibilities. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean index 447e652ce4..466bf81445 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/CompletedSeries.lean @@ -19,7 +19,8 @@ unramified Witt ring and records their coefficients and residue reductions. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean index 3965b10ac2..3fdd417d0e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -20,7 +20,8 @@ This module computes how a degreewise correction changes the semilinear substitu @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean index fbe6b6a654..52ebde00df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean @@ -16,7 +16,8 @@ This module builds compatible finite-degree approximations, assembles the change @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean index 1ea9ac7ef8..a67fc632f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarCompatibility.lean @@ -16,7 +16,8 @@ This module proves that the changed-uniformizer intertwiner commutes with every @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean index 1b906ff820..6618827b4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/ScalarEndomorphisms.lean @@ -21,7 +21,8 @@ This module constructs the completed multiplicative and changed-standard scalar @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean index 03e5ae008e..876695d969 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardCompositum.lean @@ -27,7 +27,8 @@ will identify with the actual local Artin symbol. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean index ed3b494657..4fca061705 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFixedField.lean @@ -18,7 +18,8 @@ precisely the powers of the finite Artin candidate. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean index b8faaf4e0e..9fac774a79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardFrobenius.lean @@ -23,7 +23,8 @@ arithmetic Frobenius of the finite unramified extension. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean index 783ee4f5e9..9d9ac8874c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardResidue.lean @@ -24,7 +24,8 @@ relative Artin candidate with inverse arithmetic Frobenius. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean index d0fe10ef64..90da1e0fa3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedStandardUnramified.lean @@ -40,7 +40,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming moduleIsTorsionFree_target_valuationSubring_of_finite_separable -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean index d74c37845e..0d87cf1a79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean @@ -27,7 +27,8 @@ finite changed level, with no comparison hypothesis. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean index 493e48111a..1a2b80abd8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerPrimitive.lean @@ -21,7 +21,8 @@ completed level over the completed-unramified coefficient field. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean index 1b6e22f11a..dab9a432fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerThetaFixed.lean @@ -20,7 +20,8 @@ convergent theta value is fixed. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean index d8bc0463b5..81db24eec1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean @@ -23,7 +23,8 @@ actual multiplicative unit translate. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean index 07261007d9..9a810e157d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusLift.lean @@ -23,7 +23,8 @@ level. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean index 0255414600..ef50b4ba88 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -33,7 +33,8 @@ completion is introduced. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean index ba64c4fc0d..7e42284ff9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean @@ -28,7 +28,8 @@ generates the completed splitting field. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean index 54765ad401..701dc46e2e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveIrreducible.lean @@ -19,7 +19,8 @@ irreducible over the completed-unramified fraction field. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean index fcfec6c1ff..08f5fe88e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveUniformizer.lean @@ -21,7 +21,8 @@ Consequently it is a genuine uniformizer of the completed level. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial Topology diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean index 02f3b01027..a4f58329d5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedResidueFrobenius.lean @@ -20,7 +20,8 @@ field. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean index 9621218a40..d7c5d4edfb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean @@ -23,7 +23,8 @@ used in the changed-uniformizer norm argument. @[expose] public section -noncomputable section +noncomputable +section open scoped PowerSeries diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean index 62cf8a58b4..670271018b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -32,7 +32,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming valuation_hasExtension_of_local_valuationSubring_map -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean index 2e6e74f3be..bf382e200e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedFrobeniusFixed.lean @@ -23,7 +23,8 @@ fraction back in the Witt ring. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean index aa5291041e..e2721823cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.Multipl /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean index ebbb03406c..8e30b447df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/All.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LubinTate.Padic.Multipl /-! # All -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean index 93b7d8ff71..ac6f2ed63b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedCoefficientEvaluation.lean @@ -19,7 +19,8 @@ general injectivity criterion for evaluation with unit linear coefficient. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean index 57edd42e5d..3bed3a7b4a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedPrimitivePoint.lean @@ -19,7 +19,8 @@ that point. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean index 38eaa8f629..46064c1091 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/CompletedScalarEndomorphism.lean @@ -23,7 +23,8 @@ composition, torsion, and injectivity identities for their analytic actions. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean index 658ace0ff0..a5e7e0fc83 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/Core.lean @@ -27,7 +27,8 @@ Lubin--Tate tower. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean index 29c1b97229..021127b1b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelEvaluation.lean @@ -20,7 +20,8 @@ comparison identity, and injectivity of the evaluated comparison. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean index af9b6849f4..cf534c3881 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeEvaluation/FiniteLevelPrimitiveRoot.lean @@ -21,7 +21,8 @@ action. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean index 90d3bf75ee..fd07b7c0bd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeIntertwiner.lean @@ -23,7 +23,8 @@ it does not identify the two actions from equality of their kernels. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean index 0ce3719898..0f0a885a59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/MultiplicativeSeries.lean @@ -24,7 +24,8 @@ uniformizer of `ℚ_p`. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean index 0b79261bfe..5b930a74de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.Rami /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean index 243908db94..f9fb22c915 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/All.lean @@ -15,4 +15,3 @@ Public root for reusable finite and profinite ramification infrastructure. It is `ValuationTheory` and `LocalFieldTheory` and upstream of local class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean index a7958bf30e..81451bd063 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.Hilb /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean index cb5ccf0a0e..4a3a45e83b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/All.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.Hilb Focused aggregate for valuation-subring actions and their ramification groups. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean index 0ffb02121f..3526ab81ac 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.RamificationTheory.Hilb /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean index a74fa94f94..75d945ca65 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/All.lean @@ -16,4 +16,3 @@ Decomposition groups, inertia groups, fixed fields, and tower formulas for primes in finite Galois extensions of Dedekind domains. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean index 61ccdba61c..d6c50d66d9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/ChosenInertiaCoverage.lean @@ -23,7 +23,8 @@ all nontrivial inertia groups. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean index 270ce1b995..bf51bd2cfc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/InertiaGeneration.lean @@ -20,7 +20,8 @@ makes the subgroup equal to the full Galois group. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean index 38e85460a1..ae65a6caf3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -38,7 +38,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming valuationSubring_eq_of_le_of_mem_maximalIdeal_iff -noncomputable section +noncomputable +section namespace HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean index 1714ab1419..62702fba4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicInertiaBound.lean @@ -37,7 +37,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming residueField_finiteDimensional_of_moduleFinite -noncomputable section +noncomputable +section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean index 70f9de82c8..07f90b31f2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicCyclotomicRamificationIndexBound.lean @@ -19,7 +19,8 @@ that only the latter contributes to the local ramification index. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean index 89413afafc..e4b45c8a8e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/PadicLocalizationCanonicalValuation.lean @@ -31,7 +31,8 @@ norm-formula valuation ring used in the unramified cyclotomic extension theorem. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean index 08f9867c27..0cc86013c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/RamificationIndexComparison.lean @@ -18,7 +18,8 @@ of any cyclotomic or Kronecker--Weber hypotheses. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean index 0a1b7f0da0..6082173e4e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean index e60db44731..6f588f8c3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/All.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFiel public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.All /-! Stable reader-facing statements of the main class field theory results. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean index 66f1982020..b78c6e1d31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields.lean @@ -57,4 +57,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.ConductorsAndR /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean index 9bf2cc5eb9..9184ef1951 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteExponentIsLeast.lean @@ -24,7 +24,8 @@ the whole completion tensor algebra, with no arbitrary place above `v`. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean index 9d0f172c61..2b1d072cc7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteNormCriterion.lean @@ -28,7 +28,8 @@ with the norm group of a chosen local field extension. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean index e273841a7b..1c39e64ea4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteSupport.lean @@ -21,7 +21,8 @@ minimal conductor. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean index a76737217a..b97a8dd5b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorFiniteUnramified.lean @@ -19,7 +19,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean index 98439b8b12..ad40cfdea2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorRealRamification.lean @@ -18,7 +18,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.GlobalClassFieldTheory. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean index a1abec8b7b..f6823af424 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/AbelianConductorTameCriterion.lean @@ -27,7 +27,8 @@ divide the ideal-theoretic ramification index at any place above it. open scoped NumberField ValuativeRel open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean index 05f8c0462b..3cefec13c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/All.lean @@ -62,4 +62,3 @@ and prime-splitting formulas, and conductor minimality. Each theorem has its own leaf module. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean index d49c57a94e..eddc88a6ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInEveryRayClassFieldRealization.lean @@ -21,7 +21,8 @@ uniqueness of the embedding itself. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean index b1cd99cc5d..a3d8f323b7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/EmbedsInRayClassFieldIffConductorLe.lean @@ -21,7 +21,8 @@ of ray class fields, the theorem asserts existence of this least modulus. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean index dbd7c0dd48..b24e5150ea 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/ExistsRayArtinModulusProjection.lean @@ -26,7 +26,8 @@ that intertwines their Artin maps. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean index 5dfab08514..c37cad3120 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/FractionalIdealNormPrimeExponent.lean @@ -20,7 +20,8 @@ calculation needed when passing from ideals to norm-defined ray subgroups. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean index de35695363..f153434091 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/IsRayCongruentOfLe.lean @@ -19,7 +19,8 @@ finite prime and at least as many real positivity conditions. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory.IsRayCongruent diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean index de1e2746a3..1e3fa2ce66 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/NarrowRayClassGroupEquivNarrowClassGroup.lean @@ -24,7 +24,8 @@ preserves the class of each finite prime. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean index 143ef0538f..fe338dbd20 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/OrdinaryRayClassGroupEquivClassGroup.lean @@ -25,7 +25,8 @@ preserves the class of each finite prime, fixing its arithmetic meaning. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean index 06201cf7e4..a7d344a719 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayArtinModulusProjection.lean @@ -27,7 +27,8 @@ implementation appears only in the proof. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean index 67eb6b151f..aa0d1cb5ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldDegree.lean @@ -20,7 +20,8 @@ module does not depend on an implementation-level choice of field. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean index d722543412..461ae4efa4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldModulusMonotone.lean @@ -19,7 +19,8 @@ upgrades that embedding to literal inclusion in the fixed separable closure. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean index 2811384a48..95cbefcfb7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldPrimeSplitting.lean @@ -22,7 +22,8 @@ corresponding ray class. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean index 3dc311cab2..618da2a48d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassFieldReciprocity.lean @@ -20,7 +20,8 @@ global reciprocity. No global choice of ray class field is exposed. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean index 8b422e6b65..787c5108af 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassGroupHomExtFinitePrime.lean @@ -21,7 +21,8 @@ ray class group to determine any homomorphism into a commutative group. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean index 6e9ceab96f..98a1d7458a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealArtinKerEqNormRangeSupPrincipal.lean @@ -21,7 +21,8 @@ norm image and the principal ray-ideal subgroup. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean index 67cf5a437b..5a9c397644 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionPrime.lean @@ -21,7 +21,8 @@ projection to the ray class group of the smaller modulus. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean index f73a63837f..b5b31c556f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealModulusProjectionSurjective.lean @@ -24,7 +24,8 @@ quotients of the same idèle class group. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean index 90ce9603c8..ff36df5eae 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageEqArtinKer.lean @@ -23,7 +23,8 @@ principal ray ideals are absorbed by the ray quotient. open scoped NumberField IsMulCommutative open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean index 70198b94da..4f1b636dfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassIdealNormImageLeArtinKer.lean @@ -21,7 +21,8 @@ norms. Equality requires the separate reverse approximation theorem. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean index fcb80e1783..d0bca444fd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupDegree.lean @@ -18,7 +18,8 @@ subgroup in the ray class group. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean index 6985247128..8afac398b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupEmbedding.lean @@ -26,7 +26,8 @@ Frobenius-normalized realizations intertwines both Artin actions. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean index 52c0dd518c..a93b1d4e01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupExistence.lean @@ -22,7 +22,8 @@ construction to that interface. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean index a31dd5a574..064923fdc3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupFieldAntitone.lean @@ -19,7 +19,8 @@ conclusion is literal inclusion rather than merely an abstract embedding. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean index 191e5426fd..c4adb5307f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeInertiaDegree.lean @@ -20,7 +20,8 @@ class modulo the subgroup defining the extension. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean index bd4a751db2..253c1de520 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupPrimeSplitting.lean @@ -20,7 +20,8 @@ membership of the prime's ray class in the defining subgroup. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean index fc335574f8..d8dbe287a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotient.lean @@ -18,7 +18,8 @@ the Galois group of that field. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean index b8a14194af..6129d84aee 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupQuotientEquivMk.lean @@ -17,7 +17,8 @@ The quotient isomorphism retains the prescribed Artin normalization. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean index 535de6765b..8b70bb7fbe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayClassSubgroupRealizationEquiv.lean @@ -20,7 +20,8 @@ The field attached to a fixed modulus and subgroup is well-defined up to open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean index a41539810a..3f2f739fa8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitAntitone.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean index 8b6d0d294b..61c30499ce 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitMembership.lean @@ -21,7 +21,8 @@ where the condition reduces to being an integral unit. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean index c994bc3296..3f883c5044 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOneAdd.lean @@ -25,7 +25,8 @@ the membership criterion below. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean index a1d9545177..8415e1b37a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitOpen.lean @@ -19,7 +19,8 @@ multiplicative group of the finite completion. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean index 1c0c703010..52d64a866e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayLocalHigherUnitZero.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.AlgebraicNumberTheory.R open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean index d6e28d82f9..45ca3e0029 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealMembership.lean @@ -20,7 +20,8 @@ ideal map, so taking their subgroup closure adds no new ideals. open scoped NumberField open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean index 2503b3d252..1140a04fc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/ConductorsAndRayClassFields/RayPrincipalIdealPrimeTo.lean @@ -20,7 +20,8 @@ integral-unit-valued at every finite prime in the modulus support. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean index e36a3721e9..3fc4289a02 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields.lean @@ -36,4 +36,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.FrobeniusAndHi /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean index 7e5a74e3de..23f5b51706 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/All.lean @@ -40,4 +40,3 @@ and the intrinsic existence, Artin isomorphism, degree, splitting, and principalization results for small and big Hilbert class fields. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean index 75245cab11..aae345ac9b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusAlgEquivTransport.lean @@ -25,7 +25,8 @@ the automorphism of the ring of integers. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean index 358bb6acaf..5bce797b3c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusEqOneIffSplitsCompletely.lean @@ -21,7 +21,8 @@ is expressed only with Mathlib's ramification indices and residue degrees. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean index 1ae03ffba0..89f64421ad 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIndependentOfPrime.lean @@ -24,7 +24,8 @@ an upstairs prime. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean index e066b2fa12..9cdfce3844 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusIsArithmetic.lean @@ -20,7 +20,8 @@ ramification arguments can use. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean index 6954bca6df..e6c0b48f1f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusOrder.lean @@ -22,7 +22,8 @@ degree at `w`. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean index bcaf089f25..b95a363d6a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/ArithmeticFrobeniusRestrictTower.lean @@ -20,7 +20,8 @@ to an intermediate field is arithmetic Frobenius at the prime below it. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean index b3bee01fdc..f5cb450de3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldArtinEquiv.lean @@ -25,7 +25,8 @@ fixes the Artin normalization of the isomorphism. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean index 60e68e2d36..34c117941a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldDegree.lean @@ -24,7 +24,8 @@ class group for the modulus containing every real place and no finite prime. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean index a95474f561..d6ba99b06b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldNarrowRayRealization.lean @@ -21,7 +21,8 @@ a ray-class-field realization whose extension is the original field. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean index c8965b5d16..bbcf6db13d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplitting.lean @@ -24,7 +24,8 @@ affect this finite-prime criterion. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean index 3ceb853452..5be7e52d9a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldPrimeSplittingPositivePrincipal.lean @@ -23,7 +23,8 @@ when its fractional ideal has a totally positive generator. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean index a1bb68a02f..4367c7922b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/BigHilbertClassFieldUnique.lean @@ -16,7 +16,8 @@ intermediate field of the fixed separable closure. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean index d1539c41dc..2c154b4934 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/NarrowRayRealizationIsBigHilbertClassField.lean @@ -23,7 +23,8 @@ maximal among finite abelian extensions unramified at finite places. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean index 9ffabf0da6..ea33257a7d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/OrdinaryRayRealizationIsSmallHilbertClassField.lean @@ -23,7 +23,8 @@ maximal among finite abelian extensions unramified at all places. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean index 18ecd6bbce..ee3e4e5e63 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldArtinEquiv.lean @@ -25,7 +25,8 @@ Frobenius fixes the Artin normalization of the isomorphism. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean index e0df88a6e1..e1a6252bbc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldDegree.lean @@ -21,7 +21,8 @@ has degree equal to the ordinary class number of the base field. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean index 2f9e600ec1..d0accc1cfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldLeBig.lean @@ -17,7 +17,8 @@ result is literal containment, not only an abstract embedding. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean index 025120982f..df61d24eb1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldOrdinaryRayRealization.lean @@ -21,7 +21,8 @@ ray-class-field realization whose extension is the original field. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean index 16af9ca076..f54eb82b99 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrimeSplitting.lean @@ -23,7 +23,8 @@ ideal-theoretic objects. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean index f405f127e7..22cde57a79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldPrincipalization.lean @@ -20,7 +20,8 @@ makes every integral ideal of the base number field principal. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean index e28232701a..7c5ac4939c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUnique.lean @@ -16,7 +16,8 @@ an isomorphism class. It does not distinguish a unique field automorphism. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean index ded9985322..b0d81224d6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/FrobeniusAndHilbertClassFields/SmallHilbertClassFieldUniqueUpToEquiv.lean @@ -20,7 +20,8 @@ distinguished or unique choice of one. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean index 37b589c68b..3b41de8dbd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory.lean @@ -20,4 +20,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.GlobalClassFie /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean index 91c9d9be95..a1fe648f81 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/All.lean @@ -24,4 +24,3 @@ maximal-abelian statements. The latter are proved via topological comparison with the existing restricted-product implementation. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean index a99758c984..a19d86b3e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocity.lean @@ -25,7 +25,8 @@ reciprocity construction through the ray class comparison. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean index 79dd5df1a1..9e6d51e830 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianGlobalReciprocityQuotient.lean @@ -20,7 +20,8 @@ normalization are carried by `FiniteAbelianReciprocityData`. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean index 075bf0eeb7..3688f95b13 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FiniteAbelianReciprocityQuotientEquivMk.lean @@ -17,7 +17,8 @@ The induced isomorphism maps the class of a ray class to its Artin value. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean index ce398b53bc..99ee7f1ee7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceCompletionLocalArtin.lean @@ -28,7 +28,8 @@ to the actual completion and records its image and kernel in public types. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean index e982a9e1d9..8dc38bc899 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceLocalGlobalNormKernel.lean @@ -33,7 +33,8 @@ through the algebraic comparison with Mathlib's idèle class group. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean index 62906aa800..06cf184507 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinDecomposition.lean @@ -30,7 +30,8 @@ including when the place divides the ray modulus. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean index a9d0315969..54d461aa90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean @@ -33,7 +33,8 @@ values under this transport. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean index f08e304e70..8160457df8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinNormKernel.lean @@ -26,7 +26,8 @@ equality of the Artin values is a separate normalization question. open scoped NumberField TensorProduct open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean index b69b19dd8d..d8dd7c1653 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/MaximalAbelianGlobalArtin.lean @@ -22,7 +22,8 @@ does not assert uniqueness of the map. open scoped NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean index 2a709fc436..3f47f22149 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf.lean @@ -31,4 +31,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.Upper /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean index 2f316f72dc..b0fa1f66f6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/All.lean @@ -29,4 +29,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.Upper public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HasseArf.UpperRamificationGroupEventuallyBot /-! Public Hasse--Arf theorem and basic lower-filtration identities. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean index ae461d219b..f6767a59c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HasseArf.lean @@ -29,7 +29,8 @@ data. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean index 015455b945..52ca38c0cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionCanonical.lean @@ -20,7 +20,8 @@ public theorem statement. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean index 9b55462533..7bb2ed528d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionInverseHerbrandFunction.lean @@ -14,7 +14,8 @@ public import Mathlib.NumberTheory.LocalField.Basic @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean index bdc59e6a50..82dcb47b45 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/HerbrandFunctionNat.lean @@ -11,7 +11,8 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Definitions.HasseArf.He @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean index 7aa3fbeb6b..2e4bcac999 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/InverseHerbrandFunctionHerbrandFunction.lean @@ -14,7 +14,8 @@ public import Mathlib.NumberTheory.LocalField.Basic @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean index 477c0d334a..0227951f64 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/LowerRamificationGroupEventuallyBot.lean @@ -22,7 +22,8 @@ some lower group. Finiteness gives a common bound for all automorphisms. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean index 203a4421af..87fb94c707 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -20,7 +20,8 @@ powers of the maximal ideal. No choice of a local extension is needed. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean index dafca4599a..fb6de3dd41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/UpperRamificationGroupEventuallyBot.lean @@ -22,7 +22,8 @@ through the Herbrand-index identity and antitonicity. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean index 3743dab1fa..1e863ccedd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols.lean @@ -42,4 +42,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.HilbertSymbols /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean index befe4889d0..f7712723c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/All.lean @@ -46,4 +46,3 @@ the norm-residue criterion for local Hilbert pairings, and existence of a coherent family satisfying the global product formula. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean index c76cc8465c..0b704df5b9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/FinitePlaceHilbertBadSetFinite.lean @@ -20,7 +20,8 @@ any choice of local Hilbert symbols or of a larger auxiliary support. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean index 491c15bbd7..f3ee7ea5df 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingFiniteSupport.lean @@ -23,7 +23,8 @@ the family being studied. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean index d5cf72c194..abbddc17b3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/GlobalHilbertPairingSupportBound.lean @@ -22,7 +22,8 @@ even though it does not determine all of its nontrivial values. open scoped NumberField open NumberField IsDedekindDomain -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean index 9e3583b932..d41fef4be0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/HilbertPairingPerfect.lean @@ -20,7 +20,8 @@ order. Hence a nondegenerate pairing gives an equivalence with that dual. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory.HilbertPairing diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean index 6ae4bedd8e..2dbbb9544f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraCopiesOfSimpleFactor.lean @@ -21,7 +21,8 @@ reindex the product by `Fin (n / d)`, where `d` is that factor's degree. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean index dd36c63f4a..54dbf20313 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormIndex.lean @@ -20,7 +20,8 @@ field generated by an `n`-th root of `a`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean index a596534c61..a63ed08f40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraNormProduct.lean @@ -19,7 +19,8 @@ different degrees; no factorwise norm-image assertion is made. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean index b878555006..b0771300cd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraOneNormSurjective.lean @@ -19,7 +19,8 @@ that norm index and algebra rank are different invariants. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean index 3c8f67476e..a0fb18ca96 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFactorDegree.lean @@ -21,7 +21,8 @@ the number of factors times `d`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean index 5a94bc3d0a..bdad3cd48b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerAlgebraUniformFieldFactors.lean @@ -20,7 +20,8 @@ factors in the finite product decomposition are isomorphic over the base. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean index c0f3a80a25..48abc2cf98 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/KummerRadicalDegreeEqPowerClassOrder.lean @@ -23,7 +23,8 @@ rank `n`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean index b5e6aa3fcb..e14908b564 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingArtinNormalization.lean @@ -21,7 +21,8 @@ algebraic pairing laws alone do not determine the values in `μₙ(K)`. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean index a70c12f67d..ee3d0bd179 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HilbertSymbols/LocalHilbertPairingExponentCompatibility.lean @@ -25,7 +25,8 @@ sides of the exponent comparison and does not change the formula below. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean index eb461468ca..97948c5a7c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory.lean @@ -30,4 +30,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.LocalClassFiel /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean index 69c3dcfe92..8f968db6f1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/All.lean @@ -34,4 +34,3 @@ norm-subgroup statements. The theorem statements use Mathlib and the public definitions layer; their proofs may import implementation modules. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean index 800037ec6e..0a1b0773a1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupRingEquiv.lean @@ -18,7 +18,8 @@ equivalences preserves the actual field norms, not merely their index. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean index 0148abc217..99b963699d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FieldNormSubgroupTower.lean @@ -18,7 +18,8 @@ norms in the base field. No local-field or Galois assumption is needed. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean index a71421a1da..69e3542b7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistence.lean @@ -21,7 +21,8 @@ statement. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean index a470fc3f87..9bb8a0f54c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalExistenceOrderIso.lean @@ -25,7 +25,8 @@ field-norm subgroup. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean index 36a052ad2c..9dc8c0680f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocity.lean @@ -27,7 +27,8 @@ does not claim that the displayed witness is uniquely determined. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean index f97cf7b5a4..6da4f6bbb8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamily.lean @@ -21,7 +21,8 @@ construction at `Type 0`; arbitrary-universe transport remains separate. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean index 1db98416ad..ab5f069dc3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyArithmeticFrobenius.lean @@ -27,7 +27,8 @@ not a separate independently chosen reciprocity map. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean index 2b3adda2fb..ad5821fb21 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyExt.lean @@ -36,7 +36,8 @@ open _root_.LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtens open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean index b6d6d80888..2793f9acfa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityFamilyUnramifiedNormalization.lean @@ -28,7 +28,8 @@ carry a canonical valued-field structure in the public definitions. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean index 3ef570f15c..e6488304ff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotient.lean @@ -24,7 +24,8 @@ by a continuous multiplicative equivalence. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean index eb073d2263..48ab73c571 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivMk.lean @@ -23,7 +23,8 @@ uniquely by its values on classes of nonzero field elements. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean index 5558710f9d..bbe25112d7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityQuotientEquivOfArtin.lean @@ -23,7 +23,8 @@ This is distinct from uniqueness of the Artin map itself. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean index 4a405e210b..2f7f6c953b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityTower.lean @@ -19,7 +19,8 @@ single compatible construction in the implementation layer. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean index 4dfa2c9b23..186aeac3c3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedFamilyExt.lean @@ -24,7 +24,8 @@ does not assert uniqueness on ramified members of the families. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean index 1f27584592..dfbabd746c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedHomExt.lean @@ -31,7 +31,8 @@ maps for ramified extensions. open scoped ValuativeRel open LocalFieldTheory.IsNonarchimedeanLocalField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean index 1adaf6e656..9d674819bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/FiniteAbelianLocalReciprocityUnramifiedNormalization.lean @@ -26,7 +26,8 @@ and public Definitions vocabulary; the implementation is used in the proof. open scoped ValuativeRel -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean index 72ede1eb05..5dd0ea8701 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/LocalClassFieldTheory/MemFieldNormSubgroupIff.lean @@ -19,7 +19,8 @@ No Galois, local-field, or topological assumption is required. @[expose] public section -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean index e34cf83abf..204336d674 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.U /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean index 2e20c587c8..b0b06bc836 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/All.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.Theorems.NormTheorems.T This module gathers the public local-global principles for field norms. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean index 3ea9060100..e6c79fb2b2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecomposition.lean @@ -23,7 +23,8 @@ formula using only Mathlib objects and the public extension index type. open scoped BigOperators TensorProduct -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean index d9f10d2963..d659c3f8bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/CompletionTensorNormDecompositionCanonical.lean @@ -23,7 +23,8 @@ equivalence that appears in the determinant-norm product formula. open scoped BigOperators TensorProduct -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean index a46a295152..b74ed019c5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/ComplexInfinitePlaceAllNorm.lean @@ -21,7 +21,8 @@ tensor algebra. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean index 78db17b2cb..87946ee3cc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/InfiniteNormIffPositive.lean @@ -23,7 +23,8 @@ factor of the tensor product. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean index 1f565a6057..fb9528b5bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/NegativeOneNotInfiniteNorm.lean @@ -22,7 +22,8 @@ than a single chosen completion, is the object in the public statement. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean index 9fa4620f87..5f2ae24c39 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/NormTheorems/UnramifiedInfinitePlaceAllNorm.lean @@ -21,7 +21,8 @@ unramified in the extension. open scoped NumberField TensorProduct open NumberField -noncomputable section +noncomputable +section namespace ClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology.lean index 19f90df0b8..fa28034db9 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean index 1369b031cb..bd0bbf00a8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0 /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean index 328dcc833b..2d0ede71f9 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/GaloisCohomology.lean @@ -28,7 +28,8 @@ objects are mathlib's Tate cohomology objects directly; no parallel low-degree model is introduced. -/ -noncomputable section +noncomputable +section open CategoryTheory @@ -55,7 +56,7 @@ 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 := isCyclic_of_forall_mem_zpowers g hg + 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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean index d906d573ff..576a2ffdaf 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Product /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean index c2d2fd4475..2d801e44d3 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean @@ -25,7 +25,8 @@ quotients of any two terms are defined, then the quotient of the third term is defined as well. -/ -noncomputable section +noncomputable +section namespace ProfiniteCohomology namespace Herbrand diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean index 0f97458cde..2843f62506 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Herbran /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean index 1c3c48a2b6..463ce2bdd4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Basic.lean @@ -28,7 +28,8 @@ This reusable implementation supplies the low-degree cyclic cohomology used by the class-formation and local class field theory layers. -/ -noncomputable section +noncomputable +section open scoped BigOperators @@ -723,7 +724,7 @@ 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 := by +def rightRegularFunctionHerbrandH0 : Type (max uG uB) := by letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) exact HerbrandH0 G (G → B) @@ -757,7 +758,7 @@ 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) := by +def rightRegularFunctionHerbrandHMinusOne (σ : G) : Type (max uG uB) := by letI := rightRegularFunctionMulDistribMulAction (G := G) (B := B) exact HerbrandHMinusOne G (G → B) σ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index 55dcbc7dcc..d15569d60f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -19,7 +19,8 @@ integral parts of a supported idele group. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean index f088c65e01..60d3df2b3a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Cardinality.lean @@ -23,7 +23,8 @@ complex. The resulting cardinality identity is transported to the arithmetic `H⁰` and `H⁻¹` presentations. -/ -noncomputable section +noncomputable +section namespace ProfiniteCohomology namespace Herbrand diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean index fb8f514fc6..907337693d 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean @@ -22,7 +22,8 @@ cohomology are split into focused modules. This public module retains the Herbrand quotient and its multiplicativity result. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean index dffcb4bf91..0c1a7c8a77 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/EquivariantEquiv.lean @@ -24,7 +24,8 @@ introducing comparison assumptions. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean index ff38c81b06..68ddf2d1c5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Index.lean @@ -19,7 +19,8 @@ cardinality is at least `n`. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean index b1a056e1f0..cf970f72c0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Product.lean @@ -16,7 +16,8 @@ dependent products, giving the product step for low-degree Herbrand quotients. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean index b0eae03e53..8cf6eebaf1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean @@ -16,7 +16,8 @@ open CategoryTheory namespace CyclicCohomology.ProfiniteCohomology.Herbrand -noncomputable section +noncomputable +section universe u w @@ -146,7 +147,8 @@ private theorem repSigmaMinusOne_toMul rw [toMul_sub] exact div_eq_mul_inv _ _ -private def fixedCyclesAddEquiv : +/-- 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 @@ -251,7 +253,8 @@ noncomputable def tateH0IsoHerbrandH0 : exact TateCohomology.isoZeroBoundary M ≪≫ S.moduleCatHomologyIso ≪≫ eQ.toModuleIso -private def normKernelCyclesAddEquiv : +/-- 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 @@ -296,7 +299,8 @@ 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 -private noncomputable def tateHMinusOneIsoHerbrandHMinusOne_of_commGroup +/-- 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 σ) : @@ -367,7 +371,7 @@ noncomputable def tateHMinusOneIsoHerbrandHMinusOne ModuleCat.of ℤ (Additive (HerbrandHMinusOne G A σ)) := by letI : IsCyclic G := ⟨⟨σ, hgen⟩⟩ letI : CommGroup G := IsCyclic.commGroup - exact tateHMinusOneIsoHerbrandHMinusOne_of_commGroup σ hgen + exact tateHMinusOneIsoHerbrandHMinusOneOfCommGroup σ hgen end diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean index c8281b2f67..2e9ea8407b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Induced.lean @@ -26,7 +26,8 @@ this module adds the cyclic-coordinate and Herbrand calculations. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index afba350a65..6c3ce06179 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -17,7 +17,8 @@ namespace CyclicCohomology open LocalFieldTheory -noncomputable section +noncomputable +section universe u @@ -1626,7 +1627,8 @@ namespace CyclicCohomology open LocalFieldTheory -noncomputable section +noncomputable +section open scoped ValuativeRel open Filter diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean index e8b851574c..12d979157e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Permuta /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean index fcb8e7a49d..bdc20142bc 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Lattice.lean @@ -21,7 +21,8 @@ over the finite group. @[expose] public section -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index 523676578e..f501ff1687 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -19,7 +19,8 @@ orbit-stabilizer Herbrand quotient calculation. open scoped BigOperators -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean index 1aa5e263a9..0d8b76215d 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -27,7 +27,8 @@ subgroup. open scoped BigOperators -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean index b08a4454e5..f8839c660a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.Herbrand.Princip /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean index 192f604f0b..19498bdd4d 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientReps.lean @@ -16,7 +16,8 @@ namespace CyclicCohomology open LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean index 80eb3dd606..2bc5e66ce6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/PrincipalUnits/QuotientTower.lean @@ -19,7 +19,8 @@ namespace CyclicCohomology open LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean index f49f7d9e10..7a35c555af 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Product.lean @@ -19,7 +19,8 @@ product formula for Herbrand quotients. open scoped BigOperators -noncomputable section +noncomputable +section namespace CyclicCohomology diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean index c1096ed27a..a1508a0fcc 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/NormKernelVanishing.lean @@ -30,7 +30,8 @@ between the two conventions replaces a generator by its inverse and does not change either quotient below. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean index 1989865817..7c3897439f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateComparison.lean @@ -18,7 +18,8 @@ model: both targets are the homology objects already defined by mathlib. @[expose] public section -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean index 28eb65a78e..3d6018bd30 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Cyclic.TateH0.NormImage /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean index 75c68687a3..7fb8b5c571 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Invariants.lean @@ -19,14 +19,16 @@ arithmetic identification with the units of the base field. namespace CyclicCohomology -noncomputable section +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 -private noncomputable def invariantUnitToBaseUnit (K L : Type) +/-- 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 @@ -74,7 +76,8 @@ private lemma invariantUnitToBaseUnit_spec (K L : Type) change algebraMap K L (Classical.choose hmem) = (y : L) exact Classical.choose_spec hmem -private noncomputable def baseUnitToInvariantUnit (K L : Type) +/-- 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 @@ -111,7 +114,7 @@ noncomputable def invariantsUnitsAddEquivBaseUnits (K L : Type) 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 := baseUnitToInvariantUnit_invariantUnitToBaseUnit K L + left_inv := by exact baseUnitToInvariantUnit_invariantUnitToBaseUnit K L right_inv := by intro x apply Additive.ofMul.injective diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean index b727586e94..062e630b6c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/Main.lean @@ -20,7 +20,8 @@ namespace CyclicCohomology open LocalFieldTheory -noncomputable section +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 diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean index 38e4b7cb11..9e378215e1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/TateH0/NormImage.lean @@ -20,7 +20,8 @@ namespace CyclicCohomology open LocalFieldTheory open CategoryTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean index b5457d9789..7f2c932be6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean index 943bdbf451..146e7cf757 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Augmentation.lean @@ -25,7 +25,8 @@ transfer theorem. open scoped Pointwise -noncomputable section +noncomputable +section namespace GroupTheory namespace Augmentation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean index 24cbbb8830..b0d6c51e0e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Finite.lean @@ -29,7 +29,8 @@ is contained in the normal core of `H`; therefore it is trivial when @[expose] public section -noncomputable section +noncomputable +section universe uG diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean index 4fde4d173c..84e377bbae 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Quotient.lean @@ -19,7 +19,8 @@ supported ideles represents the full idele class group. @[expose] public section -noncomputable section +noncomputable +section variable {G : Type*} [CommGroup G] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean index d81ce6e70b..bf6d0d4092 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/QuotientTower.lean @@ -18,7 +18,8 @@ when cardinal-valued indices must also cover infinite towers. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean index c78a8442b3..cd411093a1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.GroupTheory.Transfer.Wi /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean index 9a483749e6..91b188c973 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/RelativeAugmentation.lean @@ -25,7 +25,8 @@ from the integral group rings themselves. open scoped Pointwise -noncomputable section +noncomputable +section namespace GroupTheory namespace Transfer diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean index 964312570f..0d5a69058f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/GroupTheory/Transfer/Witt.lean @@ -32,7 +32,8 @@ presentation relations are assumed as extra input. open scoped BigOperators Pointwise -noncomputable section +noncomputable +section namespace GroupTheory namespace Transfer diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean index 9de6c8c0f1..fcc55f3530 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean index f3f4c393af..7a882f62e9 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Abstract.KummerG /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean index de53ea75a6..ad85daf9d5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianAssembly.lean @@ -26,7 +26,8 @@ a family of such radicals whose subgroups intersect in `G_L` generates the abstract field `L` over `K`. -/ -noncomputable section +noncomputable +section variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean index 6b3064920c..6382080bad 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerAbelianCyclicFactors.lean @@ -31,7 +31,8 @@ original normal subgroup. No radical generators or field-lattice endpoint are asserted here. -/ -noncomputable section +noncomputable +section section FiniteAbelianCyclicFactors diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean index 0252a164a5..b9bc0dd388 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerCyclicOperator.lean @@ -29,7 +29,8 @@ stabilizer. This is the abstract analogue of the construction `a^σ⁻¹ = ζ` and hence the single-radical generation step. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean index 66ea197381..4899fe2de1 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerDelta.lean @@ -28,7 +28,8 @@ the construction datum that the kernel of `wp` is generated by its distinguished element `xi`. -/ -noncomputable section +noncomputable +section variable {G : IntegralRepGroupType} [Group G] [TopologicalSpace G] diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean index 68bd11f6f3..0b9210b769 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerFixedField.lean @@ -26,7 +26,8 @@ closed. Closedness follows directly from continuity of each orbit map and the discrete topology on the coefficient module. -/ -noncomputable section +noncomputable +section /-- The subgroup of `G_K` fixing every element of `S`, viewed as a subgroup of the ambient abstract Galois group `G`. -/ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean index 90e48725fb..cfd48a8ac4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Abstract/KummerGlobalOperator.lean @@ -28,7 +28,8 @@ The result remains only the finite cyclic step of the finite abelian Kummer deco full abelian Kummer correspondence. -/ -noncomputable section +noncomputable +section open CategoryTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean index fca52f53bd..a277f63f96 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete.lean @@ -31,4 +31,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SimpleE /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean index 3462e420b1..5cc5925c3f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean index 2384a2edc0..0db15d0f5a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean index 7fb4a29f1f..fe559bbb2e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Basic.lean @@ -21,7 +21,8 @@ the compiled stages of the profinite-unit decomposition. open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean index 0576ade3f5..652eb5dd62 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/CyclotomicQuotient.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean index 247db5bc10..ea4553a92f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Decomposition.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean index 07db821170..b9d911f4b8 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/DenseTorsion.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean index b48f859185..7a669d594e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteFree.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace 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 index cde5659e5b..a6c568658b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FiniteOrder.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean index e7c3ef5c6c..964440d0e4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/FreeCoordinate.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean index 1b3cdd6d82..faf9f4f4d6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Gather.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace 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 index f7f30f7881..6af81025b5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Local.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace 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 index 91503abee3..5b6b3b7caa 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/Swap.lean @@ -20,7 +20,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU open scoped Topology -noncomputable section +noncomputable +section namespace 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 index 1a83fb5619..7e63294e1a 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientEquiv.lean @@ -20,7 +20,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean index c2dfb7c3cb..5cf023644f 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/ProfiniteUnitDecomposition/TorsionQuotientMk.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.Cycloto open scoped Topology -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean index e8204085dd..7e54e93d1b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacter.lean @@ -25,7 +25,8 @@ introduced here. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean index 039b359cad..89a184af06 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicCharacterEquiv.lean @@ -19,7 +19,8 @@ of the restriction maps to those levels. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean index b2b47745d5..b200039247 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicField.lean @@ -22,7 +22,8 @@ the rational cyclotomic calculation. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean index 172515f5ce..d19becb994 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/Cyclotomic/RationalCyclotomicTorsionField.lean @@ -20,7 +20,8 @@ and fixed field. No copy of the Galois group is replaced definitionally by @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean index 06d47c89cc..51727c97ce 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/CyclotomicField.lean @@ -18,7 +18,8 @@ of orders induces an algebra homomorphism between the corresponding fields. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean index b80eebd384..a28547a917 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/ExtensionRoundTrip.lean @@ -18,7 +18,8 @@ to the actual radical subgroup of `E` recovers `E` itself. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean index e0227bbd5c..917c0937f5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteCharacterEquiv.lean @@ -27,7 +27,8 @@ lattice correspondence between radical subgroups and abelian extensions. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean index 4b0416c307..0bb4216733 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteDualSeparation.lean @@ -21,7 +21,8 @@ No lattice correspondence or infinite Kummer endpoint is asserted here. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean index e448f2f511..db2b3d3ca4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteGeneration.lean @@ -23,7 +23,8 @@ the Kummer generation theorem; it is not the general abstract-module or infinite @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean index 1dfd941fb5..cd27bcc260 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/FiniteSupport.lean @@ -23,7 +23,8 @@ finite Kummer theory; no finite Kummer endpoint is assumed here. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean index cf5614d7b6..53d1e5441b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteContinuity.lean @@ -24,7 +24,8 @@ asserted here. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean index 9833928a50..b892c3e086 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteGeneration.lean @@ -22,7 +22,8 @@ abstract-operator statement of the Kummer generation theorem. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean index aab2371eac..f5ccbb37f5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/InfiniteInverse.lean @@ -20,7 +20,8 @@ theorem at that stage shows that the original radical already belongs to @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean index ad25f3756b..12484c2bd4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/KummerCorrespondenceFormula.lean @@ -30,7 +30,8 @@ then supplies one automorphism solving all coordinates simultaneously. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean index 0880088b3a..678f771693 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalMaximalKummerExtension.lean @@ -18,7 +18,8 @@ the Kummer extension obtained by adjoining all `n`-th roots is finite. @[expose] public section -noncomputable section +noncomputable +section universe v diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean index d17077192f..339623b8e0 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/LocalUnitKummerUnramified.lean @@ -28,7 +28,8 @@ open _root_.RamificationTheory.DiscreteValuationField.ValuedExtension renaming open scoped ValuativeRel open LocalFieldTheory -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean index a9116da96e..43e6e7b358 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/MaximalKummerSubgroup.lean @@ -17,7 +17,8 @@ restricted radical quotient is canonically the ordinary power-class group. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean index e2c08138ec..e27f08cca4 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RadicalExtension.lean @@ -25,7 +25,8 @@ abelian of exponent dividing `n`. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean index ea107d8da0..53845bb8d7 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/RestrictedFinite.lean @@ -27,7 +27,8 @@ No character-surjectivity or lattice-correspondence conclusion is assumed. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean index 8188dc7775..02d75e062e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Kummer.Concrete.SUnitPr /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean index 46ebee2b63..b5769e1afa 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SUnitPreparation/PrimePowerKernelCoordinates.lean @@ -23,7 +23,8 @@ Linear-algebraic coordinates for kernels of surjections between finite free modu open scoped IsMulCommutative -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean index a84c6a98d6..d321d370bd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtension.lean @@ -18,7 +18,8 @@ the `n`-th roots of unity, this is a finite cyclic Galois extension. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean index 9a5f0b35d6..b56c4e6a43 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Kummer/Concrete/SimpleExtensionNorm.lean @@ -21,7 +21,8 @@ not require the defining power polynomial to be irreducible. @[expose] public section -noncomputable section +noncomputable +section namespace KummerTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean index fcf2f26474..f363b817ba 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.ProfiniteIntegers.Topol /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean index 278ebb9aef..249088e2e5 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/CyclotomicTorsionQuotient.lean @@ -21,7 +21,8 @@ turns that decomposition into a `ℤ̂`-extension. open scoped Topology -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean index 0b0d418623..994fa7fe13 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteInteger.lean @@ -26,7 +26,8 @@ multiplication by a positive integer identifies `ℤ̂` with the closed subgroup `n ℤ̂`, which is the kernel of reduction modulo `n`. -/ -noncomputable section +noncomputable +section /-- Distinct natural powers of the canonical positive generator of `ℤ̂` are distinct. This common exponent-uniqueness fact is independent of the later diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean index a4656e0e15..7c6361aabf 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerCore.lean @@ -28,20 +28,27 @@ Mathlib. open scoped Topology -private structure ZHatIndex where +/-- 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 -private instance (i : ZHatIndex) : NeZero i.modulus := +/-- The modulus of a profinite-integer index is nonzero. -/ +instance (i : ZHatIndex) : NeZero i.modulus := ⟨Nat.ne_of_gt i.positive⟩ -private def zHatIndex (n : ℕ) (hn : 0 < n) : ZHatIndex := +/-- Package a positive natural number as a profinite-integer modulus. -/ +def zHatIndex (n : ℕ) (hn : 0 < n) : ZHatIndex := ⟨n, hn⟩ -private abbrev ZHatAmbient : Type 0 := +/-- The product of the finite cyclic rings over all positive moduli. -/ +abbrev ZHatAmbient : Type 0 := ∀ i : ZHatIndex, ZMod i.modulus -private def zHatDiagonal : ℤ →+* ZHatAmbient where +/-- 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 @@ -56,10 +63,12 @@ private def zHatDiagonal : ℤ →+* ZHatAmbient where funext i exact Int.cast_mul a b -private def zHatIntegerSubring : Subring ZHatAmbient := +/-- The diagonal image of the integers in the product of finite cyclic rings. -/ +def zHatIntegerSubring : Subring ZHatAmbient := zHatDiagonal.range -private abbrev ZHatClosureModel : Type 0 := +/-- 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. diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean index f347529a45..f3247dbd8e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerPrimeProduct.lean @@ -20,7 +20,8 @@ This file constructs the canonical map open scoped Topology -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean index da5f90c1a8..f5eb314b63 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/ProfiniteIntegers/ProfiniteIntegerUnits.lean @@ -19,7 +19,8 @@ This file upgrades the prime-product Chinese-remainder equivalence for open scoped Topology -noncomputable section +noncomputable +section namespace ClassFormation diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean index 74ed1d3e53..9b82ac64c6 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Topology.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.GaloisCohomology.Topology.TotallyDisconn /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ProCGroups.lean b/LeanPool/ClassFieldTheory/ProCGroups.lean index e2d39d3bd8..9cbe3583df 100644 --- a/LeanPool/ClassFieldTheory/ProCGroups.lean +++ b/LeanPool/ClassFieldTheory/ProCGroups.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.ProCGroups.InducedFunctions /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean index 5aca40e61f..ec3742eaa8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean index edf0e97eb9..c66fe556af 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean index 6fcd3862b3..011b1307ee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Pr /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean index 59e3b2ccb1..c247060a86 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/ContinuousFieldUnitLog.lean @@ -46,7 +46,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean index 74ac52a8fe..2392a45af3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/DenominatorValuation.lean @@ -19,7 +19,8 @@ the natural-number valuation formula used in the logarithm and exponential theor @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean index 72c8ada67e..3627089fc9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogExtension.lean @@ -18,7 +18,8 @@ algebraic construction. @[expose] public section -noncomputable section +noncomputable +section universe u @@ -184,10 +185,10 @@ theorem fieldUnitLogHomWithUniformizerValue_eq_of_principal_decomposition (((1 : CompleteDVF.higherPrincipalUnitGroup.residueRootsOfUnityGroup F), u), (1 : Multiplicative ℤ)) hx -open CompleteDVF.higherPrincipalUnitGroup renaming +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF → fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF in -open CompleteDVF.higherPrincipalUnitGroup renaming +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean index 5fd0141c33..a902c7e59f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/FieldUnitLogUniqueness.lean @@ -17,7 +17,8 @@ on a uniformizer. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean index 8d43a17799..e34cd3a828 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -27,7 +27,8 @@ valued field whose normalized valuation restricts to `e * v_p` on the natural numbers. -/ -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean index 10316a1357..4512696a17 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpComposition.lean @@ -26,7 +26,8 @@ convergence ball. The source lemmas below justify the Cauchy products and the unconditional regrouping involved in power-series substitution. -/ -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean index da469ae93f..a9861c0b2b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpContinuity.lean @@ -19,7 +19,8 @@ exponential and logarithm maps are continuous for the valuation topology. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean index ca5c87f75e..1348bcf397 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Lo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean index 3a29a5113f..459c1a8859 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean @@ -19,7 +19,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean index c7266eb02a..87edc975de 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCore.lean @@ -30,7 +30,8 @@ The formal-series identities and the underlying position calculus live in `FormalCoreBase`. -/ -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean index 325b98dae3..874e833942 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Analytic.Lo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean index b772cc034e..f06e409000 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/BasicFactors.lean @@ -16,7 +16,8 @@ finite choice spaces. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean index 61b82bcc86..96aef87496 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoiceCountSystem.lean @@ -16,7 +16,8 @@ a choice of the basic factors in `X + Y + XY`. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean index 468d7e13e3..fc09b9a6e8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ChoicePositions.lean @@ -16,7 +16,8 @@ sets and proves the resulting position-count formulas. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean index eeeaf526ec..832f187447 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ExplicitChoiceCounts.lean @@ -16,7 +16,8 @@ label-count and multinomial choice spaces. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean index 73bca469e0..4964722970 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/PowerSeriesComposition.lean @@ -18,7 +18,8 @@ logarithm and exponential. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean index 470386178e..111a6ddad0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalCoreBase/ProductArgument.lean @@ -18,7 +18,8 @@ support description needed for the formal product formula. @[expose] public section -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean index f804077278..9cb7c0cb93 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -19,7 +19,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean index 561c354bfa..e4fa8b9d2c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/Homomorphisms.lean @@ -39,7 +39,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean index 08139a8b9b..95bbc3e4b1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/InverseEstimates.lean @@ -23,7 +23,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean index f9fefce807..550c1da1c2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/LogConvergence.lean @@ -19,7 +19,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean index 4ccd2860c5..472cece94f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitExp.lean @@ -23,7 +23,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean index 212d085eb8..1fe7dbb0f0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog.lean @@ -16,4 +16,3 @@ The logarithm maps deep principal units to maximal-ideal powers. Its inverse identities assemble into the underlying and multiplicative equivalences. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean index ad6ec99a41..bb3b3302a5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -43,7 +43,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean index 1f37942e56..041f892689 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Equivalences.lean @@ -17,7 +17,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean index df97f5d4e8..f0dc610190 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/SeriesTerms.lean @@ -21,7 +21,8 @@ open Filter open Polynomial open scoped Topology open scoped PowerSeries.WithPiTopology -noncomputable section +noncomputable +section attribute [local instance] Classical.propDecidable diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean index c7194303f0..05ed4f4f46 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/PrincipalUnitExpLogEquiv.lean @@ -18,7 +18,8 @@ or defect-membership hypothesis remains in the public result. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean index b072771303..e6bc0f2707 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField.lean @@ -42,4 +42,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 74be439609..5ccce3a652 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -56,7 +56,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrictNontriviallyNormedField -noncomputable section +noncomputable +section universe u v @@ -542,12 +543,12 @@ noncomputable def adicPowerSeriesEvalSubringHom haveI : IsUniformAddGroup F.residueField := inferInstance letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - haveI : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - haveI : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - haveI : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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) @@ -568,12 +569,12 @@ theorem adicPowerSeriesEvalSubringHom_surjective have : DiscreteUniformity F.residueField := inferInstance have : IsUniformAddGroup F.residueField := inferInstance let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - have : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - have : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - have : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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⟧ := @@ -652,12 +653,12 @@ noncomputable def adicLaurentSeriesEvalHom haveI : IsUniformAddGroup F.residueField := inferInstance letI : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - haveI : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - haveI : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - haveI : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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) @@ -682,12 +683,12 @@ theorem adicLaurentSeriesEvalHom_algebraMap_C have : IsUniformAddGroup F.residueField := inferInstance let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - have : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - have : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - have : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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π @@ -713,12 +714,12 @@ theorem adicLaurentSeriesEvalHom_algebraMap_X have : IsUniformAddGroup F.residueField := inferInstance let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - have : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - have : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - have : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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π @@ -744,12 +745,12 @@ theorem adicLaurentSeriesEvalHom_comp_powerSeries have : DiscreteUniformity F.residueField := inferInstance have : IsUniformAddGroup F.residueField := inferInstance let : WithIdeal F.valuationSubring := { i := F.maximalIdeal } - have : IsLinearTopology F.valuationSubring F.valuationSubring := - valuationSubring_isLinearTopology_withIdeal (F := F) - have : CompleteSpace F.valuationSubring := - valuationSubring_completeSpace_withIdeal (F := F) - have : T2Space F.valuationSubring := - valuationSubring_t2Space_withIdeal (F := F) + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean index 0b687fb138..5b35059d18 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNorm.lean @@ -23,7 +23,8 @@ This file connects mathlib's `Algebra.norm` with the unit-group and valued-norm APIs used by local CFT. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean index b31e566f27..b376a56bbb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormBase.lean @@ -18,7 +18,8 @@ norm transitivity. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean index 947cbe3098..e1a100c3ae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldNormEquiv.lean @@ -17,7 +17,8 @@ group. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean index ed9a0643b3..e0ccb4fbab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitDecomposition.lean @@ -54,7 +54,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit -noncomputable section +noncomputable +section open Filter open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean index 0c193597ac..c2f016ef62 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitFactors.lean @@ -33,7 +33,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU residueRootsOfUnityGroup -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean index 332dbcc97b..0dc1dc0041 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitPowerIndexFormulas.lean @@ -21,7 +21,8 @@ form involving the normalized local absolute value are recorded. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean index 019234179a..667c14e969 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -19,7 +19,8 @@ the given `WithZero (Multiplicative ℤ)`-valued valuation. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean index 24dce4f57b..29ac59fb19 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FiniteCoefficientLaurent.lean @@ -25,7 +25,8 @@ coefficientwise map from `F_p((X))` to `k((X))`. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean index b5ae14312f..dc1e116aa6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaIndexing.lean @@ -19,7 +19,8 @@ records that, when the basis is nonempty, this is exactly a countable product. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean index accf064832..7473364267 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/IwasawaPrincipalUnits.lean @@ -93,7 +93,8 @@ and establishes its algebraic injectivity. The convergent global product is assembled in `IwasawaPrincipalUnits`. -/ -noncomputable section +noncomputable +section open scoped BigOperators @@ -1585,7 +1586,8 @@ end higherPrincipalUnitGroup end CompleteDVF end LocalFieldTheory.DiscreteValuationField -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean index 91e78f1150..39c3144738 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicQp.lean @@ -40,7 +40,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrictNontriviallyNormedField -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean index 36c4eead39..b5b343bb5b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index b84f7fbf99..5b507b2f4d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -23,7 +23,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU toPrincipalUnitFiltration -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean index 8bc2618cab..84df72882e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/DeepPrincipalUnits.lean @@ -22,7 +22,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrictNontriviallyNormedField -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean index d2bac71d03..fc5dc4a738 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/IntegralLattice.lean @@ -42,7 +42,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming target_valuationSubring_isIntegralClosure_of_finite_separable -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean index 1b67ba9374..9e9555e9d1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean index 1905744ee8..898fca4b1a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Basic.lean @@ -22,7 +22,8 @@ integer-valued multiplicative valuation and a norm homomorphism satisfying the standard valuation formula. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean index b936571453..82e92c883c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Norm/Quotients.lean @@ -22,7 +22,8 @@ the resulting cyclic equivalences. -/ namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u v @@ -1983,7 +1984,8 @@ universe u v namespace LocalFieldTheory -noncomputable section +noncomputable +section namespace DiscreteValuationField namespace ValuedNorm diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean index e28ec676c9..491830668c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/NormFiltration.lean @@ -20,7 +20,8 @@ A compatibility hypothesis for a norm and two unit filtrations immediately produces homomorphisms on every filtration level. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean index 39651e8a1b..653fac3694 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicField.lean @@ -20,7 +20,8 @@ statements instead of introducing public aliases for `ℚ_[p]` or its unit group @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory.DiscreteValuationField namespace Examples @@ -315,7 +316,7 @@ theorem tendsto_zero_logSeriesTermField_padic_mulValuation_of_lt_one (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) (padic_mulValuation_logSeries_denominator p) hvx -open MultiplicativeIntegerValuation renaming +open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation renaming tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one → tendsto_zero_signedLogSeriesTermField_ofWithZeroValuation_of_lt_one in /-- Signed version of @@ -336,7 +337,7 @@ theorem tendsto_zero_signedLogSeriesTermField_padic_mulValuation_of_lt_one (fun n => Nat.cast_ne_zero.mpr (Nat.succ_ne_zero n)) (padic_mulValuation_logSeries_denominator p) hvx -open MultiplicativeIntegerValuation renaming +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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean index c6c5c27206..38e80fe998 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicLinearOfContinuous.lean @@ -22,7 +22,8 @@ p-adic scalar. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean index e7847fc1d2..784e540e0d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicModuleStructure.lean @@ -24,7 +24,8 @@ rank `d`, the module is topologically the product of that cyclic factor and @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean index 169c65ec85..c6946ea36a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicPowerIndex.lean @@ -18,7 +18,8 @@ This is the free p-adic factor in the local-field structure theory, the local-fi @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean index 83072bb346..7a81866179 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PadicValuationComparison.lean @@ -22,7 +22,8 @@ extensions. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean index 5fd687e865..dbe9aca456 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PolynomialRootProximity.lean @@ -24,7 +24,8 @@ Repeated roots and zero derivative values are allowed; the statement is in @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean index 9acde7f437..a28109cbc1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PowerIndex.lean @@ -52,7 +52,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU fieldUnitsEquivRootsPrincipalUnitsUniformizerOfCompleteDVF -noncomputable section +noncomputable +section open ValuationTheory.DiscreteValuationField open LocalFieldTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean index c6e06062be..f90485ff82 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitInverseLimitSurjectivity.lean @@ -20,7 +20,8 @@ of a fixed target form a decreasing sequence of nonempty compact closed sets. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean index 7715e9c506..aff2946261 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction.lean @@ -20,4 +20,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean index 6b088785d9..899e6d7123 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicPadicModule.lean @@ -18,7 +18,8 @@ comparison, producing its linear and topological forms on first principal units. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean index 7ced1ca864..77919e41f7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/AdicProdiscreteComparison.lean @@ -16,7 +16,8 @@ by the inverse limit of finite quotient coordinates. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean index 3a4b5f7cc0..4f9a2656e3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/Core.lean @@ -21,7 +21,8 @@ principal units. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean index e13a49557b..5068c4fda5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/FiniteQuotientPadicModule.lean @@ -24,7 +24,8 @@ the transition maps. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean index 46cc5ea00d..d7b78e8b01 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitCore.lean @@ -23,7 +23,8 @@ finite coordinate, and compatibility of reduction transports the action to @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean index 2845590165..8c63b40e1b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/InverseLimitTopology.lean @@ -16,7 +16,8 @@ inverse limit of their finite principal-unit quotients. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean index 19fb2ee9c2..cd9d64efd8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/ProdiscretePadicModule.lean @@ -17,7 +17,8 @@ module over the p-adic integers. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean index 5136d1f165..b959ca5363 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/QuotientTransition.lean @@ -17,7 +17,8 @@ discrete valuation field. Neither finiteness nor a scalar action is required. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean index 26773c0995..fea71bcc9a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/TopologyModelTypes.lean @@ -18,7 +18,8 @@ selection. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean index e0ba5e6623..86b7b1c746 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnitPadicAction/WithZeroValuationTopology.lean @@ -18,7 +18,8 @@ continuous on the original principal-unit carrier. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean index ac45234eaf..d4939a260b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits.lean @@ -16,4 +16,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean index 2eda7d94dd..20c77e6197 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/AutomorphismTransport.lean @@ -24,7 +24,8 @@ A field automorphism preserving the chosen valuation ring acts on the valuation its residue field, its units, and every principal-unit quotient. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean index a8faadbe59..159e667be6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Core.lean @@ -24,7 +24,8 @@ namespace LocalFieldTheory open ValuationTheory -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean index 907a7f7b32..a9984d18f5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/Filtration.lean @@ -31,7 +31,8 @@ This file turns that definition into the abstract `AntitoneSubgroupFiltration` used by ramification and norm arguments. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean index 6a551f1708..754b08d209 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueQuotient.lean @@ -23,7 +23,8 @@ Identifies valuation-ring units modulo first principal units with residue-field records compatibility with valuation-preserving automorphisms. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean index c45f41821d..68e1f45a9b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/ResidueRoots.lean @@ -27,7 +27,8 @@ Hensel lifting identifies the finite residue-field unit group with the lifted ro unity in the valuation ring. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean index cf4546fecb..8939883c32 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerDecomposition.lean @@ -24,7 +24,8 @@ Decomposes valuation-ring units and field units into residue roots, first princi and a uniformizer factor. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean index 2f1cee00f6..8d0838611b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/PrincipalUnits/TeichmullerLift.lean @@ -24,7 +24,8 @@ Constructs multiplicative Teichmuller representatives, and in equal characterist coefficient-field section of the residue map. -/ -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean index 68fe2b3701..46b0422aee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationAddVal.lean @@ -20,7 +20,8 @@ ideal identity @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean index 4f494da998..522fcce7b7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationIdeal.lean @@ -18,7 +18,8 @@ in the ambient valued-extension context; no extension marker is involved. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean index 0e685def34..a1a64b5d51 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/RamificationInvariants.lean @@ -35,7 +35,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming ramificationIndex_mul_residueDegree_eq_degree_of_finite_separable -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean index 7a1fcc4b0c..96198ca3fe 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits.lean @@ -20,4 +20,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.DiscreteVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean index 632c6c2981..31b82fd6d2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CompleteRangeRestriction.lean @@ -19,7 +19,8 @@ transports residue finiteness, adic completeness, cyclicity, and discreteness. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean index e70add3d3d..48143da4b6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/CyclicValueGroup.lean @@ -22,7 +22,8 @@ for `ℤᵐ⁰`-valued valuations. @[expose] public section -noncomputable section +noncomputable +section universe u x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean index 2eb4a57ecf..9f2bf7640f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuation.lean @@ -18,7 +18,8 @@ proves the elementary formulas for powers and natural-number denominators. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean index cd6f84e0b2..ddb542c254 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/IntegerValuationUniformizer.lean @@ -23,7 +23,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuati mem_zeroSubgroup_iff -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean index 4f8576a977..98114592c5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/LocalFieldRangeRestriction.lean @@ -25,7 +25,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrict_properSpace_of_residueField_finite -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index a45206d4b0..dae51260d2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -26,7 +26,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming mem_maximalIdeal_pow_iff_valuation_le_uniformizer_pow -noncomputable section +noncomputable +section universe u v @@ -48,8 +49,9 @@ noncomputable def mrangeRestrictValued 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] -private noncomputable def mrangeRestrictValued_rankOne +noncomputable def mrangeRestrictValuedRankOne (F : CompleteDVF.{u, v} K) : (@Valued.v K _ (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) _ @@ -69,7 +71,7 @@ noncomputable def mrangeRestrictNontriviallyNormedField (L := K) (Γ₀ := MonoidHom.mrange F.valuation.toMonoidWithZeroHom) (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) - (hv := mrangeRestrictValued_rankOne F) + (hv := mrangeRestrictValuedRankOne F) /-- Powers of a uniformizer are cofinal among neighborhoods of zero for the range-restricted valuation topology. -/ @@ -314,7 +316,7 @@ theorem mrangeRestrict_integer_compactSpace_of_residueField_finite _root_.Valuation K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)).RankOne := - mrangeRestrictValued_rankOne F + mrangeRestrictValuedRankOne F let : NontriviallyNormedField K := Valued.toNontriviallyNormedField (L := K) @@ -361,7 +363,7 @@ theorem mrangeRestrict_properSpace_of_residueField_finite _root_.Valuation K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom)).RankOne := - mrangeRestrictValued_rankOne F + mrangeRestrictValuedRankOne F let : NontriviallyNormedField K := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have hcompact : CompactSpace 𝒪[K] := @@ -372,14 +374,14 @@ theorem mrangeRestrict_properSpace_of_residueField_finite (Valued.toNormedField K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) (val := LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) - (hv := mrangeRestrictValued_rankOne F)).toPseudoMetricSpace + (hv := mrangeRestrictValuedRankOne F)).toPseudoMetricSpace exact (@Valued.integer.properSpace_iff_compactSpace_integer K (MonoidHom.mrange F.valuation.toMonoidWithZeroHom) inferInstance inferInstance (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictValued F) - (mrangeRestrictValued_rankOne F)).2 hcompact + (mrangeRestrictValuedRankOne F)).2 hcompact /-- A range-restricted complete DVF with finite residue field is complete for the associated normed-field topology. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean index 83c0abcf9a..4facbb2469 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestriction.lean @@ -16,7 +16,8 @@ residue field as the original valuation. @[expose] public section -noncomputable section +noncomputable +section universe u x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean index cdbc4d8a51..6663a72c28 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/SeriesValuationEstimates.lean @@ -17,7 +17,8 @@ integer valuations of the logarithm and exponential series terms. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean index be37b610e6..170e73710f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean @@ -17,7 +17,8 @@ therefore an integer-valued multiplicative valuation on field units. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean index b778b7156e..e95383b065 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuationSubringUnitMap.lean @@ -16,7 +16,8 @@ valuation ring to units of its fraction field. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean index d9c9df0284..c956a19918 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/ValuedExtensionUnitMap.lean @@ -19,7 +19,8 @@ index. @[expose] public section -noncomputable section +noncomputable +section universe u v x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean index d0cc4c844a..e1d3b51784 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValueGroup.lean @@ -22,7 +22,8 @@ This file contains the integer value-group subgroup-image lemmas used by integer-valued multiplicative valuations and integer lcm divisibility. -/ -noncomputable section +noncomputable +section namespace DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean index 9aad78a5e7..d100733359 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/WithZeroValuationTopology.lean @@ -36,7 +36,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF renaming mrangeRestrict_completeSpace_of_residueField_finite -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean index 6428b4b4e5..8a1621d109 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.GroupTheory /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean index 21fc7f52cd..804189edd0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/ContinuousQuotientEquiv.lean @@ -20,7 +20,8 @@ layer and does not depend on the separate pro-\(C\) groups library. open scoped Topology -noncomputable section +noncomputable +section namespace LocalFieldTheory.QuotientGroup diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean index b62b9cef2e..c42a40382d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -22,7 +22,8 @@ kernel are mathlib's `powMonoidHom`, `MonoidHom.range`, and `MonoidHom.ker`. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean index 6d21d81c0a..b239d74e5c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField.lean @@ -41,4 +41,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Nonarchimed /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean index 199993f556..3a75841484 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/AdditiveEquiv.lean @@ -17,7 +17,8 @@ between the additive recodings of its source and target. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean index 29dab8f6d0..be0cd4093e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Basic.lean @@ -17,7 +17,8 @@ nonarchimedean local field. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean index 3284ac0692..59cf216cd7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionCompleteDVF.lean @@ -20,7 +20,8 @@ and an integral-closure valuation chosen on each finite separable extension. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory @@ -136,7 +137,12 @@ noncomputable def chosenLocalExtensionCompleteDVF [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] : CompleteDVF.{0, 0} L := - Classical.choose (chosenLocalExtensionCompleteDVF_exists K 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean index 92616206dc..de0799587b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteExtensionTopology.lean @@ -21,7 +21,8 @@ while using the same topology on every field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean index 9ea5e27b62..89a5fa31a2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/FiniteUnramified.lean @@ -23,7 +23,8 @@ finite valued extension with ramification index one and full residue degree. namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index d1549b55e5..ee1ae45e40 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -21,7 +21,8 @@ to ideals, ideal-power quotients, principal units, and successive quotients. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean index 2b7e45a2e1..b9626e4355 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -14,7 +14,8 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Nonarchimed @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean index acff5520a0..ba1407cdd3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/MultiplicativeDecomposition.lean @@ -21,7 +21,8 @@ downstream separation arguments avoid carrying a uniformizer parameter. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean index e657317fad..d870ac6d19 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Norm.lean @@ -22,7 +22,8 @@ rings and their unit groups under the appropriate integral hypotheses. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean index dd55f946cf..fd88da7264 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormContinuity.lean @@ -21,7 +21,8 @@ statements for field units and valuation-ring units. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean index 6437bfbfcd..fcc654fbdc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormQuotient.lean @@ -24,7 +24,8 @@ relates its finite cardinality to the index of the norm subgroup. namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean index 50773e023c..68c03318e7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormSubgroupFunctoriality.lean @@ -17,7 +17,8 @@ identities for unit norms and their images in the base field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean index b18ba5b09d..9c0b5b2d9c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/NormalizedIntegerValuation.lean @@ -26,7 +26,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming moduleFinite_target_valuationSubring_of_finite_separable -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean index 7cb7755d31..8d9b708c08 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PowerClassFiniteness.lean @@ -33,7 +33,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField renaming finite_fieldUnits_nthPowerQuotient_of_finite_principalUnits -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean index dd2110f3d6..21b3a1def2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitActions.lean @@ -17,7 +17,8 @@ units, and their successive quotients, together with the resulting actions. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u @@ -133,7 +134,7 @@ def maximalIdealPowSuccQuotMapOfIntegerRingEquiv maximalIdealPowSuccQuotLift n (fun a => maximalIdealPowSuccQuotMk K n (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a)) - (maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) + (by exact maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) refine { toFun := f map_zero' := ?_ @@ -166,7 +167,7 @@ theorem maximalIdealPowSuccQuotMapOfIntegerRingEquiv_mk change maximalIdealPowSuccQuotLift n (fun b => maximalIdealPowSuccQuotMk K n (maximalIdealPowMapEquivOfIntegerRingEquiv K n e b)) - (maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) + (by exact maximalIdealPowSuccQuotMapOfIntegerRingEquiv_respects K n e) (maximalIdealPowSuccQuotMk K n a) = maximalIdealPowSuccQuotMk K n (maximalIdealPowMapEquivOfIntegerRingEquiv K n e a) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean index 2e4c6fa3ed..e68731a6e7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -19,7 +19,8 @@ Develops `U^n/U^(n+1)` and identifies it with the additive ideal quotient @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean index 4f480c3a2a..60a0927dee 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnits.lean @@ -17,7 +17,8 @@ constructs the quotient of valuation-ring units by the first filtration step. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean index c993980aa8..eb09c64ef3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ProfiniteUnits.lean @@ -21,7 +21,8 @@ profinite group. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean index dd52a18a3d..f05fe5381f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueExtension.lean @@ -28,7 +28,8 @@ units by a valued extension, with degree, trace, norm, and Frobenius results. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean index 81a3115b81..77bdc1324e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueGalois.lean @@ -21,7 +21,8 @@ the resulting kernels and stabilizers with inertia subgroups. namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean index d59eb8f08c..157b6e39be 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean @@ -20,7 +20,8 @@ identifies it, multiplicatively and additively, with the residue-field units. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean index 49f4b6dc5a..ab949420ab 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/SeparableNormValuation.lean @@ -29,7 +29,8 @@ ramification and residue degrees below are the actual invariants of the valuation-ring extension; no packaged norm-valuation hypothesis is assumed. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean index e00c25028a..8211dfe1cc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean @@ -18,7 +18,8 @@ of an arbitrary-universe nonarchimedean local field. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean index 95f675d9ad..a6c8aa89f0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Small.lean @@ -19,7 +19,8 @@ be represented in `Type 0`. No countability of the field itself is asserted. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean index 14e3a89074..0f8cf5d9bf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/StandardOpenSubgroups.lean @@ -17,7 +17,8 @@ principal-unit group. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean index 6118d47001..0983075306 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnitTopology.lean @@ -17,7 +17,8 @@ the native topology of a nonarchimedean local field. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean index b2c90e7745..e93146f36d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -25,7 +25,8 @@ residue extension, then lifted to `Gal(L / K)` through the canonical residue-action isomorphism for a finite unramified extension. -/ -noncomputable section +noncomputable +section universe u @@ -449,7 +450,8 @@ noncomputable def galoisGroupEquivZModOfUnramifiedValuation /-- 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. -/ -private noncomputable def zmodAddEquivOfGenerator {A : Type*} [AddGroup A] +/-- Identify an additive group generated by an element of order `n` with `ZMod n`. -/ +noncomputable def zmodAddEquivOfGenerator {A : Type*} [AddGroup A] (g : A) {n : Nat} (horder : addOrderOf g = n) (hgen : AddSubgroup.zmultiples g = ⊤) : ZMod n ≃+ A := by @@ -501,7 +503,8 @@ private lemma additive_zmultiples_eq_top_of_zpowers_eq_top {G : Type*} [Group G] rw [hgen] exact Subgroup.mem_top (Additive.toMul x) -private noncomputable def zmodCyclicMulEquivOfGenerator {G : Type*} [Group G] +/-- 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 := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean index 2b4e80440f..603adccc5b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/Valuation.lean @@ -18,7 +18,8 @@ the associated surjective multiplicative valuation with a uniformizer. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean index 26a2894e1b..392dbc887a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuationExactSequence.lean @@ -21,7 +21,8 @@ sequence from valuation-ring units through field units to `ℤ`. namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean index 667f7342aa..6f87bc6697 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuativeExtension.lean @@ -55,7 +55,8 @@ end Valuation namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean index 3bb33c391d..7bffc387df 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ValuedTopology.lean @@ -17,7 +17,8 @@ valued field is the valuative topology for that induced relation. @[expose] public section -noncomputable section +noncomputable +section namespace LocalFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean index 0e01d90a52..33c667b6c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NormUnits.lean @@ -19,7 +19,8 @@ discrete-valuation APIs can share the same definition. @[expose] public section namespace LocalFieldTheory -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean index 74dbbc877a..682ebb9789 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.UnitD /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean index e9719bfb53..7df9cba557 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic.lean @@ -11,4 +11,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean index 3eb56470bc..50f92cbefb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified.lean @@ -17,4 +17,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean index 5033a33ee8..d76e8644cd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinPolynomial.lean @@ -29,7 +29,8 @@ conclusion is assumed. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean index 3ac5b8738e..7bfa74aefd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/EisensteinRelation.lean @@ -15,7 +15,8 @@ This file extracts the unit relation `p · u = (ζ - 1)^φ` from the translated @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean index f74b9d6f4c..fb6b534c5a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/Existence.lean @@ -20,7 +20,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming isTotallyRamified_iff_ramificationIndex_eq_degree_of_finite_separable -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean index 16668d8ac2..576be64765 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralClosure.lean @@ -21,7 +21,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ValuedExtension renaming integralClosure_isDiscreteValuationRing_of_finite_separable -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean index 3e125a395f..23758f2fb2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/IntegralTranslate.lean @@ -15,7 +15,8 @@ This file records that translating `ζ` by one preserves the explicit integral c @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean index 5b502b6070..96725282c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/PrimeElement.lean @@ -15,7 +15,8 @@ This file proves directly from its norm that `1 - ζ` is prime in the explicit D @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean index b6d4eafd91..994bb6a483 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/RamificationIndex.lean @@ -22,7 +22,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.ValuedExtension renaming target_maximalIdeal_pow_not_le_pow_succ -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean index 7a3b0121f5..928f9e6c0b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/TotallyRamified/ValuationRingEquiv.lean @@ -15,7 +15,8 @@ This file constructs the concrete equivalence from `ℤ_[p][ζ - 1]` to the actu @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean index adcff9ca1b..f61bd21e5c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified.lean @@ -10,4 +10,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Padic.Cyclo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index 5a0b979bad..1d45f54371 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -38,7 +38,8 @@ The proof follows the arithmetic construction directly and uses no comparison ce @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean index 0abc930d2a..8485dae0d0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/NonarchimedeanLocalField.lean @@ -18,7 +18,8 @@ the topology-first local-field interface used by this library. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean index 2c5402ea6d..12bfc0acba 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/PrincipalUnits.lean @@ -74,7 +74,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.WithZeroValuationTopology re completeSpace_ofWithZeroValuation -noncomputable section +noncomputable +section open scoped ValuativeRel WithZero diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean index 8b25874473..1caf4655c4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -45,7 +45,8 @@ open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalU open scoped Topology -noncomputable section +noncomputable +section namespace LocalFieldTheory namespace Padic diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean index 4c7ca98c2f..ef57b3ddb3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified.lean @@ -23,4 +23,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.LocalField.Unramified. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean index b1a931d5ec..207b70e43d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChange.lean @@ -23,7 +23,8 @@ No finite-dimensionality of `K'/K` is used. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean index 6f9e7f52aa..5b9a10769b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BaseChangeCore.lean @@ -20,7 +20,8 @@ the resulting residue subfield degree with the fundamental inequality. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean index d62bba1c71..9015e11bb9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/BasicInvariants.lean @@ -20,7 +20,8 @@ and hence the source and target value subgroups coincide. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean index b46a5e1109..5b2450ea9e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Composition.lean @@ -20,7 +20,8 @@ degrees. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean index a15e6fc60f..0cf911bddb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Definitions.lean @@ -17,7 +17,8 @@ degree equality and residue separability condition. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean index f23826f5dd..8eaa9c1987 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/FiniteSupport.lean @@ -19,7 +19,8 @@ the finite-support fact used in the maximal-residue theorem. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean index 0fbf04ea14..5c91e359b3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselReduction.lean @@ -20,7 +20,8 @@ Hensel lifting contradicts irreducibility upstairs. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean index 170549c6d2..7bc0c436f4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/HenselianAlgebraicExtension.lean @@ -20,7 +20,8 @@ the unramified base-change theorem. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean index b036790a6d..34d16d1e95 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalResidue.lean @@ -17,7 +17,8 @@ forward residue-field inclusion to the corresponding finite statements. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean index 9a6011f217..5034b8a6bb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/MaximalSubextension.lean @@ -20,7 +20,8 @@ unramified intermediate fields. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean index a1170c8446..ce9d623595 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/RamificationIndexTower.lean @@ -16,7 +16,8 @@ The generic tower and embedding-monotonicity lemmas extracted from the tame adap @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean index 6e6a7ed783..4cb292378d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueEmbedding.lean @@ -24,7 +24,8 @@ extra hypothesis. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean index 2d2d40ac1c..0c51de568e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/ResidueLifting.lean @@ -17,7 +17,8 @@ element, then lift its simple linear factor over the ambient valuation ring. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean index 39d243f551..420b071fe6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Unramified/Separable.lean @@ -24,7 +24,8 @@ minimal polynomial with its separable reduction. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean index b65b3a15b8..13c17f713a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Profinite /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean index 1d6d1d781d..da48959ee7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ClosedSubgroups.lean @@ -23,7 +23,8 @@ infinite Galois extension. Each failure is witnessed by one field element, hence coset of the open subgroup fixing the finite simple extension generated by that element. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean index 1bcaa3faee..0bb2060104 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -19,7 +19,8 @@ the local unramified criterion. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean index e445687b51..78576f0a8c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Filtration.lean @@ -18,7 +18,8 @@ subgroup filtration to the real line by the natural-number ceiling. @[expose] public section -noncomputable section +noncomputable +section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean index 9e0bb6d3ff..84955c0a48 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation.lean @@ -15,4 +15,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean index 6425da2f07..d074a21bf0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.GaloisVal /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean index 9967fa609c..41e86a0ba6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/AbsoluteRamification.lean @@ -47,7 +47,8 @@ This file develops the decomposition and inertia subgroups of an absolute Galois group after the finite-level valuation-restriction layer. -/ -noncomputable section +noncomputable +section universe u v w z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index c62dc13d67..da1bb5fda8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -22,7 +22,8 @@ namespace RamificationTheory open ValuationTheory -noncomputable section +noncomputable +section universe u v w z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean index 13fff5c8f8..e57b6713c3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteLevelValuationRestriction.lean @@ -60,7 +60,8 @@ This file isolates the valuation-restriction and separable-power lemmas used to pass from absolute Galois questions to finite intermediate fields. -/ -noncomputable section +noncomputable +section universe u v w z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index db7a35d338..32413117de 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -17,7 +17,8 @@ namespace RamificationTheory open ValuationTheory -noncomputable section +noncomputable +section universe u v w z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean index 7a9c495002..767f40fc88 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/ClosedFixingSubgroup.lean @@ -17,7 +17,8 @@ the Krull topology. @[expose] public section -noncomputable section +noncomputable +section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean index 5f2efe693e..2b6fc1fada 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/CompositumRestriction.lean @@ -17,7 +17,8 @@ determined by its restrictions to those fields. @[expose] public section -noncomputable section +noncomputable +section namespace LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean index 59424b14bd..39141a5c9c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/IntermediateFieldRestriction.lean @@ -17,7 +17,8 @@ auxiliary algebra and scalar-tower instances. @[expose] public section -noncomputable section +noncomputable +section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean index 69e3b557e6..4e3d52de78 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/Ramification.lean @@ -26,7 +26,8 @@ Concrete valued extensions supply the action quotient estimates; the subgroup and normality/antitonicity consequences are proved here. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean index abb2278619..cecfbfe568 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/RamificationQuotients.lean @@ -18,7 +18,8 @@ Arithmetic Herbrand functions and valuation-action specializations live in @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean index 4f03a46653..0bfbe5b02f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.Herbrand. /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean index 8182a3ce29..c26e66fb93 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Average.lean @@ -49,7 +49,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt truncatedLowerDepth -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean index f9aea6b7e2..717e6bab41 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/FixedField.lean @@ -60,7 +60,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt subgroupFiltration -noncomputable section +noncomputable +section universe u w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean index e26509e433..34be5e25b6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Function.lean @@ -25,7 +25,8 @@ its restriction to `[-1,∞)` is exactly the normalized function on this range. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean index e52ab5e797..ec6929cc55 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -47,7 +47,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt inverseHerbrandFunction -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean index 14abf674c8..bb26f789a4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Tower.lean @@ -31,7 +31,8 @@ input is deliberately not packaged here as a hypothesis or data field. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean index ff35eff72b..34bf120409 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification.lean @@ -54,4 +54,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRa /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean index 4aa7b45c3b..6324df38d9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AbsoluteValueConjugacy.lean @@ -37,7 +37,8 @@ transitively on the extensions to `L` of a nontrivial absolute value of `K`. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean index 6b59670770..ac2c82ed2b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/AlgebraicLocalization.lean @@ -31,7 +31,8 @@ whole metric completion in infinite degree. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean index 8c3eb8fadf..3c3af2399e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -26,7 +26,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming residue_eq_residue_iff_sub_mem_maximalIdeal -noncomputable section +noncomputable +section universe u v u' v' diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean index fd00a8a44d..ddd7face77 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CharacterMap.lean @@ -28,7 +28,8 @@ and we identify the ramification group as the subgroup on which all these classes are trivial. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean index 7426de2d7a..a9f2d91e9a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CompleteDVF.lean @@ -30,7 +30,8 @@ complete-DVF specialization and the finite-Galois surjectivity theorem. @[expose] public section -noncomputable section +noncomputable +section open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean index f6b9389b64..99bc5ad003 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/CyclotomicDegreeBound.lean @@ -19,7 +19,8 @@ by Euler's totient. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean index a46ba34291..3ec5f2ec2e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionField.lean @@ -17,7 +17,8 @@ formulation uses absolute values and therefore includes the archimedean case. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean index e9b3351360..5e7d6ae8df 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldExtension.lean @@ -17,7 +17,8 @@ infinite Galois extensions and for archimedean or nonarchimedean valuations. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean index 225432d2b5..457d7d917b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -28,7 +28,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming residue_eq_residue_iff_sub_mem_maximalIdeal -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean index fa1eb96264..2fd5016bc0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionGroup.lean @@ -20,7 +20,8 @@ in which those groups are defined. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean index 27fc1c8731..ea2c8a3437 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind.lean @@ -20,4 +20,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRa /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean index b87a031e06..149d618d61 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Basic.lean @@ -24,7 +24,8 @@ normality of inertia in the decomposition group, exactness, and quotient form. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean index 4e4b321d76..95e3232f1d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/CompositumUnramified.lean @@ -20,7 +20,8 @@ field compositum is unramified from the inertia groups of its two factors. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean index e0fb442534..4c5acd255f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/Conjugation.lean @@ -16,7 +16,8 @@ the decomposition group of a conjugate prime ideal is the conjugate subgroup. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean index 7931b6cc73..b3aeca55b5 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldTower.lean @@ -16,7 +16,8 @@ This file contains the group-theoretic fixed-field part of the tower @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean index cf2a5316a1..52b45a5d24 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFieldUnramified.lean @@ -20,7 +20,8 @@ unramified at every finite prime. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification.Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean index 63991a9c00..abd28ddddd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/FixedFields.lean @@ -18,7 +18,8 @@ acting on the fraction field and use mathlib's Galois correspondence. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean index b0e04abad7..db8c0811ae 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/NumberFieldPrimes.lean @@ -20,7 +20,8 @@ the decomposition and inertia fixed-field tower. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean index 207b4bc4c8..c6209d56fa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/OrbitCardinality.lean @@ -17,7 +17,8 @@ ramification/inertia API. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean index c8c156dc62..46c8b9d278 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/PrimeContractions.lean @@ -16,7 +16,8 @@ of number fields and defines the contracted primes `p`, `P_Z`, and `P_T`. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean index 814895f595..7b814ed161 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/TowerInvariants.lean @@ -16,7 +16,8 @@ degrees used in the prime-decomposition tower identity. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification namespace Dedekind diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean index 94ae1342de..50d2e01e81 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Dedekind/ValuedGalois.lean @@ -19,7 +19,8 @@ valuation fields. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean index 3666ec3751..1d66c4e7ca 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevel.lean @@ -23,7 +23,8 @@ filtration. Choice independence is proved in the companion module. @[expose] public section -noncomputable section +noncomputable +section universe u v y @@ -55,7 +56,15 @@ noncomputable def chosenIntegralClosureTarget (base : CompleteDVF.{u, v} K) (E : FiniteGaloisIntermediateField K (AlgebraicClosure K)) : CompleteDVF.{u, 0} E := - Classical.choose (chosenIntegralClosureData_exists base 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean index 09672e2902..a9d82f8085 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteGaloisLevelIndependence.lean @@ -24,7 +24,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt inverseHerbrandFunction -noncomputable section +noncomputable +section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean index b080cf3155..d26d1d37c3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FiniteOrderValuation.lean @@ -15,7 +15,8 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.HilbertRa @[expose] public section namespace RamificationTheory.HilbertRamification.ValuationSubring -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean index 2b70e0ad09..68096fa568 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FirstRamificationComparison.lean @@ -20,7 +20,8 @@ This file identifies their first levels before comparing group actions. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean index 3ad3fa2258..6fd297c233 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamification.lean @@ -22,7 +22,8 @@ monogenic generator. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean index 2f7b9eb2f7..39dcdbbc16 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldRamificationIndex.lean @@ -31,7 +31,8 @@ open _root_.RamificationTheory.DiscreteValuationField.HerbrandGroupTheory.Nonarc mem_depthLowerSubgroup_iff -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean index 94daf249bd..6ea0618276 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/FixedFieldValuationRing.lean @@ -20,7 +20,8 @@ Henselian assumption. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean index ff556f18dd..3027d0c617 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/GaloisStabilizer.lean @@ -18,7 +18,8 @@ generated by `b`. @[expose] public section -noncomputable section +noncomputable +section open scoped IntermediateField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean index ac0080d2eb..954ee34219 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandFunction.lean @@ -46,7 +46,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt inverseHerbrandFunction_strictMono -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean index 34fb2f9581..5615f60f56 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/HerbrandTheorem.lean @@ -45,7 +45,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt inverseHerbrandFunction -noncomputable section +noncomputable +section namespace RamificationTheory.HilbertRamification namespace Higher diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean index ae7c62ccd8..8d59e658f6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRamificationCard.lean @@ -18,7 +18,8 @@ ramification index. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean index 5fd93170ff..19efe2de04 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/InertiaRestrictionCard.lean @@ -17,7 +17,8 @@ the base completion is identified with a concrete local field. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean index e686977d80..fa14ce0556 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -36,7 +36,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming residue_eq_residue_iff_sub_mem_maximalIdeal -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index a7f51482fa..6fb969cb6b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -22,7 +22,8 @@ of `L` in the algebraic localization, proved in @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean index 76a64a2790..40b3c2d8ff 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/Monogeneity.lean @@ -22,7 +22,8 @@ representative adjustment , and Nakayama's lemma. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean index 680c20cee4..6fd877574d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/OrbitPolynomialIdeal.lean @@ -19,7 +19,8 @@ restricted valuation ring; no completeness or Henselian hypothesis occurs. @[expose] public section -noncomputable section +noncomputable +section universe u v w x @@ -196,7 +197,9 @@ def subgroupOrbitPolynomialCoeffFixedFieldDVF (fun p : Polynomial target.valuationSubring => p.coeff n) (subgroupOrbitPolynomialDVF_map_aut (base := base) (target := target) huniq H z rho) - exact congrArg Subtype.val (by simpa [c] using hmap) + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean index 1dda69cc38..a8df81fed8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/PadicLocalization.lean @@ -23,7 +23,8 @@ an extension of `ℚ_[p]`. @[expose] public section -noncomputable section +noncomputable +section namespace HilbertRamification diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean index f3a16aa05c..6833e79798 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationCharacterization.lean @@ -18,7 +18,8 @@ decomposition group. @[expose] public section -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean index 5eceb56301..34705cbace 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationDepth.lean @@ -16,7 +16,8 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValu @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean index 292035377d..5d54d19d75 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationGroup.lean @@ -22,7 +22,8 @@ subgroup `R_w`. The key point for the later character map `I_w`, not merely a subgroup. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean index d30a496c15..864b647f50 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumber.lean @@ -21,7 +21,8 @@ statements do not carry a generator hypothesis. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean index 26855a0ad9..ef8772dc35 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberFormula.lean @@ -38,7 +38,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt truncatedLowerDepth -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean index 19614966c7..a63c9af4be 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RamificationNumberRestriction.lean @@ -19,7 +19,8 @@ the intrinsic value of its displacement ideal. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean index d1a7a2ca65..242b1ca3dc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/RealLowerGroups.lean @@ -27,7 +27,8 @@ and is the full Galois group for `s <= -1`. @[expose] public section -noncomputable section +noncomputable +section open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean index dc82abcb39..53f03dc90a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ResidueExactSequence.lean @@ -30,7 +30,8 @@ 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 +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean index 5608213578..aa7f28a764 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniformizerGradedHom.lean @@ -19,7 +19,8 @@ ramified extensions. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean index bdf07a9eed..83cc259e37 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/UniqueExtensionIntegralClosure.lean @@ -23,7 +23,8 @@ No completeness or Henselian hypothesis is used. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean index 9df6d99ccb..d6440519e1 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationKrasner.lean @@ -23,7 +23,8 @@ inequality are sufficient. @[expose] public section -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean index f4756fcd7e..796dad3aeb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationRestriction.lean @@ -19,7 +19,8 @@ restriction to `L / K`. @[expose] public section -noncomputable section +noncomputable +section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean index 7400486da2..a3506b5cf3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/ValuationSubring.lean @@ -27,7 +27,8 @@ 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 +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean index d330093e67..b8121c0f6f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/InertiaCardinality.lean @@ -21,7 +21,8 @@ from the arithmetic part of the proof. @[expose] public section -noncomputable section +noncomputable +section namespace RamificationTheory diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean index 70a8977139..4b55b3b380 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Ramification.LocalFiel /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean index bf1c120eb0..0c3b23eed8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/BaseChange.lean @@ -23,7 +23,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt herbrandFunction_eq_of_card_lower_eq -noncomputable section +noncomputable +section namespace RamificationTheory.LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean index 5b230af3d8..aff75df2ce 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Core.lean @@ -32,7 +32,8 @@ open _root_.RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFilt herbrandFunction_of_nonpos -noncomputable section +noncomputable +section open ValuationTheory.DiscreteValuationField open ValuationTheory.DiscreteValuationField.ValuedExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean index 773dc6eb5f..7184503b37 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/FirstRamificationComparison.lean @@ -19,7 +19,8 @@ back to the full Galois group. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel open ValuationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean index 533d8fcc08..c122d1c403 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/InertiaCard.lean @@ -19,7 +19,8 @@ residue-separability hypothesis of the general inertia-cardinality theorem. @[expose] public section -noncomputable section +noncomputable +section open scoped ValuativeRel open ValuationTheory.DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean index 46a8345d99..38caa18eb0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/LocalField/Unramified.lean @@ -18,7 +18,8 @@ the actual upper ramification groups of a finite local extension. @[expose] public section -noncomputable section +noncomputable +section namespace RamificationTheory.LocalField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean index 7d8558963f..48bcdf7d6c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/ProfiniteInvariant.lean @@ -24,7 +24,8 @@ element of the discrete ring is fixed by an open normal subgroup, so its orbit polynomial is computed in a finite quotient. -/ -noncomputable section +noncomputable +section open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean index cef727393c..cc4fb6ae71 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation.lean @@ -18,4 +18,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.ValuedAdicCo /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean index 427a7f4178..34b6bd35ba 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue.lean @@ -21,4 +21,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValu /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean index 5e5d238a8e..b160c93463 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension.lean @@ -19,4 +19,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValu /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean index 3f1e48d458..e170623cda 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/Core.lean @@ -21,7 +21,8 @@ branches are included. @[expose] public section -noncomputable section +noncomputable +section namespace AbsoluteValue @@ -411,7 +412,7 @@ private noncomputable def algebraicExtension_baseRingEquiv simpa using (hvσ (σ.symm z)).symm } /-- The archimedean branch of the unique algebraic-extension construction. -/ -private noncomputable def algebraicExtension_archimedean +noncomputable def algebraicExtensionArchimedean {K L : Type*} [Field K] [Field L] [Algebra K L] [Algebra.IsAlgebraic K L] (v : AbsoluteValue K ℝ) @@ -459,7 +460,7 @@ private noncomputable def algebraicExtension_archimedean /-- nonarchimedean algebraic-extension theorem: existence and uniqueness of the extension over any algebraic extension. -/ -private noncomputable def algebraicExtension_nonarchimedean +noncomputable def algebraicExtensionNonarchimedean {K L : Type*} [Field K] [Field L] [Algebra K L] [Algebra.IsAlgebraic K L] (v : AbsoluteValue K ℝ) @@ -489,9 +490,9 @@ noncomputable def uniqueAlgebraicExtension (hv : v.IsNontrivial) : UniqueExtension (K := K) (L := L) v := by by_cases hnonarch : IsNonarchimedean (v : K → ℝ) - · exact algebraicExtension_nonarchimedean + · exact algebraicExtensionNonarchimedean v hcomplete hnonarch hv - · exact algebraicExtension_archimedean + · exact algebraicExtensionArchimedean v hcomplete hnonarch diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean index 1c3362747c..8aab75f94e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/FiniteNormExtension.lean @@ -22,7 +22,8 @@ standard `ℝ` and `ℂ` absolute values. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean index 5b19bc3db3..e1fb930b56 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormula.lean @@ -20,7 +20,8 @@ intermediate field. @[expose] public section -noncomputable section +noncomputable +section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean index ce47479eab..8fa7e0d96d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaAbsoluteValue.lean @@ -18,7 +18,8 @@ absolute value without completeness or separatedness assumptions. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean index 6993e06d5e..90e4b8249f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaCoefficients.lean @@ -20,7 +20,8 @@ separatedness hypothesis is needed. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean index 584f18eee6..06f79e681e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaExtension.lean @@ -23,7 +23,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming integralClosureValuationSubringOfMemOrInv_hasExtension -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean index 9cf3f31720..d84187f721 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/NormFormulaIntegralClosure.lean @@ -20,7 +20,8 @@ assumed target ring, satisfies the valuation-ring dichotomy. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean index 6e513a0ed2..e51ccfa94b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/RamificationInvariants.lean @@ -28,7 +28,8 @@ without completeness. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean index 6ee1b9edff..1b3fe82673 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueExtensionCoefficients.lean @@ -21,7 +21,8 @@ then bound every coefficient by the larger endpoint coefficient. @[expose] public section -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean index 32df07bade..df131b6e25 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicExtension/UniqueValuationSubring.lean @@ -18,7 +18,8 @@ the unique maximal ideal, so the overring is the integral closure itself. @[expose] public section -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean index 9e0f8496b9..3f60f66b85 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/AlgebraicLocalization.lean @@ -19,7 +19,8 @@ extra container for the chosen extension. @[expose] public section -noncomputable section +noncomputable +section namespace AbsoluteValue @@ -57,7 +58,7 @@ noncomputable def toAlgebraicLocalization letI := completionAlgebra vK wL hw exact RingHom.codRestrict (toCompletion wL) (algebraicLocalization vK wL hw) - (toCompletion_mem_algebraicLocalization vK wL hw) + (by exact toCompletion_mem_algebraicLocalization vK wL hw) /-- The absolute value on an algebraic localization evaluates through its fraction representation. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean index 2ca582e88c..0892e47f18 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completeness.lean @@ -21,7 +21,8 @@ longer compiled. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean index 585474abc4..84271e485e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Completion.lean @@ -24,7 +24,8 @@ remain explicit. @[expose] public section -noncomputable section +noncomputable +section open scoped Topology @@ -118,7 +119,8 @@ theorem denseRange_toCompletion (WithAbs.toAbs_surjective vK).denseRange (@UniformSpace.Completion.continuous_coe (WithAbs vK) inferInstance) -private noncomputable def baseToExtensionCompletion +/-- 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 := @@ -153,7 +155,7 @@ noncomputable def completionMap vK.Completion →+* wL.Completion := UniformSpace.Completion.extensionHom (baseToExtensionCompletion vK wL) - (baseToExtensionCompletion_isometry vK wL hw).continuous + (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] @@ -163,7 +165,7 @@ private theorem completionMap_withAbs_coe baseToExtensionCompletion vK wL x := UniformSpace.Completion.extensionHom_coe (baseToExtensionCompletion vK wL) - (baseToExtensionCompletion_isometry vK wL hw).continuous x + (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. -/ @@ -318,7 +320,8 @@ section CompleteTarget variable {K : Type u} {D : Type w} [Field K] [Field D] -private noncomputable def toCompleteTargetRingHom +/-- 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 := @@ -349,7 +352,7 @@ noncomputable def completionMapToCompleteTarget vK.Completion →+* WithAbs vD := UniformSpace.Completion.extensionHom (toCompleteTargetRingHom vK vD i) - (toCompleteTargetRingHom_isometry vK vD i hi).continuous + (by exact (toCompleteTargetRingHom_isometry vK vD i hi).continuous) private theorem completionMapToCompleteTarget_withAbs_coe (vK : AbsoluteValue K ℝ) (vD : AbsoluteValue D ℝ) @@ -361,7 +364,7 @@ private theorem completionMapToCompleteTarget_withAbs_coe toCompleteTargetRingHom vK vD i x := UniformSpace.Completion.extensionHom_coe (toCompleteTargetRingHom vK vD i) - (toCompleteTargetRingHom_isometry vK vD i hi).continuous x + (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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean index fcee1be82f..8a4e736c89 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ExponentialValuation.lean @@ -19,7 +19,8 @@ supplies the canonical conversion `v(x) = -log |x|`. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean index f44817ed7f..e2f7066f10 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Nonarchimedean.lean @@ -18,7 +18,8 @@ for real-valued absolute values. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean index b1a44c40ac..b7293ec729 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Ostrowski.lean @@ -19,7 +19,8 @@ positive exponent at most one. @[expose] public section -noncomputable section +noncomputable +section open Filter diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean index 97885ab46c..f3c401915c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/PrincipalAdicCompleteness.lean @@ -20,7 +20,8 @@ construction and the irreducible-polynomial coefficient estimate. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean index 38a979e8cd..271ea6435e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/SpectralExtension.lean @@ -18,7 +18,8 @@ absolute value to an algebraic field extension. @[expose] public section -noncomputable section +noncomputable +section namespace AbsoluteValue @@ -136,11 +137,12 @@ noncomputable def spectralExtension (hnonarch : IsNonarchimedean (v : K → ℝ)) (hv : v.IsNontrivial) : AbsoluteValue L ℝ where toFun := _root_.spectralNorm (WithAbs v) L - map_mul' x y := - spectral_spectralNorm_mul (K := K) (L := 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 := spectral_spectralNorm_eq_zero_iff (K := K) (L := L) v 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean index 72a85abf67..3cdc5f6f4f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory.lean @@ -12,4 +12,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValu /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean index 122b63372a..c6cc9dcbbf 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/AbsoluteValues.lean @@ -21,7 +21,8 @@ needed. @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped BigOperators Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean index bca23aa238..5637f4b290 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/Core.lean @@ -12,7 +12,8 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.AbsoluteValu @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped BigOperators Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean index bc3c725fd7..825f40ea53 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/Theory/ExponentialValuations.lean @@ -17,7 +17,8 @@ public import Mathlib.RingTheory.Valuation.ValuationSubring @[expose] public section -noncomputable section +noncomputable +section open Filter open scoped BigOperators Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean index 8934630e48..8ceedb07a3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/AbsoluteValue/ValuationSubring.lean @@ -20,7 +20,8 @@ the finite-degree norm construction before any discrete-valuation-field packagin @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean index 275781b198..aef2ebf94c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Completion.T /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean index 55470e9087..7c38852073 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/AbsoluteValueExtensions.lean @@ -43,7 +43,8 @@ extra hypothesis. @[expose] public section -noncomputable section +noncomputable +section open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean index 1c29b78671..29098b7ed2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeAdjoinRoot.lean @@ -20,7 +20,8 @@ the canonical algebra equivalence used in scalar-extension decompositions. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory namespace Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean index 7e6790d1c9..aa4b06b8be 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/BaseChangeNormTrace.lean @@ -21,7 +21,8 @@ directly for the canonical element `1 ⊗ₜ x`. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory namespace Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean index bcc3fb5fc7..a8022f3419 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/CanonicalTensorMap.lean @@ -20,7 +20,8 @@ independent of the factorisation argument later used to prove bijectivity. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean index 9cce96c875..5606319c2d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/DegreeNormTrace.lean @@ -20,7 +20,8 @@ norm and trace lie in `K`, their Lean statements are mapped into `K_v`. @[expose] public section -noncomputable section +noncomputable +section open scoped BigOperators TensorProduct open ValuationTheory.Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean index c83894a138..005380ef4a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionFactorClassification.lean @@ -22,7 +22,8 @@ of the chosen embedding to the completed field. @[expose] public section -noncomputable section +noncomputable +section open Polynomial open scoped Topology diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean index 2ad84670af..f7cb403311 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -50,7 +50,8 @@ open _root_.ValuationTheory.DiscreteValuationField.ResidueField renaming residue_eq_residue_iff_sub_mem_maximalIdeal -noncomputable section +noncomputable +section open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean index e2c5afe00b..28a076ff46 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteLocalization.lean @@ -22,7 +22,8 @@ but contains the dense copy of `L`. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean index b944c5cd8e..a48707b353 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/FiniteProductNormTrace.lean @@ -21,7 +21,8 @@ field degrees. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory namespace Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean index 658e8d55b6..95ea5ac60c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/Padic.lean @@ -21,7 +21,8 @@ without adding any hypothesis to the global theorem. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory.Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean index 862fb7899a..5fbc47614a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialCRT.lean @@ -18,7 +18,8 @@ simple factor algebras. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory namespace Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean index 35cfdf31c9..4bac8f4890 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/PolynomialFactors.lean @@ -21,7 +21,8 @@ completion. @[expose] public section -noncomputable section +noncomputable +section open Polynomial open UniqueFactorizationMonoid diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean index 2c6d856694..6432893cf0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/SeparablePolynomialFactors.lean @@ -18,7 +18,8 @@ factorization facts used in the Chinese-remainder proof of tensor-product decomp @[expose] public section -noncomputable section +noncomputable +section open Polynomial UniqueFactorizationMonoid open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean index bbb9eb5122..14ecb92a03 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductDecomposition.lean @@ -25,7 +25,8 @@ the corresponding completion using the extension-factor correspondence. @[expose] public section -noncomputable section +noncomputable +section open Polynomial open scoped BigOperators TensorProduct diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean index d0efd52278..cb1af866d8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/TensorProductProductFormulas.lean @@ -20,7 +20,8 @@ here. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory namespace Completion diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean index e54f6e9903..8ef1774855 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField.lean @@ -27,4 +27,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValu /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean index c500f5aadf..2534b3831e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AddVal.lean @@ -17,7 +17,8 @@ valued-field presentation. @[expose] public section -noncomputable section +noncomputable +section universe u diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean index dbce66a60c..24df41fb82 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AdicPower.lean @@ -20,7 +20,8 @@ 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 +noncomputable +section namespace DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean index 261b17495a..934b57342b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/AmbientUniformizer.lean @@ -19,7 +19,8 @@ valuation transports that recognition back to the chosen valuation. namespace ValuationTheory -noncomputable section +noncomputable +section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean index 5613721123..b1cd13963c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Basic.lean @@ -23,7 +23,8 @@ This is the basic one-dimensional API for fields equipped with a chosen rank-one discrete valuation. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean index b5ab306fae..3762ef4b89 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ChevalleyExtension.lean @@ -25,7 +25,8 @@ 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 +noncomputable +section universe u v w x y z diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean index 8ddbfd4a14..374ad0f410 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Complete.lean @@ -19,7 +19,8 @@ namespace ValuationTheory # Complete discretely valued fields -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean index 64390e4646..ae49656b34 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/CompleteDVRExpansion.lean @@ -22,7 +22,8 @@ coefficients and remainders satisfying @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean index 9b9035191f..12d1bb34fc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean @@ -26,7 +26,8 @@ intersection degree square, and separability of the common top. @[expose] public section -noncomputable section +noncomputable +section universe u v @@ -385,7 +386,7 @@ local instance tensorProductIdealHasQuotient @Ideal.instHasQuotient (K' ⊗[K] L) (inferInstance : CommRing (K' ⊗[K] L)).toRing -private noncomputable def quotientKerAlgEquivOfSurjectiveCommRing +noncomputable def quotientKerAlgEquivOfSurjectiveCommRing {R A B : Type*} [ringR : CommSemiring R] [ringA : CommRing A] [algebraRA : Algebra R A] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean index 2fb5757597..1f307c849c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Extensions.lean @@ -30,7 +30,8 @@ proof-irrelevant marker object. All invariants and maps are defined once for discretely valued fields through their canonical `toDVF` projections. -/ -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean index 2456a5c630..705ac5b51f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension.lean @@ -13,4 +13,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.DiscreteValu /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index d74411881b..336ee9f02f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -48,7 +48,8 @@ open _root_.ValuationTheory.DiscreteValuationField renaming namespace ValuationTheory -noncomputable section +noncomputable +section universe u v w x y diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean index f8ce4fe7b9..4454f2d358 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Defectless.lean @@ -19,7 +19,8 @@ finite module over the base valuation ring. @[expose] public section -noncomputable section +noncomputable +section namespace ValuationTheory.DiscreteValuationField.ValuedExtension diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean index 254e9790e3..a703f8f105 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Degree.lean @@ -26,7 +26,8 @@ valuations, and the algebra equivalence identifying an actual integral-closure valuation ring with mathlib's `integralClosure`. -/ -noncomputable section +noncomputable +section universe u v w x y diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index fed1921f54..eb6332d70e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -55,7 +55,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming namespace ValuationTheory -noncomputable section +noncomputable +section universe u v w x y diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean index 57313a91fa..2a4bf4c9e8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteIntegralClosure.lean @@ -21,7 +21,8 @@ This file provides record-free theorems for the integral closure of a complete-DVF valuation ring in a finite separable field extension. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean index b600bc447a..7678c85db6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Henselian.lean @@ -22,7 +22,8 @@ This file contains the lightweight package for a discretely valued field whose valuation ring is Henselian at its maximal ideal. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean index 7c84b42eef..42dd52f3d8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianFinite.lean @@ -25,7 +25,8 @@ This file keeps the Nakayama and finite-module completion consequences away from the lightweight `HenselianDVF` core. -/ -noncomputable section +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean index 565c3b1abf..9c11ea8e8d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/HenselianValuationExtension.lean @@ -22,7 +22,8 @@ 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 +noncomputable +section universe u v w x y diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean index b6bb4d48b8..aa1ee63f8a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -30,7 +30,8 @@ This module uses the actual mathlib integral closure structure. -/ -noncomputable section +noncomputable +section universe u v w x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean index 38d5b40bae..d73c5cd09e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ResidueField.lean @@ -22,7 +22,8 @@ Henselian and unramified parts of the DVF library. It keeps mathlib's objects. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean index a1eaf11e32..714c2a107b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationExtension.lean @@ -22,7 +22,8 @@ when they have the same valuation subring. The results here use the ambient valued-extension property directly; no marker object is introduced. -/ -noncomputable section +noncomputable +section universe u v w x y diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean index 8c0bbb7776..af0ce88d52 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/ValuationTransport.lean @@ -22,7 +22,8 @@ transport is by comapping the valuation along a field equivalence; no valuation-comparison hypothesis is added. -/ -noncomputable section +noncomputable +section universe u v w diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean index 2d23654eb2..30a3e12f9b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/HenselLemma.lean @@ -22,7 +22,8 @@ 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 +noncomputable +section universe u v diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean index 28c376fe97..fc946d71f7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian.lean @@ -28,4 +28,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Va /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean index 83a0092ff2..6bbc9934bd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Complete.lean @@ -21,7 +21,8 @@ consequence used in the henselianity criterion. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean index 494f6f8458..51799c884e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Core.lean @@ -39,7 +39,8 @@ The Henselian factorization condition and the residual linear-factor lemmas used residual linear-factor criterion. -/ -noncomputable section +noncomputable +section namespace DiscreteValuationField diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean index f263006325..2352c59087 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization.lean @@ -24,4 +24,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Henselian.Fa /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean index 2fada2257e..a5a006da84 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/AdicLimits.lean @@ -18,7 +18,8 @@ the coefficientwise proof of Hensel's lemma. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean index 5f9593ef3e..f8037e7711 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Assembly.lean @@ -18,7 +18,8 @@ the displayed-factor complete-limit theorem. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean index 66abeca77b..a630b0d673 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Basic.lean @@ -19,7 +19,8 @@ lemmas here are the initial lifts and congruences. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean index 2dad384bb2..0f02382b31 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/CoefficientMinimum.lean @@ -20,7 +20,8 @@ set. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean index d3d894b071..afb28a3fe0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Complete.lean @@ -18,7 +18,8 @@ initial error coefficients in the proof core. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean index fe07a22cc3..aca7cf7b82 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DegreeBounds.lean @@ -16,7 +16,8 @@ the coefficientwise Hensel iteration. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean index 2051e6e61e..9acb7394fb 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/DivisionBounds.lean @@ -17,7 +17,8 @@ residue of the remainder has small degree. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean index eb7f287d7e..e463e9bf84 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/ErrorPowers.lean @@ -19,7 +19,8 @@ factorization error after the update @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean index c896e21edc..0d9d388a74 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/FiniteApproximation.lean @@ -17,7 +17,8 @@ HenselFactorizationFinitePrefixState, in the next layer. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean index 7a3d51987c..fda6d73a62 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/InfiniteApproximation.lean @@ -17,7 +17,8 @@ layer. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean index 0bd6f418eb..77f4ba06f0 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Iteration.lean @@ -17,7 +17,8 @@ completion argument. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean index 1378849612..a11922207f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/PrincipalLimits.lean @@ -18,7 +18,8 @@ whose maximal ideal is not assumed principal or adically separated. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean index 5eeb930a26..92dc0a73c8 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Step.lean @@ -18,7 +18,8 @@ lemma. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean index 0759fd1a79..1c94963334 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/Truncation.lean @@ -17,7 +17,8 @@ the residue field may be omitted to impose the required degree bound. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial open scoped BigOperators diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean index 2e3fa5d227..53c746264f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/Factorization/WeakLimits.lean @@ -17,7 +17,8 @@ prefixes through the maximal-ideal complete-limit argument. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean index b3d7f4c3ad..5458704bce 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialBounds.lean @@ -21,7 +21,8 @@ value `1` reduce to nonzero elements. Hence the first coefficient of value @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean index 0f9ae2635a..8adaaedd8d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/IrreduciblePolynomialLifting.lean @@ -20,7 +20,8 @@ ring, hence the mapped field polynomial is not irreducible. @[expose] public section -noncomputable section +noncomputable +section open scoped Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean index 3af69bf16d..a85f824914 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/MonicFactorization.lean @@ -23,7 +23,8 @@ with exactly those reductions. @[expose] public section -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean index 0b7ad221d7..a9f9aff3c6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/NonmonicReduction.lean @@ -18,7 +18,8 @@ with nonunit leading coefficient has constant reduction. @[expose] public section -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean index e179490dde..74c8124c2d 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveFactorization.lean @@ -20,7 +20,8 @@ factorization. @[expose] public section -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean index d9622087c7..2e5a50e77e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/PrimitiveReduction.lean @@ -19,7 +19,8 @@ that condition with the divisibility notion used by mathlib's Gauss lemma. @[expose] public section -noncomputable section +noncomputable +section open Polynomial open UniqueFactorizationMonoid diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean index 359d38c526..fa51680479 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueAlgebraicExtensions.lean @@ -19,7 +19,8 @@ subring. This is the same endpoint used in the finite norm-formula theorem. @[expose] public section -noncomputable section +noncomputable +section namespace AlgebraicNumberTheory namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean index 77012cafc6..b8347c68e9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionPrimitive.lean @@ -23,7 +23,8 @@ nonconstant residual factorization. @[expose] public section -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean index c0ed9efe8f..8b65d1edf6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/UniqueExtensionReduction.lean @@ -24,7 +24,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming integralClosure_mem_valuationSubring_of_hasExtension -noncomputable section +noncomputable +section open Polynomial open UniqueFactorizationMonoid diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean index 50cf652c91..a4ad5e68d2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Henselian/ValuationExtensionCriterion.lean @@ -21,7 +21,8 @@ open _root_.ValuationTheory.DiscreteValuationField.Valuation renaming exists_extension_valuationSubring_with_hasExtension -noncomputable section +noncomputable +section open Polynomial diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean index 929680fdda..c108ca5a5a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology.lean @@ -14,4 +14,3 @@ public import LeanPool.ClassFieldTheory.ValuedFieldTheory.Valuation.Topology.Mod /-! Supporting modules for Local and global class field theory. -/ -@[expose] public section diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index 7a1029a947..fee905a737 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -18,7 +18,8 @@ rings. The underlying adic ring inverse-limit theory lives in @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate namespace Valuations diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean index 0440a9fa42..9566eae8f4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -22,7 +22,8 @@ groups. @[expose] public section -noncomputable section +noncomputable +section namespace LubinTate namespace Valuations @@ -260,7 +261,7 @@ noncomputable instance adicQuotientInverseLimit.instTopologicalSpace letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ exact (adicQuotientInverseLimitCompatibleFamiliesEquiv I).topologicalSpace -private noncomputable def adicQuotientInverseLimitRepresentationHomeomorph +noncomputable def adicQuotientInverseLimitRepresentationHomeomorph {R : Type*} [CommRing R] (I : Ideal R) : letI : (n : ℕ) → TopologicalSpace (R ⧸ I ^ n) := fun _ => ⊥ adicQuotientInverseLimit I ≃ₜ @@ -513,7 +514,7 @@ theorem quotient_mk_continuous_adic convert hmodel using 1 rfl -private noncomputable def adicQuotientCompatibleFamiliesHomeomorph +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 _ => ⊥ @@ -841,7 +842,7 @@ theorem adicPositiveQuotientInverseLimitEquiv_apply Ideal.Quotient.mk (I ^ (n + 1)) x := adicQuotientInverseLimitEquiv_apply I x (n + 1) -private noncomputable def adicPositiveQuotientCompatibleFamiliesHomeomorph +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 _ => ⊥ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean index 28cc84f26f..38874fab4c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/UniqueRing.lean @@ -33,7 +33,8 @@ 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 +noncomputable +section open scoped Pointwise diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean index 27c043e6f3..e0f2f626e6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/ValuedAdicComplete.lean @@ -32,7 +32,8 @@ 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 +noncomputable +section namespace Valuations From 523174bde6a8f6bb36cbf1b0c3255eec7abd604e Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 19:32:03 +0000 Subject: [PATCH 20/33] Fix ClassFieldTheory module interfaces and preserve proof boundaries --- .../Degree/FrobeniusFixedField.lean | 8 ++-- .../Degree/FrobeniusLift.lean | 2 +- .../Degree/NormLaws.lean | 3 +- .../Idele/NormOneCompact.lean | 4 +- .../PrimePowerKummerIndex.lean | 10 ++-- .../ResidueAbsoluteDegree.lean | 6 ++- .../ResidueAbsoluteFrobenius.lean | 2 +- .../FiniteLevel/CompletedEvaluation.lean | 12 +++-- .../FiniteLevel/PrimitiveAction.lean | 15 ++++-- .../Padic/ChangedUniformizerCoefficient.lean | 27 +++++++---- .../Padic/CompletedUnramifiedField.lean | 7 ++- .../FinitePlaceRayArtinLocalValue.lean | 6 +-- .../HerbrandLowDegree/BinaryProduct.lean | 6 ++- .../HerbrandLowDegree/TateComparison.lean | 23 +++++----- .../ShrinkTransport.lean | 32 ++++++------- .../UnramifiedFrobenius.lean | 5 +- .../FiniteExtensionCorrespondence.lean | 3 +- .../InfiniteGaloisCorrespondence.lean | 4 +- .../HilbertRamification/BaseChange.lean | 22 +++++---- .../LocalizationDensity.lean | 15 ++++-- .../Completion/ExtensionInvariants.lean | 46 +++++++++++-------- .../Topology/AdicCompletionInverseLimit.lean | 10 ++-- .../AdicCompletionInverseLimitRing.lean | 3 +- 23 files changed, 155 insertions(+), 116 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index 91d6f2be37..c618dedbc4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -54,7 +54,7 @@ private def continuousQuotientLift (QuotientGroup.isQuotientMap_mk (G := A) (N := N)).continuous_iff.2 hcomp } /-- Inclusion of a subgroup with its subtype topology, used locally below. -/ -private def continuousSubgroupSubtype +def continuousSubgroupSubtype {A : Type*} [Group A] [TopologicalSpace A] (H : Subgroup A) : H →ₜ* A where toMonoidHom := H.subtype @@ -62,7 +62,7 @@ private def continuousSubgroupSubtype /-- A bijective continuous homomorphism from a compact group to a Hausdorff group is a continuous multiplicative equivalence. -/ -private noncomputable def continuousMulEquivOfBijectiveCompactToT2 +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 φ) : @@ -351,8 +351,8 @@ def extensionNormalizedDegreeContinuous (D : DegreeData G) [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 := - (continuousQuotientLift (D.extensionInertiaWithin K.field L hLK) + continuous_toFun := by + exact (continuousQuotientLift (D.extensionInertiaWithin K.field L hLK) (D.normalizedDegree K) (by intro x hx diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean index ad232cf303..db0939b56b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusLift.lean @@ -91,7 +91,7 @@ def extensionNormalizedDegree (D : DegreeData G) (K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) →* ZHatMul := QuotientGroup.lift (D.extensionInertiaWithin K.field L hLK) (D.normalizedDegree K).toMonoidHom - (D.extensionInertiaWithin_le_normalizedDegree_ker K L hLK) + (by exact D.extensionInertiaWithin_le_normalizedDegree_ker K L hLK) /-- Establishes the identity `D.extensionNormalizedDegree K L hLK (QuotientGroup.mk k) = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean index 40ee1fbcb5..ba003ae790 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/NormLaws.lean @@ -93,7 +93,8 @@ theorem conjugateFixedElement_coe [ContinuousMul G] A.ρ σ⁻¹ a.1 := rfl -private def absoluteConjugationEquiv {G : Type*} [Group G] [TopologicalSpace G] +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean index 1b92381628..10254ea2e7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormOneCompact.lean @@ -420,7 +420,7 @@ theorem mem_annulus_of_logNorm_le open scoped Classical in /-- A real basis obtained from the full unit lattice. -/ -private def unitLatticeRealBasis : +def unitLatticeRealBasis : Module.Basis (Module.Free.ChooseBasisIndex ℤ (NumberField.Units.unitLattice K)) @@ -639,7 +639,7 @@ theorem exists_compactIntegralNormOneSet_representative 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. -/ -private def normOneIdealClassRepresentative +def normOneIdealClassRepresentative (c : ClassGroup (𝓞 K)) : IdeleGroup K := if h : ∃ a : IdeleGroup K, a ∈ normOneSubgroup (K := K) ∧ idealClass a = c then diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean index 2f637e5819..f828d785cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdeleClassPowerLocalUnitQuotient/PrimePowerKummerIndex.lean @@ -125,8 +125,7 @@ theorem dsimp only let hnK : ((n : ℕ) : K) ≠ 0 := by exact_mod_cast n.ne_zero - let nUnit : Kˣ := - Units.mk0 ((n : ℕ) : K) hnK + let nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK let S₀ := (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ chosenUnitFiniteSupport (K := K) nUnit @@ -232,9 +231,7 @@ theorem Set (HeightOneSpectrum (𝓞 K))) ⊆ (S₀ : Set (HeightOneSpectrum (𝓞 K))) := by intro w hw - exact - Finset.mem_union_left _ - (Finset.mem_union_right _ hw) + exact Finset.mem_union_left _ (Finset.mem_union_right _ hw) have hS₀ : IdeleGroup.supportedAt (K := K) (S₀ : Set (HeightOneSpectrum (𝓞 K))) ⊔ @@ -342,8 +339,7 @@ theorem (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 nUnit : Kˣ := Units.mk0 ((n : ℕ) : K) hnK let S₀ := (S ∪ IdeleGroup.sufficientlyLargeFiniteSet (K := K)) ∪ chosenUnitFiniteSupport (K := K) nUnit diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean index e237f291f0..551bb36f2c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteDegree.lean @@ -45,10 +45,12 @@ open Polynomial variable (k : Type u) [Field k] [Fintype k] omit [Fintype k] in -private instance finiteFieldRingCharPrime [Finite k] : Fact (ringChar k).Prime := +/-- The characteristic of a finite field is prime. -/ +instance finiteFieldRingCharPrime [Finite k] : Fact (ringChar k).Prime := ⟨CharP.char_is_prime k (ringChar k)⟩ -private noncomputable instance absoluteGaloisGroupT2 : +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean index 938e8e47aa..55d1dd4960 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAbsoluteFrobenius.lean @@ -50,7 +50,7 @@ def finiteResidueFrobeniusIntermediate /-- The compatible finite Frobenius coordinates attached to one profinite integer. -/ -private def residueFrobeniusLimitPoint (z : ZHatMul) : +def residueFrobeniusLimitPoint (z : ZHatMul) : limit (InfiniteGalois.asProfiniteGaloisGroupFunctor k Omega) where val := fun E => finiteResidueFrobeniusIntermediate k Omega E.unop z property := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean index 8a09d1d4e2..181de3497d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/CompletedEvaluation.lean @@ -44,13 +44,15 @@ open SameUniformizer variable {K : Type u} [Field K] -private noncomputable local instance (priority := 50) +/-- 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 := ⊥ -private noncomputable local instance +/-- 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 : ℕ) : @@ -58,7 +60,8 @@ private noncomputable local instance (standardLubinTateLevelCompleteDVF hπ n).valuationSubring where i := (standardLubinTateLevelCompleteDVF hπ n).maximalIdeal -private noncomputable local instance +/-- 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 : ℕ) : @@ -68,7 +71,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 -private noncomputable local instance +/-- 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 : ℕ) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean index 284cf003b2..352fd54d56 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveAction.lean @@ -102,19 +102,22 @@ section AnalyticAction variable {F : LocalField.{u, v} K} {π : F.valuationSubring} -private noncomputable local instance +/-- The coefficient ring carries the discrete uniformity for formal evaluation. -/ +noncomputable local instance standardLubinTatePrimitiveActionCoefficientUniformSpace : UniformSpace F.valuationSubring := ⊥ -private noncomputable local instance +/-- 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 -private noncomputable local instance +/-- The finite-level valuation ring is complete for the maximal-ideal topology. -/ +noncomputable local instance standardLubinTatePrimitiveActionTargetCompleteSpace (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : CompleteSpace @@ -123,7 +126,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 -private noncomputable local instance +/-- The finite-level valuation ring has a Hausdorff maximal-ideal topology. -/ +noncomputable local instance standardLubinTatePrimitiveActionTargetT2Space (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : T2Space @@ -132,7 +136,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 -private noncomputable local instance +/-- The coefficient homomorphism supplies the finite-level valuation-ring algebra. -/ +noncomputable local instance standardLubinTatePrimitiveActionAlgebra (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : Algebra F.valuationSubring diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean index d5f71f2d1c..df0af80700 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerCoefficient.lean @@ -132,6 +132,8 @@ 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) @@ -155,12 +157,15 @@ noncomputable def padicChangedUniformizerLinearCoefficient 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) - (completedUnramifiedWittUnit_coeff_zero_ne_zero p - (padicValuationUnitToCompletedUnramifiedWittUnit p u))) - (padicChangedUniformizerRotation_coeff_zero_ne_zero p u)) + (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 @@ -169,20 +174,26 @@ private theorem padicChangedUniformizerLinearCoefficient_coe (padicChangedUniformizerLinearCoefficient p u : padicCompletedUnramifiedWittRing p) = 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)) := + (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) - (completedUnramifiedWittUnit_coeff_zero_ne_zero p - (padicValuationUnitToCompletedUnramifiedWittUnit p u))) - (padicChangedUniformizerRotation_coeff_zero_ne_zero p u)) + (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`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean index 670271018b..ca3491abf2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedUnramifiedField.lean @@ -230,12 +230,11 @@ noncomputable instance padicCompletedUnramifiedFieldAlgebra (algebraMap (padicCompletedUnramifiedWittRing p) (padicCompletedUnramifiedField p)).comp (padicIntToCompletedUnramifiedWittRing p) - have hg : Function.Injective g := - (IsFractionRing.injective + exact (IsFractionRing.lift (g := g) (by + exact (IsFractionRing.injective (padicCompletedUnramifiedWittRing p) (padicCompletedUnramifiedField p)).comp - (padicIntToCompletedUnramifiedWittRing_injective p) - exact (IsFractionRing.lift hg).toAlgebra + (padicIntToCompletedUnramifiedWittRing_injective p))).toAlgebra /-- The canonical field embedding agrees with the original Witt-ring map on p-adic integers. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean index 54d461aa90..4b2da78442 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/GlobalClassFieldTheory/FinitePlaceRayArtinLocalValue.lean @@ -130,8 +130,7 @@ theorem exists_finitePlaceRayArtin_localValueDiagram 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 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 := @@ -248,8 +247,7 @@ theorem exists_finitePlaceRayArtin_localValueDiagram exact (hemb _).symm _ = eC (eD δ (j y)) := congrArg eC hloc.symm _ = σ (eC (j y)) := by - have hδ : eD δ = eAut.symm σ := - eD.apply_symm_apply _ + have hδ : eD δ = eAut.symm σ := eD.apply_symm_apply _ rw [hδ] change eC (eC.symm (σ (eC (j y)))) = _ exact eC.apply_symm_apply _ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index d15569d60f..6ef6140e89 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -38,7 +38,8 @@ abbrev BinaryCoefficientFamily : Bool → Type uA | false => A | true => B -private instance binaryCoefficientFamilyCommGroup : +/-- Each member of the binary coefficient family inherits its commutative group structure. -/ +instance binaryCoefficientFamilyCommGroup : ∀ i, CommGroup (BinaryCoefficientFamily A B i) | false => inferInstance | true => inferInstance @@ -51,7 +52,8 @@ noncomputable def binaryCoefficientFamilyAction : | false => inferInstance | true => inferInstance -private noncomputable instance +/-- The binary coefficient family carries the given action on each component. -/ +noncomputable instance binaryCoefficientFamilyMulDistribMulAction (i : Bool) : MulDistribMulAction G (BinaryCoefficientFamily A B i) := diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean index 8cf6eebaf1..85b61a4bad 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/TateComparison.lean @@ -219,7 +219,7 @@ noncomputable def tateH0IsoHerbrandH0 : apply (HerbrandH0.mk_eq_one_iff _).2 refine ⟨a.toMul, ?_⟩ dsimp [eK, fixedCyclesAddEquiv, S, M] - exact (repNorm_toMul (G := G) (A := A) a).symm + 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 @@ -265,9 +265,10 @@ def normKernelCyclesAddEquiv : change tateNorm G A a.toMul = 1 have hx := x.2 change (Rep.ofMulDistribMulAction G A).ρ.norm a = 0 at hx - exact (repNorm_toMul (G := G) (A := A) a).symm.trans <| by - rw [hx] - rfl⟩ + 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 @@ -299,7 +300,8 @@ 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. -/ +/-- 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] @@ -335,8 +337,7 @@ noncomputable def tateHMinusOneIsoHerbrandHMinusOneOfCommGroup apply (HerbrandHMinusOne.mk_eq_one_iff σ _).2 refine ⟨a.toMul, ?_⟩ dsimp [eK, normKernelCyclesAddEquiv, S, M] - exact (repSigmaMinusOne_toMul - (G := G) (A := A) σ a).symm + 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 @@ -350,10 +351,10 @@ noncomputable def tateHMinusOneIsoHerbrandHMinusOneOfCommGroup apply Additive.toMul.injective apply Subtype.ext dsimp [eK, normKernelCyclesAddEquiv, S, M] - 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 + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean index 8211dfe1cc..554491aab4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ShrinkTransport.lean @@ -36,32 +36,32 @@ private theorem smallLocalField : Small.{0} K := /-- The canonical valuation pulled back to the small carrier. -/ noncomputable def shrinkLocalFieldValuation : - letI : Small.{0} K := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K Valuation (Shrink.{0} K) (ValueGroupWithZero K) := by - letI : Small.{0} K := smallLocalField K + 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 := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K ValuativeRel (Shrink.{0} K) := by - letI : Small.{0} K := smallLocalField K + 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 := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K LocallyCompactSpace (Shrink.{0} K) := by - let : Small.{0} K := smallLocalField K + 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 := smallLocalField K + 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 := smallLocalField K + 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 @@ -77,13 +77,13 @@ theorem shrinkLocalField_isNontrivial : /-- Strict valuation comparisons are preserved by the small-carrier ring equivalence. -/ theorem shrinkLocalField_valuation_lt_iff : - letI : Small.{0} K := smallLocalField K + 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 := smallLocalField K + let : Small.{0} K := by exact smallLocalField K let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K intro x y let v := shrinkLocalFieldValuation K @@ -99,9 +99,9 @@ theorem shrinkLocalField_valuation_lt_iff : /-- The transported topology is compatible with the transported additive group structure. -/ theorem shrinkLocalField_isTopologicalAddGroup : - letI : Small.{0} K := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K IsTopologicalAddGroup (Shrink.{0} K) := by - let : Small.{0} K := smallLocalField K + 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 @@ -109,10 +109,10 @@ theorem shrinkLocalField_isTopologicalAddGroup : /-- The transported topology is the valuative topology of the pulled-back valuation. -/ theorem shrinkLocalField_isValuativeTopology : - letI : Small.{0} K := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K IsValuativeTopology (Shrink.{0} K) := by - let : Small.{0} K := smallLocalField K + let : Small.{0} K := by exact smallLocalField K let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K let : IsTopologicalAddGroup (Shrink.{0} K) := shrinkLocalField_isTopologicalAddGroup K @@ -194,10 +194,10 @@ theorem shrinkLocalField_isValuativeTopology : /-- 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 := smallLocalField K + letI : Small.{0} K := by exact smallLocalField K letI : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K IsNonarchimedeanLocalField (Shrink.{0} K) := by - let : Small.{0} K := smallLocalField K + let : Small.{0} K := by exact smallLocalField K let : ValuativeRel (Shrink.{0} K) := shrinkLocalFieldValuativeRel K exact { toIsValuativeTopology := shrinkLocalField_isValuativeTopology K diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean index e93146f36d..6704268f6a 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/UnramifiedFrobenius.lean @@ -450,7 +450,6 @@ noncomputable def galoisGroupEquivZModOfUnramifiedValuation /-- 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. -/ -/-- Identify an additive group generated by an element of order `n` with `ZMod n`. -/ noncomputable def zmodAddEquivOfGenerator {A : Type*} [AddGroup A] (g : A) {n : Nat} (horder : addOrderOf g = n) (hgen : AddSubgroup.zmultiples g = ⊤) : @@ -511,7 +510,7 @@ noncomputable def zmodCyclicMulEquivOfGenerator {G : Type*} [Group G] AddEquiv.toMultiplicative <| zmodAddEquivOfGenerator (Additive.ofMul g) (by simpa [addOrderOf_ofMul_eq_orderOf] using horder) - (additive_zmultiples_eq_top_of_zpowers_eq_top g hgen) + (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) @@ -522,7 +521,7 @@ private theorem zmodCyclicMulEquivOfGenerator_apply_one {G : Type*} [Group G] change Additive.toMul (zmodAddEquivOfGenerator (Additive.ofMul g) (by simpa [addOrderOf_ofMul_eq_orderOf] using horder) - (additive_zmultiples_eq_top_of_zpowers_eq_top g hgen) (1 : ZMod n)) = g + (by exact additive_zmultiples_eq_top_of_zpowers_eq_top g hgen) (1 : ZMod n)) = g rw [zmodAddEquivOfGenerator_apply_one] rfl diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index da1bb5fda8..6a26958fd3 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -760,7 +760,8 @@ theorem quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk' /-- Rebase automorphisms over an embedded finite extension from `L` to its field range `i(L)`. -/ -private def automorphismsOverFieldRangeEquiv +/-- Identify automorphisms over a field with automorphisms fixing its embedded image. -/ +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) ≃* diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean index 32413117de..4344bcd539 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/InfiniteGaloisCorrespondence.lean @@ -1419,8 +1419,8 @@ def conjugateOpenSubgroupOfOpenSubgroup haveI : FiniteDimensional K E := fixedFieldOfOpenSubgroup.instFiniteDimensional K H let σ' : Gal(AlgebraicClosure K/K) := σ - haveI : FiniteDimensional K (E.map σ'.toAlgHom) := - finiteDimensional_map_algEquiv σ' E + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean index 3c3af2399e..61e092dcb6 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/BaseChange.lean @@ -48,7 +48,8 @@ variable (hsquare : tauL.comp (algebraMap K L) = variable [Normal K L] include hsquare in -private def galoisPullbackElement (sigma : L' ≃ₐ[K'] L') : L ≃ₐ[K] L := by +/-- 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 @@ -152,7 +153,8 @@ open RamificationTheory.HilbertRamification.ValuationSubring variable (A' : _root_.ValuationSubring L') -private abbrev pulledValuationSubring : _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) : @@ -260,14 +262,14 @@ def galoisPullbackInertiaGroupMap : toFun sigma := by let delta := galoisPullbackDecompositionGroupMap tauK tauL hsquare A' (sigma : decompositionGroup K' A') - refine ⟨delta, ?_⟩ - 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⟩ + 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') diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean index fa14ce0556..4ab616e995 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationDensity.lean @@ -142,13 +142,16 @@ local instance completionBaseSMul : SMul K w.1.Completion := local instance completionAlgebra : Algebra vK.Completion w.1.Completion := AbsoluteValue.completionAlgebra vK w.1 w.2 -private abbrev localization : IntermediateField vK.Completion w.1.Completion := +/-- 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 -private abbrev toLocalization : L →+* localization vK w := +/-- The canonical embedding of the extension into its algebraic localization. -/ +abbrev toLocalization : L →+* localization vK w := AbsoluteValue.toAlgebraicLocalization vK w.1 w.2 -private abbrev localizationAbsoluteValue : +/-- 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 @@ -179,12 +182,14 @@ theorem algebraicLocalizationDensity_localization_nonarchimedean AbsoluteValue.algebraicLocalizationAbsoluteValue_toAlgebraicLocalization vK w.1 w.2 (n : L) simpa using hrestrict.trans_le (hC n) -private abbrev extensionValuationSubring +/-- 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 -private abbrev localizationValuationSubring +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean index f7cb403311..fbbbe640c7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Completion/ExtensionInvariants.lean @@ -94,11 +94,12 @@ theorem completionExponentialValueSubgroup_eq exponentialValueSubgroup (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha)) = + (by exact completionNonarchimedean a ha)) = exponentialValueSubgroup (absoluteValueExponentialValuation a ha) := by let aC := AbsoluteValue.completionAbsoluteValue a - let haC := completionNonarchimedean a ha + let haC : LubinTate.Valuations.NonarchimedeanAbsoluteValue aC := by + exact completionNonarchimedean a ha let v := absoluteValueExponentialValuation a ha let vC := absoluteValueExponentialValuation aC haC ext r @@ -137,10 +138,10 @@ theorem completionRamificationIndex_eq exponentialRamificationIndex (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha)) + (by exact completionNonarchimedean a ha)) (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue b) - (completionNonarchimedean b hb)) = + (by exact completionNonarchimedean b hb)) = exponentialRamificationIndex (absoluteValueExponentialValuation a ha) (absoluteValueExponentialValuation b hb) := by @@ -175,7 +176,7 @@ def completionExponentialSubringMap LubinTate.Valuations.exponentialValuationSubring (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha)) := + (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 @@ -191,7 +192,7 @@ def completionExponentialSubringMap LubinTate.Valuations.exponentialValuationSubring (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha))) : a.Completion) = + (by exact completionNonarchimedean a ha))) : a.Completion) = algebraMap K a.Completion (x : K) := rfl theorem completionExponentialSubringMap_isLocalHom @@ -205,7 +206,7 @@ theorem completionExponentialSubringMap_isLocalHom rw [LubinTate.Valuations.associatedAbsoluteValue_isUnit_iff_eq_one (absoluteValueExponentialValuation_associated (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha))] at hx + (by exact completionNonarchimedean a ha))] at hx change AbsoluteValue.completionAbsoluteValue a ((x : K) : a.Completion) = 1 at hx rw [AbsoluteValue.completionAbsoluteValue_coe] at hx @@ -220,7 +221,8 @@ theorem completionResidueMap_surjective (IsLocalRing.ResidueField.map (completionExponentialSubringMap a ha)) := by let v := absoluteValueExponentialValuation a ha let aC := AbsoluteValue.completionAbsoluteValue a - let haC := completionNonarchimedean a ha + 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 @@ -271,7 +273,7 @@ noncomputable def completionResidueEquiv (LubinTate.Valuations.exponentialValuationSubring (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha))) := by + (by exact completionNonarchimedean a ha))) := by letI : IsLocalHom (completionExponentialSubringMap a ha) := completionExponentialSubringMap_isLocalHom a ha exact ValuationTheory.DiscreteValuationField.ResidueField.ringEquivOfSurjective @@ -321,9 +323,10 @@ theorem completionExponentialValuation_discrete LubinTate.Valuations.DiscreteExponentialValuation (absoluteValueExponentialValuation (AbsoluteValue.completionAbsoluteValue a) - (completionNonarchimedean a ha)) := by + (by exact completionNonarchimedean a ha)) := by let aC := AbsoluteValue.completionAbsoluteValue a - let haC := completionNonarchimedean a ha + 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⟩ @@ -359,8 +362,10 @@ theorem completionExponentialSubringMap_square let w := absoluteValueExponentialValuation b hb let aC := AbsoluteValue.completionAbsoluteValue a let bC := AbsoluteValue.completionAbsoluteValue b - let haC := completionNonarchimedean a ha - let hbC := completionNonarchimedean b hb + 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 @@ -388,8 +393,10 @@ theorem completionResidueDegree_eq let w := absoluteValueExponentialValuation b hb let aC := AbsoluteValue.completionAbsoluteValue a let bC := AbsoluteValue.completionAbsoluteValue b - let haC := completionNonarchimedean a ha - let hbC := completionNonarchimedean b hb + 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 @@ -401,8 +408,10 @@ theorem completionResidueDegree_eq let w := absoluteValueExponentialValuation b hb let aC := AbsoluteValue.completionAbsoluteValue a let bC := AbsoluteValue.completionAbsoluteValue b - let haC := completionNonarchimedean a ha - let hbC := completionNonarchimedean b hb + 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 @@ -507,7 +516,8 @@ theorem completionExtensionInvariants_local_identity a w.1 ha hb w.2 let aC := AbsoluteValue.completionAbsoluteValue a let bC := AbsoluteValue.completionAbsoluteValue w.1 - let haC := completionNonarchimedean a ha + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index fee905a737..f37dc6ec1c 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -848,7 +848,8 @@ noncomputable instance dvrHigherUnitQuotientInverseLimit.instTopologicalSpace exact (dvrHigherUnitQuotientInverseLimitCompatibleFamiliesEquiv π).topologicalSpace -private noncomputable def +/-- The higher-unit inverse limit is homeomorphic to its compatible coordinate families. -/ +noncomputable def dvrHigherUnitQuotientInverseLimitRepresentationHomeomorph {O : Type*} [CommRing O] (π : O) : letI : (n : ℕ) → TopologicalSpace @@ -944,8 +945,8 @@ def unitsToHigherUnitQuotientInverseLimit Oˣ →* dvrHigherUnitQuotientInverseLimit π where toFun u := dvrHigherUnitQuotientInverseLimitMk π (fun _ => QuotientGroup.mk u) - (fun {m n} hmn => - dvrHigherUnitQuotientTransition_mk π (m := m) (n := n) hmn 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 @@ -1172,7 +1173,8 @@ private theorem continuous_unitHom_of_continuous_val refine ⟨hval, ?_⟩ simpa only [Function.comp_def, map_inv] using hval.comp hinv -private noncomputable def unitsCompatibleFamiliesHomeomorph +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean index 9566eae8f4..e154fc51aa 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -696,7 +696,8 @@ noncomputable instance adicPositiveQuotientInverseLimit.instTopologicalSpace exact (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).topologicalSpace -private noncomputable def +/-- 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 _ => ⊥ From b73a25b55a6ffea7dee34a24fe168ae850d01a6a Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 19:37:35 +0000 Subject: [PATCH 21/33] Complete ClassFieldTheory interface and line-length cleanup --- .../Degree/Fields.lean | 8 +- .../IdelePowerLocalUnitNormContainment.lean | 5 +- .../FinitePlaceDecomposition.lean | 5 +- .../AbelianConductorExactness.lean | 10 +- .../GlobalClassFields/ConductorFrobenius.lean | 12 +- .../ConductorRayClassMaximality.lean | 6 +- .../CyclicRayClassMaximality.lean | 4 +- .../HilbertClassFieldMaximality.lean | 8 +- .../HilbertClassFieldPrimeSplitting.lean | 6 +- .../GlobalClassFields/NormLimitation.lean | 4 +- .../NormRayClassMaximality.lean | 6 +- .../SUnitKummerNormCore.lean | 5 +- .../IdealNormArtinExactness.lean | 5 +- .../ZeroTransport.lean | 4 +- .../Reciprocity/GlobalNormResidue.lean | 15 +- .../GlobalNormResidueAbelianization.lean | 24 ++- ...tionalCyclotomicArithmeticReciprocity.lean | 4 +- .../UnramifiedResidueUniqueness.lean | 5 +- .../Unramified/PrincipalUnits/Basic.lean | 2 +- .../Unramified/PrincipalUnits/NormSide.lean | 2 +- .../Unramified/PrincipalUnits/Trace.lean | 4 +- .../Finite/Unramified/ResidueNorm.lean | 4 +- ...racteristicTransportedArtinComparison.lean | 2 +- ...risticTransportedFixedFieldComparison.lean | 2 +- ...sticTransportedRealFilteredComparison.lean | 10 +- .../HerbrandLowDegree/BinaryProduct.lean | 6 +- .../Cyclic/Herbrand/NormalBasisLattice.lean | 4 +- .../LocalField/Analytic/LogExpAdditivity.lean | 4 +- .../Analytic/LogExpSeries/ExpConvergence.lean | 4 +- .../Analytic/LogExpSeries/FormalProduct.lean | 4 +- .../LogExpSeries/PrincipalUnitLog/Core.lean | 4 +- .../EqualCharacteristicLaurent.lean | 34 ++- .../RangeRestrictedTopology.lean | 6 +- .../UniformizerIntegerValuation.lean | 24 +-- .../Ramification/Different.lean | 43 ++-- .../FiniteExtensionCorrespondence.lean | 1 - .../Ramification/Herbrand/Quotient.lean | 2 +- .../FiniteExtension/Core.lean | 3 +- .../FiniteExtension/Uniqueness.lean | 3 +- .../IntegralClosure.lean | 4 +- .../Topology/AdicCompletionInverseLimit.lean | 194 +++++++++--------- .../AdicCompletionInverseLimitRing.lean | 3 +- 42 files changed, 279 insertions(+), 226 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean index 011bc72703..11dcf02f33 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/Fields.lean @@ -274,7 +274,7 @@ noncomputable def relativeRamificationIndexCardinal /-- 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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal +theorem degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal (E : AbstractExtension G) (D : DegreeData G) : E.degreeCardinal = Cardinal.lift.{u} (E.relativeResidueDegreeCardinal D) * @@ -442,7 +442,7 @@ 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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal D, + 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 @@ -451,7 +451,7 @@ 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_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal D, + rw [E.degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal D, E.relativeResidueDegreeCardinal_eq_one_of_isTotallyRamified D hE] simp @@ -686,7 +686,7 @@ private theorem relativeDegreeCardinals_lt_aleph0 (D : DegreeData G) : apply (Cardinal.mul_lt_aleph0_iff_of_ne_zero hresidue hramification).mp rw [← - E.toAbstractExtension.degreeCardinal_eq_relativeResidueDegreeCardinal_mul_relativeRamificationIndexCardinal D] + E.toAbstractExtension.degreeCardinal_eq_residueDegreeCardinal_mul_ramificationIndexCardinal D] exact E.degreeCardinal_lt_aleph0 private theorem relativeResidueDegreeCardinal_lt_aleph0 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index e1d31e3d96..c578b7abc1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -489,6 +489,9 @@ private theorem unit_mem_power_range_of_ideleClassNorm_top 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 @@ -644,7 +647,7 @@ theorem rfl rw [hprincipal] at hbLocal simpa only [M] using - KummerTheory.chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup (K := K) n hnK hmu b w hbLocal have hAway : ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S' ∪ T → diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index be678cad74..99ba6227f5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -29,6 +29,9 @@ section namespace GlobalClassFieldTheory.ClassFieldAxiom open scoped Classical in + +open _root_.RamificationTheory.HilbertRamification + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff) in /-- Full relative decomposition above `q` puts every `M`-automorphism inside the global chosen decomposition group below `q`. -/ @@ -137,7 +140,7 @@ theorem HilbertRamification.absoluteValueDecompositionGroup F wM.1 := by exact - (HilbertRamification.decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff + (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff (K := F) (M := M) wM.1 tau).mpr htauM change rho ∈ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean index 00f7421e9a..264fe27559 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/AbelianConductorExactness.lean @@ -532,6 +532,9 @@ variable [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 @@ -544,7 +547,7 @@ theorem abelianFullConductor_finiteExponent_eq_localConductorExponent GlobalClassFieldTheory.GlobalClassFields.ideleClassNormNarrowFiniteConductor (K := K) (L := L) v = _ exact - GlobalClassFieldTheory.GlobalClassFields.ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent + ideleClassNorm_narrowFiniteConductor_apply_eq_chosenLocalConductorExponent (K := K) (L := L) v open scoped Classical in @@ -571,6 +574,9 @@ theorem abelianFullConductor_finiteExponent_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 @@ -579,7 +585,7 @@ theorem abelianFullConductor_mem_infinitePart_iff_realRamified (GlobalClassFieldTheory.GlobalClassFields.ideleClassNormConductorialSubgroup (K := K) (L := L)).fullConductor.infinitePart ↔ ¬ v.1.IsUnramifiedIn L := by - rw [GlobalClassFieldTheory.GlobalClassFields.ideleClassNormFullConductor_infinitePart_eq_realRamificationLocus] + 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/ConductorFrobenius.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean index 9e944d195f..e00d34a7ec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorFrobenius.lean @@ -256,7 +256,7 @@ theorem narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient (K := K) (L := L) have hfInjective : Function.Injective f := - (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_normQuotient_card + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card (K := K) (L := L)).2 hcard constructor · intro hprime @@ -300,7 +300,7 @@ theorem narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient (K := K) (L := L) have hfInjective : Function.Injective f := - (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_normQuotient_card + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card (K := K) (L := L)).2 hcard have horder := orderOf_injective f hfInjective @@ -315,7 +315,7 @@ theorem the actual norm quotient, triviality of its ray prime class is equivalent to membership of the prime ideal in the ideal Artin kernel. -/ theorem - narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel (hcard : Nat.card (RayClass.RayClassGroup @@ -528,7 +528,7 @@ theorem exact ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L exact - narrowFiniteConductorRayPrimeClass_eq_one_iff_narrowFiniteConductorPrimeIdeal_mem_idealArtinKernel + rayPrimeClass_eq_one_iff_primeIdeal_mem_idealArtinKernel (K := K) (L := L) (hcard.trans hNormCard.symm) v hv @@ -536,7 +536,7 @@ theorem narrow finite conductor, complete splitting forces the corresponding ray prime class to be trivial. -/ theorem - finitePlaceSplitsCompletely_imp_narrowFiniteConductorRayPrimeClass_eq_one_of_card_eq_extensionDegree + splitsCompletely_imp_rayPrimeClass_eq_one_of_card_eq_extensionDegree (hcard : Nat.card (RayClass.RayClassGroup @@ -553,7 +553,7 @@ theorem Function.Injective (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient (K := K) (L := L)) := - (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_extensionDegree + (rayClassToNormQuotient_injective_iff_card_eq_extensionDegree (K := K) (L := L)).2 hcard apply hfInjective rw [ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean index 1b36942edc..286e345227 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/ConductorRayClassMaximality.lean @@ -238,7 +238,7 @@ theorem narrowFiniteConductorRayClassGroupEquivQuotientOfCardEq_mk narrow finite conductor precisely when its quotient has the full exact narrow finite conductor ray class number. -/ theorem - subgroup_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_quotient_card + subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card (H : ConductorialSubgroup K) : H.1 = RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) ↔ @@ -300,7 +300,7 @@ theorem calc H.1 = RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite H.narrowFiniteConductor) := - H.subgroup_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_quotient_card.2 + H.subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card.2 hHcard _ = RayClass.Modulus.congruenceSubgroup (RayClass.Modulus.narrowOfFinite J.narrowFiniteConductor) := @@ -309,7 +309,7 @@ theorem (RayClass.Modulus.narrowOfFinite f)) hconductor _ = J.1 := - (J.subgroup_eq_narrowFiniteConductorCongruenceSubgroup_iff_rayClassGroup_card_eq_quotient_card.2 + (J.subgroup_eq_conductorCongruenceSubgroup_iff_rayClass_card_eq_quotient_card.2 hJcard).symm /-- The quotients by two maximal exact narrow finite conductor subgroups diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean index a36c4e5a79..dd466c7b1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/CyclicRayClassMaximality.lean @@ -72,7 +72,7 @@ theorem norm conductor to the actual norm quotient is injective precisely when the ray class number equals the extension degree. -/ theorem - narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_extensionDegree : + rayClassToNormQuotient_injective_iff_card_eq_extensionDegree : Function.Injective (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient (K := K) (L := L)) ↔ @@ -84,7 +84,7 @@ theorem simpa only [ ← Subgroup.index_eq_card, ClassFieldAxiom.ideleClassNorm_index_eq_finrank_cyclic K L] using - (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_normQuotient_card + (rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card (K := K) (L := L)) /-- When the ray class number at the exact narrow finite norm conductor diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean index 7ee3a09ac8..08eacc9559 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldMaximality.lean @@ -70,7 +70,7 @@ private instance bigHilbertNormSubgroup_finiteIndex : Hilbert norm subgroup exactly when its degree is the order of the narrow class group. -/ theorem - ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card (hunramified : _root_.ramifiedBaseFinitePlaces (K := K) (L := L) = ∅) : @@ -206,7 +206,7 @@ def maximalFiniteUnramifiedCyclicNormQuotientEquivNarrowClassGroup (_root_.ideleClassNorm K L).range) ≃* RayClass.NarrowClassGroup K := (QuotientGroup.quotientMulEquivOfEq - ((ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + ((ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card (K := K) (L := L) hunramified).2 hdegree)).trans (bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K)) @@ -398,10 +398,10 @@ theorem maximalFiniteUnramifiedCyclicNormRanges_eq calc (_root_.ideleClassNorm K L).range = bigHilbertClassFieldNormSubgroup (K := K) := - (ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + (ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card (K := K) (L := L) hLunramifiedFinite).2 hLdegree _ = (_root_.ideleClassNorm K M).range := - ((ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + ((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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean index 704668d2b4..6106eb300a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldPrimeSplitting.lean @@ -322,7 +322,7 @@ theorem (quotientMulEquivOfEq_trans_apply_mk ((_root_.ideleClassNorm K L).range) (bigHilbertClassFieldNormSubgroup (K := K)) - ((ideleClassNorm_range_eq_bigHilbertClassFieldNormSubgroup_iff_finrank_eq_narrowClassGroup_card + ((ideleClassNorm_range_eq_bigHilbertNormSubgroup_iff_finrank_eq_narrowClass_card (K := K) (L := L) hunramified).2 hdegree) (bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K)) @@ -595,7 +595,7 @@ theorem orderOf_maximalEverywhereUnramifiedCyclicFrobeniusClass the small Hilbert class field is equivalent to triviality of the corresponding Frobenius class in the actual maximal norm quotient. -/ theorem - maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertClassFieldSplitsCompletely + unramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertSplitsCompletely (hunramifiedFinite : _root_.ramifiedBaseFinitePlaces (K := K) (L := L) = ∅) @@ -646,7 +646,7 @@ theorem FractionalIdealGroup.prime v ∈ (toPrincipalIdeal (𝓞 K) K).range := by exact - (maximalEverywhereUnramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertClassFieldSplitsCompletely + (unramifiedCyclicFrobeniusClass_eq_one_iff_smallHilbertSplitsCompletely (K := K) (L := L) hunramifiedFinite hdegree v).trans (IdealClassFieldTheory.splitsCompletelyInSmallHilbertClassField_iff_principal v) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean index 92e367f0f3..c0eddaf621 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormLimitation.lean @@ -47,7 +47,7 @@ variable subgroup of the original field copy have the same image in the abelianization of the normal-closure Galois group. -/ theorem - finiteNormalClosureMaximalAbelianSubfield_fixingSubgroup_image_eq_originalFixingSubgroup_image : + maximalAbelianSubfield_fixingSubgroup_image_eq_original_image : (finiteNormalClosureMaximalAbelianSubfield K L).fixingSubgroup.map (Abelianization.of : Gal(finiteNormalClosure K L/K) →* @@ -109,7 +109,7 @@ theorem (Reciprocity.globalNormResidueAbelianizationMonoidHom K (finiteNormalClosure K L)) = _ rw [ - finiteNormalClosureMaximalAbelianSubfield_fixingSubgroup_image_eq_originalFixingSubgroup_image] + maximalAbelianSubfield_fixingSubgroup_image_eq_original_image] _ = (_root_.ideleClassNorm K (finiteNormalClosureMaximalAbelianSubfield K L)).range := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean index ca6a9139c9..21631232e0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/NormRayClassMaximality.lean @@ -105,7 +105,7 @@ theorem idèle-class norm quotient is injective if and only if its finite source and target have the same order. -/ theorem - narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient_injective_iff_card_eq_normQuotient_card : + rayClassToNormQuotient_injective_iff_card_eq_normQuotient_card : Function.Injective (narrowFiniteConductorRayClassGroupToIdeleClassNormQuotient (K := K) (L := L)) ↔ @@ -160,7 +160,7 @@ def normQuotientEquivNarrowFiniteConductorRayClassGroup conductor and maximal ray-class presentations have the same actual idèle-class norm subgroup. -/ theorem - ideleClassNorm_ranges_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_normQuotient_cards + 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] @@ -239,7 +239,7 @@ def normQuotientEquivOfNarrowFiniteConductorsEqOfRayClassGroupCardsEqNormQuotien (IdeleClassGroup K ⧸ (_root_.ideleClassNorm K M).range) := QuotientGroup.quotientMulEquivOfEq - (ideleClassNorm_ranges_eq_of_narrowFiniteConductors_eq_of_rayClassGroup_cards_eq_normQuotient_cards + (ideleClassNorm_ranges_eq_of_conductors_eq_of_rayClass_cards_eq_normQuotient_cards (K := K) (L := L) (M := M) hconductor hLcard hMcard) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index 73075d97d1..3b6d64b678 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -194,6 +194,9 @@ private theorem unit_mem_power_range_of_surjective 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 @@ -271,7 +274,7 @@ theorem rfl rw [hprincipal] at hbLocal simpa only [M] using - KummerTheory.chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup + chosenSimpleKummerExtension_infiniteTensorNormSubgroup_eq_top_of_mem_nthPowerSubgroup (K := K) n hnK hmu b w hbLocal have hAway : ∀ w : HeightOneSpectrum (𝓞 K), w ∉ S' → diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean index 222a2c8912..c5d38026a9 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/IdealNormArtinExactness.lean @@ -492,6 +492,9 @@ variable [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 @@ -505,7 +508,7 @@ theorem arithmeticIdealArtin_ker_eq_norm_range_sup_ray_principal (K := K) (L := L) m).range ⊔ RayClass.principalRayIdealSubgroup m := by simpa only [RayClass.idealNormSubgroup] using - (GlobalClassFieldTheory.IdealClassFieldTheory.arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup + (arithmeticIdealArtinGaloisMap_ker_eq_idealNormSubgroup (K := K) (L := L) m hm) open scoped Classical in diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean index 70e71fa7e7..af50524f1e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/RationalFiniteNormTransfer/ZeroTransport.lean @@ -46,7 +46,7 @@ local instance /-- Internal finite-norm-class-zero to quotient-zero step. -/ private theorem - rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_finiteNormRepresentativeQuotientZero + finiteNormTransferCanonicalClassZero_implies_representativeQuotientZero (K H L : ClosedSubgroup (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) (hHK : H.toSubgroup ≤ K.toSubgroup) @@ -159,7 +159,7 @@ private theorem (hKfinite := hHfinite) (hfinite := hHLfinite) H L hLH hLHnormal have hquotientZero := - rationalFiniteNormTransferCanonicalFiniteNormClassZero_implies_finiteNormRepresentativeQuotientZero + finiteNormTransferCanonicalClassZero_implies_representativeQuotientZero (hKfinite := hKfinite) (hKHfinite := hKHfinite) (hHLfinite := hHLfinite) K H L hHK hLH hLHnormal c hincludeCanonical diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean index 5e365c226c..e534c1b30c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidue.lean @@ -228,6 +228,9 @@ theorem globalNormResidueEquiv_finiteNormClass (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`. -/ @@ -241,8 +244,8 @@ theorem globalNormResidueEquiv_finiteReciprocityHom K L (rationalCyclotomicDegreeData.finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData - (rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L).field @@ -260,8 +263,8 @@ theorem globalNormResidueEquiv_finiteReciprocityHom (numberFieldTowerTopSubgroup_le_baseSubgroup K L) := rationalCyclotomicDegreeData.finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData - (rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L).field @@ -284,7 +287,7 @@ theorem globalNormResidueEquiv_finiteReciprocityHom numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L (rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData + cyclotomicValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L) @@ -297,7 +300,7 @@ theorem globalNormResidueEquiv_finiteReciprocityHom (numberFieldTowerAbelianizedExtensionQuotientEquivGaloisGroup K L) (rationalCyclotomicDegreeData.normResidueSymbol_finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData + cyclotomicValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L) q) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean index eaab190925..76ef8e0850 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/GlobalNormResidueAbelianization.lean @@ -219,6 +219,9 @@ theorem globalNormResidueAbelianizationEquiv_finiteNormClass 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. -/ @@ -238,8 +241,8 @@ theorem globalNormResidueAbelianizationEquiv_finiteReciprocityHom K L (rationalCyclotomicDegreeData.finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData - (rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L).field @@ -261,8 +264,8 @@ theorem globalNormResidueAbelianizationEquiv_finiteReciprocityHom let x := rationalCyclotomicDegreeData.finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData - (rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + cyclotomicValuationData + (cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology rationalIdeleClassRepresentation_satisfiesClassFieldAxiom) (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L).field @@ -275,14 +278,14 @@ theorem globalNormResidueAbelianizationEquiv_finiteReciprocityHom have hxNorm : rationalCyclotomicDegreeData.normResidueSymbol rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData + cyclotomicValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L) x = Additive.ofMul (Abelianization.of q) := rationalCyclotomicDegreeData.normResidueSymbol_finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData + cyclotomicValuationData rationalIdeleClassRepresentation_satisfiesClassFieldAxiom (numberFieldTowerReciprocityFiniteAbstractField K L) (numberFieldTowerFiniteGaloisSubextension K L) q @@ -588,6 +591,9 @@ variable [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 : @@ -609,12 +615,12 @@ private theorem numberFieldTowerExtensionSubgroup_normal F E let hRelativeFinite := T.finite let hUnramified := - rationalCyclotomicIdeleClassValuationData.classFieldAxiom_implies_unramifiedUnitCohomology + cyclotomicValuationData.classFieldAxiom_implies_unramifiedUnitCohomology rationalIdeleClassRepresentation_satisfiesClassFieldAxiom let r := rationalCyclotomicDegreeData.finiteReciprocityHom rationalIdeleClassRepresentation - rationalCyclotomicIdeleClassValuationData + cyclotomicValuationData hUnramified H T.field T.below (hLnormal := T.normal) (hLfinite := T.finite) @@ -625,7 +631,7 @@ private theorem Abelianization (Gal(E/F)) := Abelianization.equivOfComm have hr : Function.Surjective r := - rationalCyclotomicIdeleClassValuationData.abstractReciprocity_finiteReciprocityHom_surjective + cyclotomicValuationData.abstractReciprocity_finiteReciprocityHom_surjective rationalIdeleClassRepresentation_satisfiesClassFieldAxiom hUnramified H T obtain ⟨x, rfl⟩ := n.surjective q diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean index 791b71aaff..f4afb2bf3e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalCyclotomicArithmeticReciprocity.lean @@ -202,7 +202,7 @@ open scoped Classical in /-- Arithmetic reciprocity sends the arithmetic norm-residue symbol of an idèle class to its genuine rational ray class. -/ theorem - rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_arithmeticGlobalNormResidue + rationalCyclotomicGaloisEquivRayClassGroup_arithmeticGlobalNormResidue (c : IdeleClassGroup ℚ) : rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup m @@ -248,7 +248,7 @@ theorem rw [ (rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup m).apply_symm_apply, - rationalCyclotomicLevelArithmeticGaloisContinuousMulEquivRayClassGroup_arithmeticGlobalNormResidue] + rationalCyclotomicGaloisEquivRayClassGroup_arithmeticGlobalNormResidue] open scoped Classical in /-- The inverse arithmetic ray reciprocity image of the ordinary diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean index 4e8ae33c5f..fb2a56c8a7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -42,6 +42,9 @@ private noncomputable instance : IsIntegralClosure 𝒪[L] 𝒪[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 @@ -79,7 +82,7 @@ theorem finiteAbelianLocalArtinMap_inverseUniformizer_residue_pow_iff constructor · intro hσ apply - LocalFieldTheory.galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation + galoisGroupResidueAlgEquivHomOfIsIntegralClosure_injective_of_unramifiedValuation K L apply AlgEquiv.ext intro y diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean index 5e98f9b493..0fd60f2e19 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Basic.lean @@ -126,7 +126,7 @@ theorem norm_oneAdd_sub_galoisSum_mem_next rw [principalUnitsMap_normOfUnramifiedValuationOfIsIntegralClosure_eq_normExtensionSide K L n (principalUnitOneAddOfMemPowSubgroup L hn (a : 𝒪[L]) a.2)] exact - principalUnitsNormExtensionSideOfIsIntegralClosure_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ + principalUnitsNormExtensionSide_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ K L n hn a end UnramifiedPrincipalUnits diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean index 4ffd9d67fc..2aa24aee7f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/NormSide.lean @@ -159,7 +159,7 @@ theorem principalUnitsNormExtensionSideOfIsIntegralClosure_eq_galoisGroup_prod /-- Actual integral-closure version of the first-order norm-product calculation before residue trace identification. -/ theorem - principalUnitsNormExtensionSideOfIsIntegralClosure_oneAdd_sub_one_sub_sum_mem_maximalIdeal_pow_succ + 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean index 69ff50124f..09c2ff1d6a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/PrincipalUnits/Trace.lean @@ -120,7 +120,7 @@ end UnramifiedPrincipalUnits `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 - principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_oneAdd_uniformizer_pow_eq_trace + 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] @@ -205,7 +205,7 @@ theorem principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_trace intro πK πL hπL eK eL obtain ⟨r, rfl⟩ := IsLocalRing.residue_surjective x have hrep := - principalUnitsSuccQuotNormOfUnramifiedValuationOfIsIntegralClosure_oneAdd_uniformizer_pow_eq_trace + principalUnitsSuccQuotNorm_oneAdd_uniformizer_pow_eq_trace K L n hn r rw [principalUnitsSuccQuotAddEquivResidueOfIrreducible_symm_residue] change Additive.ofMul _ = _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean index 4afef4779e..d74c8ae936 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/ResidueNorm.lean @@ -180,7 +180,7 @@ theorem /-- 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 - integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_eq_residueNorm_of_unramifiedValuation + 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] @@ -213,7 +213,7 @@ theorem [LocalFieldTheory.IsNonarchimedeanLocalField.IsUnramifiedValuedExtension K L] : Function.Surjective (integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure K L) := by - rw [integerUnitsModPrincipalUnitsNormOfGaloisOfIsIntegralClosure_eq_residueNorm_of_unramifiedValuation + rw [integerUnitsModPrincipalUnitsNorm_eq_residueNorm_of_unramifiedValuation K L] exact integerUnitsModPrincipalUnitsResidueNorm_surjective_of_valuationExtension K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean index 7f3303676e..fc0c148e3a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedArtinComparison.lean @@ -162,7 +162,7 @@ theorem /-- Integral filtered local reciprocity for a transported equal-characteristic Lubin--Tate level. -/ theorem - equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup (p : ℕ) [Fact p.Prime] [hKp : CharP K p] (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean index e8b5bf61b3..00996408e4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedFixedFieldComparison.lean @@ -127,7 +127,7 @@ theorem have hExplicit : artinPrincipalUnitStepGroup K E t = localUpperRamificationGroup K E t := - equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + transportedLubinTateArtinPrincipalUnitStep_eq_upperRamificationGroup K p ϖ hϖ m t ht calc artinPrincipalUnitStepGroup K M t = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean index 8b21b2df8b..d0f809f606 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/EqualCharacteristicTransportedRealFilteredComparison.lean @@ -384,7 +384,7 @@ theorem (LocalFieldTheory.fieldPrincipalUnits K (n + 1)).map (abelianLocalArtinMonoidHom K L) = ⊥ exact - (equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + (transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup K p ϖ hϖ n (n + 1) (by omega) (by omega)).trans (equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_succ_eq_bot K p ϖ hϖ n) @@ -549,7 +549,7 @@ theorem /-- Beyond the last visible level, the target-field upper ramification group is trivial. -/ theorem - equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + transportedLubinTateUpperRamificationGroup_eq_bot_of_level_lt_ceil (p : ℕ) [Fact p.Prime] [hKp : CharP K p] (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) @@ -598,7 +598,7 @@ theorem /-- Real filtered local reciprocity for every transported equal-characteristic Lubin--Tate level. -/ theorem - equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_localUpperRamificationGroup + transportedLubinTateArtinPrincipalUnitStep_eq_upperRamificationGroup (p : ℕ) [Fact p.Prime] [hKp : CharP K p] (ϖ : Kˣ) (hϖ : valuationMap K (Additive.ofMul ϖ) = 1) @@ -665,7 +665,7 @@ theorem (abelianLocalArtinMonoidHom K L) = localUpperRamificationGroup K L t exact - (equalCharacteristicTransportedLubinTateArtinPrincipalUnitsImage_eq_localUpperRamificationGroup + (transportedLubinTateArtinPrincipalUnitsImage_eq_upperRamificationGroup K p ϖ hϖ n k hk hkn).trans hLocalStep.symm · have hlevel : n + 1 < ⌈t⌉₊ := by dsimp only [k] at hkn @@ -673,7 +673,7 @@ theorem exact (equalCharacteristicTransportedLubinTateArtinPrincipalUnitStepGroup_eq_bot_of_level_lt_ceil K p ϖ hϖ n t hlevel).trans - (equalCharacteristicTransportedLubinTateLocalUpperRamificationGroup_eq_bot_of_level_lt_ceil + (transportedLubinTateUpperRamificationGroup_eq_bot_of_level_lt_ceil K p ϖ hϖ n t hlevel).symm end LocalClassFieldTheory diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index 6ef6140e89..b2ee1fa84e 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -91,7 +91,8 @@ theorem prodEquivBinaryCoefficientFamily_smul funext i cases i <;> rfl -private noncomputable def piHerbrandH0EquivProd : +/-- 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 @@ -105,7 +106,8 @@ private noncomputable def piHerbrandH0EquivProd : right_inv _ := rfl map_mul' _ _ := rfl -private noncomputable def piHerbrandHMinusOneEquivProd +/-- Identify the degree-minus-one cohomology family over `Bool` with its two factors. -/ +noncomputable def piHerbrandHMinusOneEquivProd (σ : G) : (∀ i, HerbrandHMinusOne G (BinaryCoefficientFamily A B i) σ) ≃* diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean index 6c3ce06179..8a7665d981 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/NormalBasisLattice.lean @@ -994,7 +994,7 @@ 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 - chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule + 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 ≤ @@ -1039,7 +1039,7 @@ theorem exists_chosenBaseUniformizerPowSubmodule_le_maximalIdealFieldSubmodule_o (K := K) (L := L) hN with ⟨b, hb⟩ exact ⟨b + 1, - chosenBaseUniformizerPowSubmodule_succ_le_maximalIdealFieldSubmodule_of_le_integerRingFieldSubmodule + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean index e34cd3a828..7dbe4b9885 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpAdditivity.lean @@ -490,7 +490,7 @@ theorem /-- The expanded product-argument Sigma-family has sum equal to the scaled logarithm of `x + y + xy`. -/ theorem - hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_ofWithZeroValuation_scaled + hasSum_logProduct_logDegree_monomialValue_pair_sigma_scaled [Algebra ℚ K] (v : _root_.Valuation K (WithZero (Multiplicative ℤ))) {p : ℕ} [Fact p.Prime] (e : ℕ) (x y : K) @@ -582,7 +582,7 @@ theorem (logOnePlusSeriesFieldOfWithZeroValuation v (x + y + x * y) hnK) := by simpa [sigmaTerm] using - hasSum_formalLogOnePlusProductArgument_logDegree_monomialValue_pair_sigma_ofWithZeroValuation_scaled + 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 →₀ ℕ) => ℕ) ≃ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean index 459c1a8859..7c02a88d97 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/ExpConvergence.lean @@ -821,7 +821,7 @@ theorem summable_expSeriesTermField_mul_prod_ofWithZeroValuation_scaled_of_thres /-- The antidiagonal Cauchy product of two local exponential series sums to the product of their values under the sharp ramified threshold. -/ theorem - hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_scaled_of_threshold + 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)) @@ -943,7 +943,7 @@ theorem expSeriesField_add_eq_mul_ofWithZeroValuation_scaled_of_threshold (expSeriesTermField_add_eq_sum_antidiagonal (K := K) x y hnK n).symm have hsumProduct := - hasSum_expSeriesTermField_cauchyProduct_expSeriesField_mul_ofWithZeroValuation_scaled_of_threshold + hasSum_expSeriesTerm_cauchyProduct_expSeries_mul_scaled_of_threshold (v := v) (p := p) e x y hnK hnval hxthreshold hythreshold hcomplete exact hsumCauchyAdd.unique hsumProduct diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean index 9cb7c0cb93..f0cc351dcd 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/FormalProduct.lean @@ -927,7 +927,7 @@ PowerSeries.coeff q (PowerSeries.log A) • MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q)`. -/ theorem - formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_filter_coord_le + 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 @@ -959,7 +959,7 @@ theorem formalProductDefect_coeff_pos_eq_filtered_sum PowerSeries.coeff q (PowerSeries.log A) • MvPowerSeries.coeff e ((formalLogOnePlusProductArgument A) ^ q) := by - rw [formalLogOnePlusProductFormulaDefect_coeff_of_pos_coords_eq_sum_range_degree_succ_filter_coord_le + rw [formalLogProductDefect_coeff_of_pos_eq_sum_range_filter_coord_le A e hleft hright] rw [finsupp_fin_two_degree_eq] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean index bb3b3302a5..f503f60d16 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/LogExpSeries/PrincipalUnitLog/Core.lean @@ -430,7 +430,7 @@ theorem principalUnitLogSeries_expSeries_idealQuotient_succ_eq_self_ofWithZeroVa 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_ofWithZeroValuationScaled + 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 : ℕ) @@ -558,7 +558,7 @@ theorem principalUnitExpSeries_logSeries_idealQuotient_succ_eq_self_ofWithZeroVa (I := F.maximalIdeal ^ (n + 1)) lhs rhs).2 (by simpa [F, lhs, rhs] using - principalUnitExpSeries_logSeries_sub_self_mem_maximalIdeal_pow_succ_ofWithZeroValuationScaled + 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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 5ccce3a652..2f60dafe7b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -834,6 +834,9 @@ 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. -/ @@ -843,9 +846,12 @@ noncomputable def laurentImageSubfield (π : F.valuationSubring) (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) : Subfield K := - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (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 π @@ -857,13 +863,16 @@ theorem adicLaurentSeriesEval_mem_laurentImageSubfield (π : F.valuationSubring) (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (x : F.residueField⸨X⸩) : - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + adicLaurentSeriesEvalHom (F := F.toCompleteDVF) p hcard π hπ x ∈ F.laurentImageSubfield p hcard π hπ := RingHom.mem_fieldRange_self - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (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] @@ -877,11 +886,14 @@ theorem laurentImageSubfield_eq_top trivial · intro _hx rcases - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_surjective + 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] @@ -891,7 +903,7 @@ noncomputable def laurentSeriesEquivLaurentImageSubfield F.residueField⸨X⸩ ≃+* F.laurentImageSubfield p hcard π hπ := RingHom.rangeRestrictFieldEquiv - (_root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + (adicLaurentSeriesEvalHom (F := F.toCompleteDVF) p hcard π hπ) /-- @@ -908,10 +920,13 @@ hπ x`. (x : F.residueField⸨X⸩) : ((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ x : F.laurentImageSubfield p hcard π hπ) : K) = - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom + 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) @@ -930,9 +945,12 @@ theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_C _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.coeffHom (F := F.toCompleteDVF) p hcard a := by simpa using - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_algebraMap_C + 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 @@ -949,7 +967,7 @@ theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_X F.laurentImageSubfield p hcard π hπ) : K) = (π : K) := by simpa using - _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom_algebraMap_X + adicLaurentSeriesEvalHom_algebraMap_X (F := F.toCompleteDVF) p hcard π hπ /-- The image base field is nontrivially normed by the norm induced from the diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean index dae51260d2..531e2677d7 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/RangeRestrictedTopology.lean @@ -150,7 +150,7 @@ theorem mem_subfield_of_mrangeRestrict_isClosed_of_forall_valuationSubring_smodE Units.map MonoidWithZeroHom.ValueGroup₀.embedding.toMonoidHom gamma obtain ⟨N, hN⟩ := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_exists_uniformizer_pow_lt_unit F) + (mrangeRestrict_exists_uniformizer_pow_lt_unit F) hπ gamma' obtain ⟨z, hz, hzcongr⟩ := happrox N let zInt : F.valuationSubring := ⟨(z : K), hz⟩ @@ -367,7 +367,7 @@ theorem mrangeRestrict_properSpace_of_residueField_finite let : NontriviallyNormedField K := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have hcompact : CompactSpace 𝒪[K] := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_integer_compactSpace_of_residueField_finite F) + (mrangeRestrict_integer_compactSpace_of_residueField_finite F) unfold mrangeRestrictNontriviallyNormedField unfold Valued.toNontriviallyNormedField change @ProperSpace K @@ -399,7 +399,7 @@ theorem mrangeRestrict_completeSpace_of_residueField_finite let : NontriviallyNormedField K := (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrictNontriviallyNormedField F) have : ProperSpace K := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.mrangeRestrict_properSpace_of_residueField_finite F) + (mrangeRestrict_properSpace_of_residueField_finite F) exact complete_of_proper end CompleteDVF diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean index 170e73710f..2cf237d479 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/ValuationSubringUnits/UniformizerIntegerValuation.lean @@ -117,7 +117,7 @@ noncomputable def uniformizerValueExponent {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : ℤ := Classical.choose - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit F) hπ x) + ((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 @@ -128,7 +128,7 @@ theorem uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) x := Classical.choose_spec - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.exists_uniformizerValueUnit_zpow_eq_fieldUnitValueUnit F) hπ x) + ((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 @@ -141,7 +141,7 @@ noncomputable def multiplicativeIntegerValuationOfUniformizer map_one := by apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) hπ).1 - rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] simp map_mul x y := by apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) @@ -151,7 +151,7 @@ noncomputable def multiplicativeIntegerValuationOfUniformizer (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ (x * y) = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.fieldUnitValueUnit F) (x * y) := by - rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + 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)] @@ -161,8 +161,8 @@ noncomputable def multiplicativeIntegerValuationOfUniformizer (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit F) hπ ^ (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ y := by - rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F), - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + 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 + @@ -179,7 +179,7 @@ theorem multiplicativeIntegerValuationOfUniformizer_val (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) (x : Kˣ) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).val x = + ((multiplicativeIntegerValuationOfUniformizer F) hπ).val x = (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueExponent F) hπ x := rfl @@ -187,12 +187,12 @@ theorem multiplicativeIntegerValuationOfUniformizer_val theorem multiplicativeIntegerValuationOfUniformizer_isUniformizer (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).IsUniformizer + ((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 [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] ext simp [fieldUnitValueUnit, uniformizerValueUnit] @@ -201,7 +201,7 @@ valuation-subring unit group. -/ theorem multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup (F : CompleteDVF.{u, v} K) {π : F.valuationSubring} (hπ : F.valuation.IsUniformizer (π : K)) : - ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.multiplicativeIntegerValuationOfUniformizer F) hπ).zeroSubgroup = + ((multiplicativeIntegerValuationOfUniformizer F) hπ).zeroSubgroup = F.valuation.valuationSubring.unitGroup := by ext x rw [LocalFieldTheory.DiscreteValuationField.MultiplicativeIntegerValuation.mem_zeroSubgroup_iff, @@ -211,7 +211,7 @@ theorem multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup constructor · intro hx have hvalue := - (LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F) hπ x + (uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F) hπ x rw [hx, zpow_zero] at hvalue have hvalue' := congrArg (fun γ : F.ValueGroupˣ => (γ : F.ValueGroup)) hvalue @@ -219,7 +219,7 @@ theorem multiplicativeIntegerValuationOfUniformizer_zeroSubgroup_eq_unitGroup · intro hx apply ((LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_inj F) hπ).1 - rw [(LocalFieldTheory.DiscreteValuationField.CompleteDVF.uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] + rw [(uniformizerValueUnit_zpow_uniformizerValueExponent_eq_fieldUnitValueUnit F)] ext simp [fieldUnitValueUnit, hx] diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean index 0bb2060104..884368d8a9 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Different.lean @@ -128,7 +128,7 @@ theorem mem_codifferentSubmodule_iff_trace_mul_integral_of_finite_separable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := target_valuationSubring_isIntegralClosure_of_finite_separable base target exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.mem_codifferentSubmodule_iff_trace_mul_integral base target) + (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. -/ @@ -231,7 +231,7 @@ theorem differentIdealOfFiniteSeparable_ne_bot (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_ne_bot base target) @@ -288,7 +288,7 @@ theorem isIntegral_discriminant_mul_of_mem_codifferent_of_finite_separable let : IsIntegralClosure target.valuationSubring base.valuationSubring L := target_valuationSubring_isIntegralClosure_of_finite_separable base target exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.isIntegral_discriminant_mul_of_mem_codifferent base target) hb ha hz + (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 @@ -311,7 +311,7 @@ theorem maximalIdeal_not_dvd_differentIdealOfFiniteSeparable_iff_isUnramifiedAt (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact _root_.not_dvd_differentIdeal_iff /-- Finite-separable version of the ramified/different divisibility criterion, @@ -334,7 +334,7 @@ theorem maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact _root_.dvd_differentIdeal_iff omit [FiniteDimensional K L] in @@ -398,9 +398,9 @@ theorem isUnit_differentIdealOfFiniteSeparable_iff_isUnramifiedAt (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.isUnit_differentIdeal_iff_isUnramifiedAt base target) + (isUnit_differentIdeal_iff_isUnramifiedAt base target) omit [FiniteDimensional K L] in /-- States the theorem `differentIdeal_eq_top_iff_isUnramifiedAt`. -/ @@ -414,7 +414,7 @@ theorem differentIdeal_eq_top_iff_isUnramifiedAt Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by rw [← Ideal.isUnit_iff] exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.isUnit_differentIdeal_iff_isUnramifiedAt base target) + (isUnit_differentIdeal_iff_isUnramifiedAt base target) /-- Finite-separable version of the top/different criterion for unramifiedness. -/ @@ -435,9 +435,9 @@ theorem differentIdealOfFiniteSeparable_eq_top_iff_isUnramifiedAt (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdeal_eq_top_iff_isUnramifiedAt base target) + (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 @@ -492,7 +492,7 @@ theorem conductor_mul_differentIdealOfFiniteSeparable_eq_span_derivative moduleIsTorsionFree_target_valuationSubring_of_finite_separable (K := K) (L := L) (base := base) (target := target) exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.conductor_mul_differentIdeal_eq_span_derivative base target) z hz + (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. -/ @@ -512,7 +512,7 @@ theorem aeval_derivative_mem_differentIdealOfFiniteSeparable moduleIsTorsionFree_target_valuationSubring_of_finite_separable (K := K) (L := L) (base := base) (target := target) exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.aeval_derivative_mem_differentIdeal base target) z hz + (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 @@ -611,9 +611,9 @@ theorem maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact - (RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_pow_sub_one_dvd_differentIdeal base target) e hpow + (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 @@ -626,7 +626,7 @@ theorem maximalIdeal_pow_ramificationIndex_sub_one_dvd_differentIdealOfFiniteSep (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) := by refine - (RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable base target) + (maximalIdeal_pow_sub_one_dvd_differentIdealOfFiniteSeparable base target) (ramificationIndex base.toDVF target.toDVF) ?_ rw [ramificationIndex] exact Ideal.dvd_iff_le.mpr @@ -644,8 +644,8 @@ theorem maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationI base target) := by have hlower : target.maximalIdeal ^ (ramificationIndex base.toDVF target.toDVF - 1) ∣ - (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base target) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_pow_ramificationIndex_sub_one_dvd_differentIdealOfFiniteSeparable base target) + (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 : @@ -663,8 +663,9 @@ theorem not_isUnramifiedAt_of_one_lt_ramificationIndex_of_finite_separable (he : 1 < ramificationIndex base.toDVF target.toDVF) : ¬ Algebra.IsUnramifiedAt base.valuationSubring target.maximalIdeal := by exact - ((RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt base target)).1 - ((RamificationTheory.DiscreteValuationField.ValuedExtension.maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationIndex base target) he) + ((maximalIdeal_dvd_differentIdealOfFiniteSeparable_iff_not_isUnramifiedAt base target)).1 + ((maximalIdeal_dvd_differentIdealOfFiniteSeparable_of_one_lt_ramificationIndex + base target) he) section Tower @@ -711,7 +712,7 @@ theorem differentIdealOfFiniteSeparable_tower (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable middle target) * Ideal.map (algebraMap middle.valuationSubring target.valuationSubring) - (RamificationTheory.DiscreteValuationField.ValuedExtension.differentIdealOfFiniteSeparable base middle) := by + (differentIdealOfFiniteSeparable base middle) := by unfold differentIdealOfFiniteSeparable let : IsIntegralClosure middle.valuationSubring base.valuationSubring M := target_valuationSubring_isIntegralClosure_of_finite_separable base middle @@ -735,7 +736,7 @@ theorem differentIdealOfFiniteSeparable_tower (FractionRing target.valuationSubring) := FractionRing.liftAlgebra _ _ let : Algebra.IsSeparable (FractionRing base.valuationSubring) (FractionRing target.valuationSubring) := - (RamificationTheory.DiscreteValuationField.ValuedExtension.fractionRing_isSeparable_of_finite_separable base target) + (fractionRing_isSeparable_of_finite_separable base target) exact differentIdeal_tower base target end Tower diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean index 6a26958fd3..905a3b0925 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/GaloisValuation/AbsoluteGalois/FiniteExtensionCorrespondence.lean @@ -760,7 +760,6 @@ theorem quotientOpenSubgroupEquivGalOfNormalFiniteExtension_mk' /-- Rebase automorphisms over an embedded finite extension from `L` to its field range `i(L)`. -/ -/-- Identify automorphisms over a field with automorphisms fixing its embedded image. -/ def automorphismsOverFieldRangeEquiv (i : L →ₐ[K] AlgebraicClosure K) [Algebra L (AlgebraicClosure K)] (hmap : ∀ x, algebraMap L (AlgebraicClosure K) x = i x) : diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean index ec6929cc55..7761da6706 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/Herbrand/Quotient.lean @@ -242,7 +242,7 @@ theorem inverseHerbrandFunction_transportEquiv apply (herbrandFunction_strictMono (transportEquiv F e)).injective rw [herbrandFunction_inverseHerbrandFunction (transportEquiv F e)] - rw [(RamificationTheory.DiscreteValuationField.AntitoneNormalSubgroupFiltration.herbrandFunction_transportEquiv F)] + rw [(herbrandFunction_transportEquiv F)] rw [(herbrandFunction_inverseHerbrandFunction F)] /-- The quotient-image filtration, transported to any isomorphic model of diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean index 336ee9f02f..e3bc4ef06b 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Core.lean @@ -434,7 +434,8 @@ theorem IntegralClosureFiber.unique_of_includeRight_surjective_henselianRing_ker 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_surjective_henselianRing_ker base target) + (integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + base target) hsurj exact (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean index eb6332d70e..49e46bb294 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/FiniteExtension/Uniqueness.lean @@ -581,7 +581,8 @@ theorem IntegralClosureFiber.unique_of_includeRight_surjective_henselianRing_ker 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_surjective_henselianRing_ker base target) + (integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker + base target) hsurj exact (hasUniqueValuationExtension_of_integralClosure_base_maximal_fiber_subsingleton diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean index aa1ee63f8a..cf2a107e72 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/IntegralClosure.lean @@ -839,7 +839,7 @@ integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_h 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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_ker +theorem integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker [Algebra.IsSeparable K L] (hsurj : Function.Surjective @@ -1452,7 +1452,7 @@ integralClosure_base_maximal_fiber_idempotents_lift_of_includeRight_surjective_h 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_base_maximal_fiber_subsingleton_of_includeRight_surjective_henselianRing_ker +theorem integralClosure_maximal_fiber_subsingleton_of_includeRight_surjective_henselian_ker [Algebra.IsSeparable K L] (hsurj : Function.Surjective diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean index f37dc6ec1c..2d10bbfd85 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimit.lean @@ -1193,106 +1193,106 @@ noncomputable def unitsCompatibleFamiliesHomeomorph (dvrHigherUnitQuotientInverseLimitRepresentation π) let c := (dvrHigherUnitQuotientInverseLimitRepresentation π).toMonoidHom.comp (unitsToHigherUnitQuotientInverseLimit π) - refine + exact { toFun := fun u => c u invFun := fun q => e.symm q - left_inv := ?_ - right_inv := ?_ - continuous_toFun := ?_ - continuous_invFun := ?_ } - · 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 - · 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] - · 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) - · 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 + 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'.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 + (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. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean index e154fc51aa..a72b2da9cc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/Topology/AdicCompletionInverseLimitRing.lean @@ -696,7 +696,8 @@ noncomputable instance adicPositiveQuotientInverseLimit.instTopologicalSpace exact (adicPositiveQuotientInverseLimitCompatibleFamiliesEquiv I).topologicalSpace -/-- Identify the positive adic inverse limit with its compatible families of discrete coordinates. -/ +/-- Identify the positive adic inverse limit with its compatible families +of discrete coordinates. -/ noncomputable def adicPositiveQuotientInverseLimitRepresentationHomeomorph {R : Type*} [CommRing R] (I : Ideal R) : From 795dca406a83bed74076d988024971101a84e654 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 20:10:32 +0000 Subject: [PATCH 22/33] Repair ClassFieldTheory interfaces and remove unused assumptions --- .../Construction/FiniteNormQuotient.lean | 2 +- .../NormClassRelation.lean | 1 - .../Construction/UnitCohomologyAxiom.lean | 4 +- .../Reciprocity/Sylow.lean | 2 +- .../FiniteAbelianCompositum.lean | 1 - .../MathlibAbsoluteGaloisBaseEquiv.lean | 19 ++++--- .../Idele/SinglePlace.lean | 12 ++-- .../RayClass/Rational.lean | 2 +- .../HasseArf/InverseHerbrandFunction.lean | 1 - .../SupportedIdelePowerLocalUnitQuotient.lean | 3 +- .../ResidueAlgebraicClosureDegree.lean | 12 ++-- .../FiniteLevel/ChangedLevelCompositum.lean | 15 ++++- .../FiniteLevel/PrimitiveDisplacement.lean | 21 ++++--- .../DefectCorrection.lean | 8 ++- .../LubinTate/Padic/CompletedLevel.lean | 2 +- .../HerbrandLowDegree/BinaryProduct.lean | 8 +-- .../Herbrand/HerbrandLowDegree/Core.lean | 2 +- .../EqualCharacteristicLaurent.lean | 3 + .../MixedCharacteristicStructure/Core.lean | 5 +- .../DiscreteValuationField/Units.lean | 14 ++--- .../LocalField/GroupTheory/PowerIndex.lean | 55 +++++-------------- .../IdealQuotients.lean | 3 +- .../PrincipalUnitQuotients.lean | 3 +- .../ResidueUnits.lean | 4 +- .../Unramified/ArithmeticFrobenius.lean | 4 +- .../DecompositionFieldLocalization.lean | 7 +-- .../LocalizationRamificationGroups.lean | 2 +- .../DiscreteValuationField/Compositum.lean | 22 ++++---- 28 files changed, 110 insertions(+), 127 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean index 2e33f47173..1ced404d90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FiniteNormQuotient.lean @@ -288,7 +288,7 @@ def maximalUnramifiedToFiniteNormQuotient FiniteNormQuotient A K L hLK := D.maximalUnramifiedNormQuotientLift A K L (finiteNormClassHom A K L hLK) - (D.maximalUnramifiedNormSubgroup_le_finiteNormClassHom_ker 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean index 53a3b4e8dc..b25ccb576d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainMultiplicativity/NormClassRelation.lean @@ -151,7 +151,6 @@ 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 (K.field.toSubgroup ⧸ extensionSubgroup K.field L hLK)] [Finite ((D.maximalUnramifiedField K.field).toSubgroup ⧸ extensionSubgroup (D.maximalUnramifiedField K.field) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean index 5bf3777077..0e1f2ac710 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnitCohomologyAxiom.lean @@ -323,8 +323,8 @@ noncomputable def unitRepresentation letI := hnormal letI : Representation.IsTrivial ((v.unitRepresentationOverK E hnormal).ρ.comp - (extensionSubgroup E.base.field E.field.field E.below).subtype) := - v.unitRepresentationOverK_isTrivialOnExtension E hnormal + (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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean index 8ed045e905..8b0ef66abe 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Sylow.lean @@ -147,7 +147,7 @@ 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 : ℕ} [Fact p.Prime] + {p n : ℕ} (S : Sylow p (Multiplicative B)) (hn : Nat.Coprime n p) : Subgroup.toAddSubgroup' (S : Subgroup (Multiplicative B)) ≤ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean index 910384a0a5..252efc8490 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/FiniteAbelianCompositum.lean @@ -67,7 +67,6 @@ variable {Omega : Type v} [Field Omega] [Algebra K Omega] intermediate fields is again abelian Galois over the base. -/ theorem isAbelianGalois_sup (A B : IntermediateField K Omega) - [FiniteDimensional K A] [FiniteDimensional K B] [IsAbelianGalois K A] [IsAbelianGalois K B] : IsAbelianGalois K (A ⊔ B : IntermediateField K Omega) := by let M : IntermediateField K Omega := A ⊔ B diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean index 82621d42ff..2dfa41c11c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Galois/MathlibAbsoluteGaloisBaseEquiv.lean @@ -37,7 +37,8 @@ private theorem semilinear_symm_algebraMap (e : K ≃+* M) (E : Ω ≃+* Ψ) apply E.injective rw [E.apply_symm_apply, hE, e.apply_symm_apply] -private def semilinearGaloisConjugate (e : K ≃+* M) (E : Ω ≃+* Ψ) +/-- 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 @@ -47,12 +48,13 @@ private def semilinearGaloisConjugate (e : K ≃+* M) (E : Ω ≃+* Ψ) rw [semilinear_symm_algebraMap e E hE y, σ.commutes, hE, e.apply_symm_apply] -private def semilinearGaloisEquiv (e : K ≃+* M) (E : Ω ≃+* Ψ) +/-- 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 - (semilinear_symm_algebraMap e E hE) + (by exact semilinear_symm_algebraMap e E hE) left_inv σ := by apply AlgEquiv.ext intro x @@ -66,15 +68,16 @@ private def semilinearGaloisEquiv (e : K ≃+* M) (E : Ω ≃+* Ψ) intro x simp [semilinearGaloisConjugate, AlgEquiv.mul_apply] -private def semilinearGaloisContinuousEquiv (e : K ≃+* M) (E : Ω ≃+* Ψ) +/-- 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 := - RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + continuous_toFun := by + exact RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous e E hE (semilinearGaloisEquiv e E hE).toMonoidHom (by intro σ; rfl) - continuous_invFun := - RamificationTheory.Field.absoluteGaloisGroup.semilinear_conjugation_continuous + 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean index 8a84f80f96..245804c992 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SinglePlace.lean @@ -33,7 +33,7 @@ variable {K : Type*} [Field K] [NumberField K] open scoped Classical in /-- The dependent archimedean value which is `x` at `v` and `1` elsewhere. -/ -private def infinitePlaceValue +def infinitePlaceValue (v : InfinitePlace K) (x : v.Completionˣ) : (w : InfinitePlace K) → w.Completionˣ := @@ -196,7 +196,7 @@ def infinitePlaceIdeleClass open scoped Classical in /-- The dependent local value which is `x` at `v` and `1` elsewhere. -/ -private def finitePlaceValue +def finitePlaceValue (v : HeightOneSpectrum (𝓞 K)) (x : (v.adicCompletion K)ˣ) (w : HeightOneSpectrum (𝓞 K)) : @@ -315,7 +315,7 @@ variable open scoped Classical in /-- The dependent archimedean tensor value which is `z` at `v` and `1` elsewhere. -/ -private def relativeInfinitePlaceValue +def relativeInfinitePlaceValue (v : InfinitePlace K) (z : (v.Completion ⊗[K] L)ˣ) (w : InfinitePlace K) : @@ -343,7 +343,7 @@ private theorem relativeInfinitePlaceValue_of_ne open scoped Classical in /-- Restricted local tensor data supported at one archimedean place. -/ -private noncomputable def relativeInfinitePlaceData +noncomputable def relativeInfinitePlaceData (v : InfinitePlace K) (z : (v.Completion ⊗[K] L)ˣ) : RelativeLocalIdeleData (K := K) (L := L) where @@ -447,7 +447,7 @@ theorem relativeInfinitePlaceIdele_finiteComponent open scoped Classical in /-- The dependent local tensor value which is `z` at `v` and `1` elsewhere. -/ -private def relativeFinitePlaceValue +def relativeFinitePlaceValue (v : HeightOneSpectrum (𝓞 K)) (z : (v.adicCompletion K ⊗[K] L)ˣ) (w : HeightOneSpectrum (𝓞 K)) : @@ -475,7 +475,7 @@ private theorem relativeFinitePlaceValue_of_ne open scoped Classical in /-- Restricted local data supported at one finite place. -/ -private noncomputable def relativeFinitePlaceData +noncomputable def relativeFinitePlaceData (v : HeightOneSpectrum (𝓞 K)) (z : (v.adicCompletion K ⊗[K] L)ˣ) : RelativeLocalIdeleData (K := K) (L := L) where diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean index 7f1240452a..d7dbba0082 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/RayClass/Rational.lean @@ -139,7 +139,7 @@ abbrev rationalFractionalIdeal (I : FractionalIdealGroup ℚ) : open scoped Classical in /-- An arbitrary principal generator of a nonzero rational fractional ideal, before choosing its sign. -/ -private noncomputable def rawRationalIdealGenerator +noncomputable def rawRationalIdealGenerator (I : FractionalIdealGroup ℚ) : ℚ := Submodule.IsPrincipal.generator ((rationalFractionalIdeal I : FractionalIdeal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean index 752a67fe55..087188eab8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Definitions/HasseArf/InverseHerbrandFunction.lean @@ -33,7 +33,6 @@ def inverseHerbrandFunction (K : Type u) (L : Type v) [Field K] [Field L] [Algebra K L] [ValuativeRel K] [TopologicalSpace K] [ValuativeRel L] [TopologicalSpace L] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] (t : ℝ) : ℝ := Function.invFun (herbrandFunction K (ValuativeRel.valuation L).valuationSubring) t diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean index 4ee76af52c..4b553d41dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SupportedIdelePowerLocalUnitQuotient.lean @@ -30,7 +30,8 @@ namespace GlobalClassFieldTheory.ClassFieldAxiom variable {K : Type*} [Field K] [NumberField K] open scoped Classical in -private noncomputable def quotientEquivOfSurjectiveWithKernel +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean index 1ca8600d14..163a5ec139 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ResidueAlgebraicClosureDegree.lean @@ -45,18 +45,22 @@ variable (Omega : Type v) [Field Omega] [Algebra k Omega] [Algebra.IsAlgebraic k Omega] [IsAlgClosed Omega] omit [Fintype k] in -private instance finiteResidueBaseRingCharPrime [Finite k] : Fact (ringChar k).Prime := +/-- The finite residue base has prime characteristic. -/ +instance finiteResidueBaseRingCharPrime [Finite k] : Fact (ringChar k).Prime := ⟨CharP.char_is_prime k (ringChar k)⟩ -private instance residueAlgebraicClosureIsAlgClosure : IsAlgClosure k Omega := +/-- An algebraically closed algebraic residue extension is an algebraic closure. -/ +instance residueAlgebraicClosureIsAlgClosure : IsAlgClosure k Omega := ⟨inferInstance, inferInstance⟩ omit [Fintype k] in -private instance residueAlgebraicClosureIsGalois [Finite k] : IsGalois k Omega := by +/-- 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 -private instance residueAlgebraicClosureGaloisT2 : +/-- The residue absolute Galois group has a Hausdorff Krull topology. -/ +instance residueAlgebraicClosureGaloisT2 : T2Space (Omega ≃ₐ[k] Omega) := by infer_instance diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean index 26e4f3c4de..ab646aeb10 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/ChangedLevelCompositum.lean @@ -149,8 +149,19 @@ noncomputable def standardLubinTateChangedLevelCompositumCompleteDVF CompleteDVF.{u, 0} (standardLubinTateChangedLevelCompositumField hπ u n) := Classical.choose - (standardLubinTateChangedLevelCompositumCompleteDVFData_exists - hπ u n) + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean index 22c4d01909..8dab267f1c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/PrimitiveDisplacement.lean @@ -236,19 +236,22 @@ end FormalFactors section AnalyticValuation -private noncomputable local instance +/-- Use the discrete uniform structure on the coefficient valuation ring. -/ +noncomputable local instance standardLubinTatePrimitiveDisplacementCoefficientUniformSpace : UniformSpace F.valuationSubring := ⊥ -private noncomputable local instance +/-- 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 -private noncomputable local instance +/-- The target valuation ring is complete in its adic topology. -/ +noncomputable local instance standardLubinTatePrimitiveDisplacementTargetCompleteSpace (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : CompleteSpace @@ -257,7 +260,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 -private noncomputable local instance +/-- The target valuation ring has a Hausdorff adic topology. -/ +noncomputable local instance standardLubinTatePrimitiveDisplacementTargetT2Space (hπ : F.toCompleteDVF.valuation.IsUniformizer (π : K)) (n : ℕ) : T2Space @@ -266,7 +270,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).2 -private noncomputable local instance +/-- 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 @@ -783,13 +788,15 @@ theorem section ParameterDisplacement -private noncomputable local instance +/-- 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 -private noncomputable local instance +/-- 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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean index 3fdd417d0e..d2927c3802 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/DefectCorrection.lean @@ -156,7 +156,8 @@ private theorem exists_padicChangedUniformizerNormalizedDefect rcases hmem with ⟨b, hb⟩ exact ⟨b, hb.symm⟩ -private noncomputable def padicChangedUniformizerNormalizedDefect +/-- 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)) @@ -164,7 +165,10 @@ private noncomputable def padicChangedUniformizerNormalizedDefect (m : ℕ) : padicCompletedUnramifiedWittRing p := Classical.choose - (exists_padicChangedUniformizerNormalizedDefect p u H hH m) + (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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean index ef50b4ba88..fbbf53142d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -245,7 +245,7 @@ noncomputable def padicCompletedPrimitiveRoot Polynomial.rootOfSplits (Polynomial.SplittingField.splits (padicCompletedPrimitivePolynomial p n)) - (padicCompletedPrimitivePolynomial_map_degree_ne_zero 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. -/ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index b2ee1fa84e..20e945507c 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -184,9 +184,7 @@ theorem herbrandHMinusOneProdFinite (herbrandHMinusOneProdEquiv A B σ).symm.toEquiv /-- Cardinality of degree-zero Tate cohomology for a binary product. -/ -theorem herbrandH0Prod_card - [Finite (HerbrandH0 G A)] - [Finite (HerbrandH0 G B)] : +theorem herbrandH0Prod_card : letI : Finite (HerbrandH0 G (A × B)) := herbrandH0ProdFinite A B Nat.card (HerbrandH0 G (A × B)) = @@ -198,9 +196,7 @@ theorem herbrandH0Prod_card /-- Cardinality of degree-minus-one Tate cohomology for a binary product. -/ theorem herbrandHMinusOneProd_card - (σ : G) - [Finite (HerbrandHMinusOne G A σ)] - [Finite (HerbrandHMinusOne G B σ)] : + (σ : G) : letI : Finite (HerbrandHMinusOne G (A × B) σ) := herbrandHMinusOneProdFinite A B σ Nat.card (HerbrandHMinusOne G (A × B) σ) = diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean index 907337693d..826b04f741 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean @@ -41,7 +41,7 @@ variable [MulDistribMulAction G A] [MulDistribMulAction G B] low-degree multiplicative Tate quotients. The finiteness assumptions prevent `Nat.card` from silently taking the value `0` on infinite quotients. -/ noncomputable def herbrandQuotient (σ : G) - [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] : ℚ := + : ℚ := (Nat.card (HerbrandH0 G A) : ℚ) / (Nat.card (HerbrandHMinusOne G A σ) : ℚ) /-- The Herbrand quotient is definitionally the ratio `#H⁰ / #H^{-1}`. -/ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index 2f60dafe7b..dbe33c3af2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -906,6 +906,9 @@ noncomputable def laurentSeriesEquivLaurentImageSubfield (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) = diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean index 5b507b2f4d..d78196ce33 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/MixedCharacteristicStructure/Core.lean @@ -498,8 +498,6 @@ noncomputable def chosenMixedFirstPrincipalUnitAlgebraicData letI hTModule : Module R T := Submodule.module T letI : Finite T := exactData.finiteTorsion letI hqAddGroup : AddGroup q := inferInstance - have hcyclic : IsAddCyclic T := - isAddCyclic_principalUnit_torsion F.toCompleteDVF R let tproj : T →ₗ[R] q := exactData.torsionProjection have hqP : IsPGroup p (Multiplicative q) := F.discretePrincipalUnitQuotient_isPGroup n @@ -513,7 +511,8 @@ noncomputable def chosenMixedFirstPrincipalUnitAlgebraicData { a := a moduleFinite := exactData.moduleFinite finiteTorsion := exactData.finiteTorsion - cyclicTorsion := hcyclic + cyclicTorsion := by + exact isAddCyclic_principalUnit_torsion F.toCompleteDVF R cardTorsion := hcard finrankFree := exactData.finrankFree } diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean index b924e4675d..515cdf4df2 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/Units.lean @@ -444,8 +444,7 @@ noncomputable instance principalUnitGradedPieceFinite /-- Cardinality bridge between the adjacent named subquotient and the graded piece wrapper. -/ theorem card_principalUnitSubquotient_succ_eq_gradedPiece - (n : ℕ) [(U.principalUnitSubgroup (n + 1)).Normal] - : + (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 @@ -835,10 +834,7 @@ 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] - [Finite (U.principalUnitSubgroupClassInQuotient l n)] - [Finite (U.principalUnitSubgroupClassInQuotient m n)] - [Finite (U.principalUnitSubgroupClassInQuotient l m)] : + [(U.principalUnitSubgroup m).Normal] : Nat.card (U.principalUnitSubgroupClassInQuotient l n) = Nat.card (U.principalUnitSubgroupClassInQuotient m n) * Nat.card (U.principalUnitSubgroupClassInQuotient l m) := by @@ -861,8 +857,7 @@ theorem card_principalUnitClassInQuotient_eq_mul_of_le {l m n : ℕ} /-- Cardinality form of the class/subquotient identification. -/ theorem card_principalUnitSubquotient_eq_classInQuotient_of_le - {m n : ℕ} (hmn : m ≤ n) [(U.principalUnitSubgroup n).Normal] - [Finite (U.principalUnitSubgroupClassInQuotient m n)] : + {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 @@ -870,8 +865,7 @@ theorem card_principalUnitSubquotient_eq_classInQuotient_of_le /-- The degenerate subquotient `U^n/U^n` has cardinality one. -/ theorem card_principalUnitSubquotient_self - (n : ℕ) - : + (n : ℕ) : Nat.card (U.principalUnitSubquotient n n) = 1 := by have htop : (U.principalUnitSubgroup n).subgroupOf diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean index c42a40382d..c46819cb38 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/GroupTheory/PowerIndex.lean @@ -222,9 +222,7 @@ theorem cardinal_mk_nthPowerKernelProduct (n : ℕ) : Cardinal.mk_congr (nthPowerKernelProductEquiv G H n).toEquiv /-- Cardinality form of `nthPowerKernelProductEquiv`. -/ -theorem card_nthPowerKernelProduct (n : ℕ) - [Finite ((powMonoidHom n : G →* G).ker)] - [Finite ((powMonoidHom n : H →* H).ker)] : +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 @@ -234,10 +232,7 @@ theorem card_nthPowerKernelProduct (n : ℕ) /-- 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) - [Finite ((powMonoidHom n : G →* G).ker)] - [Finite ((powMonoidHom n : H →* H).ker)] - [Finite ((powMonoidHom n : U →* U).ker)] : + (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 @@ -354,9 +349,7 @@ theorem cardinal_mk_nthPowerProductQuotient (n : ℕ) : /-- 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 : ℕ) - [Finite (G ⧸ (powMonoidHom n : G →* G).range)] - [Finite (H ⧸ (powMonoidHom n : H →* H).range)] : +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 @@ -366,10 +359,7 @@ theorem card_nthPowerProductQuotient (n : ℕ) /-- 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) - [Finite (G ⧸ (powMonoidHom n : G →* G).range)] - [Finite (H ⧸ (powMonoidHom n : H →* H).range)] - [Finite (U ⧸ (powMonoidHom n : U →* U).range)] : + (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 @@ -458,9 +448,7 @@ theorem cardinal_mk_multiplicativeInt_nthPowerQuotient (n : ℕ) : /-- For nonzero `n`, the multiplicative-integer power quotient has cardinality `n`. -/ theorem card_multiplicativeInt_nthPowerQuotient - {n : ℕ} (hn : n ≠ 0) - [Finite (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative - ℤ)).range)] : + {n : ℕ} (hn : n ≠ 0) : Nat.card (Multiplicative ℤ ⧸ (powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).range) = n := by @@ -506,8 +494,7 @@ theorem finite_multiplicativeInt_nthPowerKernel /-- The kernel of a nonzero power map on multiplicative integers has one element. -/ theorem card_multiplicativeInt_nthPowerKernel - {n : ℕ} (hn : n ≠ 0) - [Finite ((powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker)] : + {n : ℕ} (hn : n ≠ 0) : Nat.card ((powMonoidHom n : (Multiplicative ℤ) →* (Multiplicative ℤ)).ker) = 1 := by rw [powMonoidHom_ker_multiplicativeInt_eq_bot (n := n) hn] simp @@ -515,12 +502,9 @@ theorem card_multiplicativeInt_nthPowerKernel /-- 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 ℤ) - [Finite (G ⧸ (powMonoidHom n : G →* G).range)] - [Finite (U ⧸ (powMonoidHom n : U →* U).range)] : + {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 - let := finite_multiplicativeInt_nthPowerQuotient hn calc Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = Nat.card ((U × Multiplicative ℤ) ⧸ @@ -553,12 +537,9 @@ theorem cardinal_mk_nthPowerQuotient_eq_of_mulEquiv_units_prod_int /-- 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 ℤ) - [Finite ((powMonoidHom n : G →* G).ker)] - [Finite ((powMonoidHom n : U →* U).ker)] : + {n : ℕ} (hn : n ≠ 0) (e : G ≃* U × Multiplicative ℤ) : Nat.card ((powMonoidHom n : G →* G).ker) = Nat.card ((powMonoidHom n : U →* U).ker) := by - let := finite_multiplicativeInt_nthPowerKernel hn rw [card_nthPowerKernel_eq_mul_of_mulEquiv_prod G U (Multiplicative ℤ) n e] rw [card_multiplicativeInt_nthPowerKernel hn, Nat.mul_one] @@ -658,9 +639,7 @@ noncomputable instance finite_multiplicative_nthPowerQuotient /-- Cardinality/index form of `powMonoidHom_range_multiplicative_eq_nsmulAddSubgroup_toSubgroup`. -/ theorem card_multiplicative_nthPowerQuotient_eq_nsmulAddSubgroup_index - (n : ℕ) - [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative - A)).range)] : + (n : ℕ) : Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) = (nsmulAddSubgroup A n).index := by @@ -672,9 +651,7 @@ theorem card_multiplicative_nthPowerQuotient_eq_nsmulAddSubgroup_index /-- 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 : ℕ) - [Finite (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range)] - [Finite (A ⧸ nsmulAddSubgroup A n)] : + (n : ℕ) : Nat.card (Multiplicative A ⧸ (powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).range) = Nat.card (A ⧸ nsmulAddSubgroup A n) := by @@ -770,9 +747,7 @@ end AdditiveProducts /-- Cardinality form of the multiplicative/additive kernel translation. -/ theorem card_multiplicative_nthPowerKernel_eq_nsmulAddKernel - (n : ℕ) - [Finite ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker)] - [Finite (nsmulAddKernel A n)] : + (n : ℕ) : Nat.card ((powMonoidHom n : (Multiplicative A) →* (Multiplicative A)).ker) = Nat.card (nsmulAddKernel A n) := by rw [powMonoidHom_ker_multiplicative_eq_nsmulAddKernel_toSubgroup] @@ -811,9 +786,7 @@ theorem cardinal_mk_nthPowerQuotient_eq_additive_nsmulQuotient_of_mulEquiv /-- 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) - [Finite (G ⧸ (powMonoidHom n : G →* G).range)] - [Finite (A ⧸ nsmulAddSubgroup A n)] : + (n : ℕ) (e : G ≃* Multiplicative A) : Nat.card (G ⧸ (powMonoidHom n : G →* G).range) = Nat.card (A ⧸ nsmulAddSubgroup A n) := by rw [Nat.card_congr @@ -823,9 +796,7 @@ theorem card_nthPowerQuotient_eq_additive_nsmulQuotient_of_mulEquiv /-- 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) - [Finite ((powMonoidHom n : G →* G).ker)] - [Finite (nsmulAddKernel A n)] : + (n : ℕ) (e : G ≃* Multiplicative A) : Nat.card ((powMonoidHom n : G →* G).ker) = Nat.card (nsmulAddKernel A n) := by rw [Nat.card_congr diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean index b9626e4355..6ea614b6ef 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/IdealQuotients.lean @@ -900,8 +900,7 @@ theorem principalUnitsSuccQuotUniformizerCoordAddHom_eq_zero_iff_mem_maximalIdea /-- 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) - [Finite (PrincipalUnitsSuccQuot K n)] : + [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) diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean index e68731a6e7..4c11e0c183 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/PrincipalUnitQuotients.lean @@ -636,8 +636,7 @@ theorem principalUnitsSuccQuotMk_mem_range /-- 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) - [Finite (PrincipalUnitsSuccQuot K n)] : + (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 ?_ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean index 157b6e39be..7645408960 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/ResidueUnits.lean @@ -336,9 +336,7 @@ def integerUnitsModPrincipalUnitsIsoResidueUnits /-- Cardinality statement transported from the quotient equivalence with residue units. -/ theorem integerUnitsModPrincipalUnits_card_eq_residueUnits_card - (K : Type u) [Field K] [ValuativeRel K] - [Finite (IntegerUnitsModPrincipalUnits K)] - [Finite (ResidueUnits K)] : + (K : Type u) [Field K] [ValuativeRel K] : Nat.card (IntegerUnitsModPrincipalUnits K) = Nat.card (ResidueUnits K) := Nat.card_congr (integerUnitsModPrincipalUnitsEquivResidueUnits K).toEquiv diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index 1d45f54371..e2604018a4 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -211,8 +211,8 @@ noncomputable def padicCyclotomicUnramifiedGalIntegerRingEquiv have hclosure : W = (integralClosure V L).toSubring := by change Wv.toSubring = (integralClosure Vv L).toSubring exact hclosureVv - letI : IsIntegralClosure W V L := - padicCyclotomicUnramified_isIntegralClosure_of_subring_eq V W hclosure + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean index 457d7d917b..3f182a6b03 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/DecompositionFieldLocalization.lean @@ -58,11 +58,8 @@ local instance proposition98CompletionBaseSMul : SMul K w.1.Completion := local instance proposition98CompletionAlgebra : Algebra vK.Completion w.1.Completion := AbsoluteValue.completionAlgebra vK w.1 w.2 -private abbrev localization : IntermediateField vK.Completion w.1.Completion := - AbsoluteValue.algebraicLocalization vK w.1 w.2 - -private abbrev toLocalization : L →+* localization vK w := - AbsoluteValue.toAlgebraicLocalization 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) := diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index 6fb969cb6b..79a0e3c131 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -101,7 +101,7 @@ def localizationRamificationGroupsAbsoluteValueDecompositionGroupEquiv : (absoluteValueExtensionValuationSubring vK w hw) where toFun sigma := ⟨(sigma : L ≃ₐ[K] L), - mem_extensionValuationSubring_smul vK (hvK := hvK) w hw sigma⟩ + by exact mem_extensionValuationSubring_smul vK (hvK := hvK) w hw sigma⟩ invFun sigma := by refine ⟨(sigma : L ≃ₐ[K] L), ?_⟩ intro x diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean index 12d1bb34fc..d074e47e0f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Valuation/DiscreteValuationField/Compositum.lean @@ -562,11 +562,11 @@ theorem finiteDimensional_compositum_over_right_of_left 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 both factors are +/-- 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 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' @@ -588,7 +588,7 @@ theorem finiteDimensional_compositum_over_left /-- 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 K'] : + [FiniteDimensional K L] : FiniteDimensional K' (L ⊔ K' : IntermediateField K Ω) := by exact finiteDimensional_sup_over_right_of_left L K' @@ -603,7 +603,7 @@ theorem finiteDimensional_sup_over_left the degree of `L / K`. -/ theorem compositum_finrank_over_right_le_left (L K' : IntermediateField K Ω) - [FiniteDimensional K L] [FiniteDimensional K K'] : + [FiniteDimensional K K'] : Module.finrank K' (IntermediateField.extendScalars (show K' ≤ L ⊔ K' from le_sup_right)) ≤ Module.finrank K L := by @@ -627,7 +627,7 @@ theorem compositum_finrank_over_right_le_left /-- 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] [FiniteDimensional K K'] : + [FiniteDimensional K L] : Module.finrank L (IntermediateField.extendScalars (show L ≤ L ⊔ K' from le_sup_left)) ≤ Module.finrank K K' := by @@ -650,7 +650,7 @@ theorem compositum_finrank_over_left_le_right /-- Common-top form of the degree bound for `L ⊔ K' / K'`. -/ theorem sup_finrank_over_right_le_left (L K' : IntermediateField K Ω) - [FiniteDimensional K L] [FiniteDimensional K K'] : + [FiniteDimensional K K'] : Module.finrank K' (L ⊔ K' : IntermediateField K Ω) ≤ Module.finrank K L := by have hformula : @@ -675,7 +675,7 @@ theorem sup_finrank_over_right_le_left /-- 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] [FiniteDimensional K K'] : + [FiniteDimensional K L] : Module.finrank L (L ⊔ K' : IntermediateField K Ω) ≤ Module.finrank K K' := by have hformula : @@ -843,7 +843,7 @@ theorem compositum_finrank_over_left_eq_right_of_linearDisjoint disjointness. -/ theorem sup_finrank_over_right_eq_left_of_linearDisjoint (L K' : IntermediateField K Ω) - [FiniteDimensional K L] [FiniteDimensional K K'] + [FiniteDimensional K K'] (hlin : L.LinearDisjoint K') : Module.finrank K' (L ⊔ K' : IntermediateField K Ω) = Module.finrank K L := by @@ -869,7 +869,7 @@ theorem sup_finrank_over_right_eq_left_of_linearDisjoint disjointness. -/ theorem sup_finrank_over_left_eq_right_of_linearDisjoint (L K' : IntermediateField K Ω) - [FiniteDimensional K L] [FiniteDimensional K K'] + [FiniteDimensional K L] (hlin : L.LinearDisjoint K') : Module.finrank L (L ⊔ K' : IntermediateField K Ω) = Module.finrank K K' := by @@ -932,7 +932,7 @@ theorem sup_finrank_over_left_eq_right_of_finrank_coprime 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 finite +/-- 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. @@ -940,7 +940,7 @@ 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] [FiniteDimensional K K'] + [FiniteDimensional K L] [Algebra.IsSeparable K L] : Algebra.IsSeparable K' (L ⊔ K' : IntermediateField K Ω) := by have : Algebra.FormallyUnramified K L := From c74f410bd2043d683462a0818e426bd0b4c0274b Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 20:33:31 +0000 Subject: [PATCH 23/33] Repair ClassField public interfaces and owned import index --- LeanPool.lean | 2 -- .../Degree/FrobeniusFixedField.lean | 10 +++--- .../Construction/CoreFrobeniusNorm.lean | 20 +++++------ .../Construction/UnramifiedNormQuotient.lean | 5 +-- .../HenselianValuationBase.lean | 14 ++++---- .../LocalReciprocity/LocalResidueDatum.lean | 6 ++-- .../SeparableFixedFieldNorm.lean | 4 +-- .../LocalReciprocity/TateTransport.lean | 10 +++--- .../FormalModule/LubinTateEndomorphism.lean | 3 +- .../FiniteLevel/HigherUnitLevelEquiv.lean | 11 +++---- .../IntertwinerConstruction.lean | 9 +++-- .../LubinTate/Padic/CompletedLevel.lean | 33 +++++++++++++++---- .../Cyclic/Herbrand/HerbrandFiniteness.lean | 6 ++-- .../FieldUnitStructure.lean | 6 ++-- .../Unramified/ArithmeticFrobenius.lean | 20 +++++------ .../LocalizationRamificationGroups.lean | 2 +- 16 files changed, 90 insertions(+), 71 deletions(-) diff --git a/LeanPool.lean b/LeanPool.lean index 520fc86ebe..8e7c68ab18 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -2211,8 +2211,6 @@ public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.F 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.AmbientPrimeTarget -public import LeanPool.ClassFieldTheory.ClassFieldTheory.LocalClassFieldTheory.Finite.LocalReciprocity.FixedFieldIntrinsicReciprocity.AmbientPrimeTargetComparison 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean index c618dedbc4..14a13af64e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Degree/FrobeniusFixedField.lean @@ -143,7 +143,7 @@ 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] [T2Space A] + [IsTopologicalGroup A] [CompactSpace A] [TotallyDisconnectedSpace A] (f : A →ₜ* ZHatMul) (x : A) (hxgen : TopologicallyGenerates ({x} : Set A)) @@ -698,7 +698,7 @@ theorem frobeniusClosureDegree_range (D : DegreeData G) 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] [T2Space G] + [IsTopologicalGroup G] [CompactSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] @@ -712,7 +712,7 @@ theorem frobeniusClosureDegree_range_index (D : DegreeData G) /-- The value of `d_K` on `Γ`, regarded in the subgroup `n ℤ̂`. -/ def frobeniusClosureDegreeInMulNatRange (D : DegreeData G) - [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [IsTopologicalGroup G] [CompactSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] @@ -851,7 +851,7 @@ theorem fixedFieldNormalizedDegree_surjective (D : DegreeData G) /-- The closed cyclic group `Γ` is totally disconnected. -/ theorem frobeniusClosure_totallyDisconnectedSpace (D : DegreeData G) - [IsTopologicalGroup G] [CompactSpace G] [T2Space G] + [IsTopologicalGroup G] [CompactSpace G] [TotallyDisconnectedSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) @@ -872,7 +872,7 @@ theorem frobeniusClosure_totallyDisconnectedSpace (D : DegreeData G) `Γ = 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] [T2Space G] + [IsTopologicalGroup G] [CompactSpace G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) [hLnormal : (extensionSubgroup K.field L hLK).Normal] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean index dcce769c6b..8a9cd0cfa2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CoreFrobeniusNorm.lean @@ -92,7 +92,7 @@ theorem maximalUnramifiedExtension_finite (D : DegreeData G) /-- The actual quotient `G(\widetilde L/\widetilde K)` is the kernel of `d_K` inside `G(\widetilde L/K)`. -/ -private noncomputable def inertiaCosetToDegreeKernel (D : DegreeData G) +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] : @@ -170,7 +170,7 @@ noncomputable def inertiaQuotientDegreeKernelEquiv (D : DegreeData G) (D.maximalUnramifiedField_mono hLK)) ≃ (D.extensionNormalizedDegreeContinuous K L hLK).toMonoidHom.ker := Equiv.ofBijective (D.inertiaCosetToDegreeKernel K L hLK) - (D.inertiaCosetToDegreeKernel_bijective K L hLK) + (by exact D.inertiaCosetToDegreeKernel_bijective K L hLK) end DegreeData @@ -480,7 +480,7 @@ namespace DegreeData /-- Quotient projection identifies the actual cosets `G_K/G_Σ` with the cosets of `Γ` in `G(\widetilde L/K)`. -/ -private noncomputable def frobeniusFixedCosetToClosureCoset +noncomputable def frobeniusFixedCosetToClosureCoset (D : DegreeData G) [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) @@ -527,7 +527,7 @@ private theorem frobeniusFixedCosetToClosureCoset_bijective QuotientGroup.mk q rw [hk] -/-- Defines `frobeniusFixedCosetClosureEquiv`. -/ +/-- 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) @@ -541,7 +541,7 @@ noncomputable def frobeniusFixedCosetClosureEquiv (D.frobeniusClosure K L hLK σ).toSubgroup) := Equiv.ofBijective (D.frobeniusFixedCosetToClosureCoset K L hLK σ) - (D.frobeniusFixedCosetToClosureCoset_bijective 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) @@ -580,7 +580,7 @@ private theorem frobeniusClosure_inf_degreeKernel (D : DegreeData G) /-- Candidate enumeration of the cosets of `Γ`: an inertia element followed by one of the first `n=d_K(σ)` powers of a degree-one Frobenius. -/ -private def kernelPowerCosetMap (D : DegreeData G) [IsTopologicalGroup G] +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] @@ -764,11 +764,11 @@ noncomputable def kernelPowerCosetEquiv (D : DegreeData G) ((K.field.toSubgroup ⧸ D.extensionInertiaWithin K.field L hLK) ⧸ (D.frobeniusClosure K L hLK σ).toSubgroup) := Equiv.ofBijective (D.kernelPowerCosetMap K L hLK φ σ) - (D.kernelPowerCosetMap_bijective K L hLK φ σ hφ) + (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`. -/ -private noncomputable def frobeniusNormIdentityCosetMap (D : DegreeData G) +noncomputable def frobeniusNormIdentityCosetMap (D : DegreeData G) [IsTopologicalGroup G] (K : FiniteResidueAbstractField D) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) @@ -870,7 +870,7 @@ private theorem frobeniusNormIdentityCosetMap_bijective (D : DegreeData G) _ = eSigma q := hp exact ⟨hinj, hsurj⟩ -/-- Defines `frobeniusNormIdentityCosetEquiv`. -/ +/-- 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] @@ -890,7 +890,7 @@ noncomputable def frobeniusNormIdentityCosetEquiv (D : DegreeData G) extensionSubgroup K.field (D.frobeniusFixedField K L hLK σ) (D.frobeniusFixedField_le K L hLK σ)) := Equiv.ofBijective (D.frobeniusNormIdentityCosetMap K L hLK φ σ) - (D.frobeniusNormIdentityCosetMap_bijective K L hLK φ σ hφ) + (by exact D.frobeniusNormIdentityCosetMap_bijective K L hLK φ σ hφ) end DegreeData diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean index a6bfd16e58..9aa2b7dce5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/UnramifiedNormQuotient.lean @@ -184,7 +184,8 @@ private theorem valueModulo_eq_zero_iff ((QuotientAddGroup.mk' (nsmulWithin v.valueGroup n)) (n • w)) = 0 rw [hq, map_zero] -private def unramifiedValuationHom +/-- 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) @@ -236,7 +237,7 @@ def unramifiedNormQuotientValuation ZMod ((FiniteAbstractFieldExtension.ofInclusion L K hLK).degree : ℕ) := finiteNormQuotientLift A K.field L hLK (v.unramifiedValuationHom K L hLK) - (v.finiteNormSubgroup_le_unramifiedValuationHom_ker K L hLK hUnramified) + (by exact v.finiteNormSubgroup_le_unramifiedValuationHom_ker K L hLK hUnramified) /-- Establishes the identity `v.unramifiedNormQuotientValuation K L hLK hUnramified (finiteNormClass A diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean index 6537f44ed5..44c112ce40 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/HenselianValuationBase.lean @@ -36,18 +36,15 @@ section variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] -private abbrev G := Gal(SeparableClosure K/K) - -private abbrev A : Rep ℤ (G K) := - galoisAmbientUnitsRep K (SeparableClosure K) - /-- `Kˣ` is the coefficient group fixed by the distinguished base subgroup of the absolute separable Galois group. -/ def baseFieldUnitsEquiv : - Additive Kˣ ≃+ ambientFixedAddSubgroup (A K) (baseField (G K)) := + Additive Kˣ ≃+ ambientFixedAddSubgroup + (galoisAmbientUnitsRep K (SeparableClosure K)) (baseField Gal(SeparableClosure K/K)) := (baseUnitsEquivGaloisAmbientFixed K (SeparableClosure K)).trans (AddEquiv.addSubgroupCongr - (congrArg (ambientFixedAddSubgroup (A K)) + (congrArg + (ambientFixedAddSubgroup (galoisAmbientUnitsRep K (SeparableClosure K))) (closedFixingSubgroup_bot_eq_baseField K (SeparableClosure K)))) omit [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] in @@ -69,7 +66,8 @@ theorem baseFieldUnitsEquiv_val (x : Kˣ) : /-- The normalized valuation `v_K : Kˣ → ℤ`, embedded in `ℤ̂` and written on the actual fixed coefficient group. -/ def localBaseValuation : - ambientFixedAddSubgroup (A K) (baseField (G K)) →+ ZHat := + 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index a5aa8e636c..bcf374d60c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -76,7 +76,7 @@ local instance localSeparableClosureScalarTower : /-- 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. -/ -private noncomputable def localAbsoluteValuationSubring : +noncomputable def localAbsoluteValuationSubring : ValuationSubring (AlgebraicClosure K) := Classical.choose (ValuationTheory.DiscreteValuationField.Valuation.exists_extension_valuationSubring @@ -191,7 +191,7 @@ theorem localSeparableDecompositionGroup_eq_top : /-- When the decomposition subgroup is top, the valuation ring on the decomposition field is the original local valuation ring. -/ -private noncomputable def localBaseValuationSubringEquivDecompositionField : +noncomputable def localBaseValuationSubringEquivDecompositionField : (localCompleteDVF K).valuationSubring ≃+* decompositionFieldValuationSubring K (localSeparableValuationSubring K) := by @@ -401,7 +401,7 @@ noncomputable def localSeparableResidueAlgAction : residueAlgActionOfEqTop K (localSeparableValuationSubring K) (localSeparableDecompositionGroup_eq_top K) - continuous_toFun := localSeparableResidueAlgAction_continuous K + continuous_toFun := by exact localSeparableResidueAlgAction_continuous K /-- Every automorphism of the selected residue extension lifts to the separable Galois group. -/ theorem localSeparableResidueAlgAction_surjective : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean index 8ee4a7752f..9872c75623 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -152,8 +152,8 @@ def baseFixingCosetEquivAlgHom (closedFixingSubgroup K Ω E) (fixingSubgroupLeBase K Ω E)) ≃ (E →ₐ[K] Ω) := Equiv.ofBijective (baseFixingCosetToAlgHom K Ω E) - ⟨baseFixingCosetToAlgHom_injective K Ω E, - baseFixingCosetToAlgHom_surjective 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean index 5fd30e927a..c88e83aaed 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TateTransport.lean @@ -75,9 +75,8 @@ def normHomCompSubResEquivIso let Ares : Rep R Q := Rep.res e.toMonoidHom A let i : ModuleCat.of R Ares.V ≅ ModuleCat.of R A.V := Iso.refl _ - refine ShortComplex.isoMk i i i ?_ ?_ - · simpa [Ares, i] using (res_norm_eq e A).symm - · rfl + 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. -/ @@ -89,9 +88,8 @@ def subCompNormHomResEquivIso let Ares : Rep R Q := Rep.res e.toMonoidHom A let i : ModuleCat.of R Ares.V ≅ ModuleCat.of R A.V := Iso.refl _ - refine ShortComplex.isoMk i i i ?_ ?_ - · rfl - · simpa [Ares, i] using (res_norm_eq e A).symm + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean index 1af63112ee..865c746b59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/LubinTateEndomorphism.lean @@ -61,7 +61,8 @@ private theorem addMonoidEnd_sum_apply change f i x + (∑ j ∈ s, f j) x = f i x + ∑ j ∈ s, f j x rw [ih] -private instance equalCharacteristicLaurentCharP +/-- 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 := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean index 5e992a680a..d743ed839f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/FiniteLevel/HigherUnitLevelEquiv.lean @@ -1394,13 +1394,10 @@ noncomputable def standardLubinTateHigherUnitChangedLevelAlgEquiv IntermediateField.restrictAlgEquiv (le_sup_left : L ≤ M) let changedEquiv : L' ≃ₐ[K] changedLevel := IntermediateField.restrictAlgEquiv (le_sup_right : L' ≤ M) - have heq : changedLevel = oldLevel := by - exact - standardLubinTateHigherUnit_restrict_changedLevel_eq_originalLevel - hπ u n hu - exact - changedEquiv.trans - ((IntermediateField.equivOfEq heq).trans oldEquiv.symm) + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean index 52ebde00df..ac19a0e5a4 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/ChangedUniformizerIntertwiner/IntertwinerConstruction.lean @@ -25,18 +25,23 @@ open LocalFieldTheory.DiscreteValuationField open LocalFieldTheory.DiscreteValuationField.Examples.Qp open SameUniformizer -private structure PadicChangedUniformizerApproximation +/-- 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) -private noncomputable def padicChangedUniformizerApproximation +/-- Successive higher-degree corrections to the linear changed-uniformizer series. -/ +noncomputable def padicChangedUniformizerApproximation (p : ℕ) [Fact p.Prime] (u : (padicLocalField p).valuationSubringˣ) : ℕ → PadicChangedUniformizerApproximation p u diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean index fbbf53142d..72cbe8458c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedLevel.lean @@ -327,7 +327,23 @@ actual integral closure over the Witt valuation ring. -/ noncomputable def padicCompletedLevelCompleteDVF (p : ℕ) [Fact p.Prime] (n : ℕ) : CompleteDVF.{0, 0} (padicCompletedLevelField p n) := - Classical.choose (padicCompletedLevelCompleteDVFData_exists 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. -/ @@ -469,20 +485,23 @@ theorem padicCompletedPrimitiveRootInteger_mem_maximalIdeal (IsLocalRing.maximalIdeal.isMaximal target.valuationSubring).isPrime.mem_of_pow_mem _ hlambdaPow' -private noncomputable local instance (priority := 50) +/-- 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) := ⊥ -private noncomputable local instance +/-- 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 -private noncomputable local instance +/-- The completed-level valuation ring is complete for its maximal-ideal topology. -/ +noncomputable local instance padicCompletedLevelTargetCompleteSpace (p : ℕ) [Fact p.Prime] (n : ℕ) : CompleteSpace @@ -491,7 +510,8 @@ private noncomputable local instance have hadic : IsAdic target.maximalIdeal := rfl exact (hadic.isAdicComplete_iff.mp target.isAdicComplete).1 -private noncomputable local instance +/-- The completed-level maximal-ideal topology is Hausdorff. -/ +noncomputable local instance padicCompletedLevelTargetT2Space (p : ℕ) [Fact p.Prime] (n : ℕ) : T2Space @@ -541,7 +561,8 @@ theorem padicCompletedLevelWittCoefficientHom_continuous Continuous (padicCompletedLevelWittCoefficientHom p n) := continuous_of_discreteTopology -private noncomputable local instance +/-- 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) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean index 2d801e44d3..7853fc6653 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean @@ -382,7 +382,7 @@ theorem herbrandQuotient_multiplicative_of_left_right_defined [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : ∃ hB : HerbrandQuotientDefined G B σ, - @herbrandQuotient G B _ _ _ _ σ hB.1 hB.2 = + herbrandQuotient (G := G) (A := B) σ = herbrandQuotient (G := G) (A := A) σ * herbrandQuotient (G := G) (A := C) σ := by let hA : HerbrandQuotientDefined G A σ := ⟨inferInstance, inferInstance⟩ @@ -411,7 +411,7 @@ theorem herbrandQuotient_multiplicative_of_left_middle_defined ∃ hC : HerbrandQuotientDefined G C σ, herbrandQuotient (G := G) (A := B) σ = herbrandQuotient (G := G) (A := A) σ * - @herbrandQuotient G C _ _ _ _ σ hC.1 hC.2 := by + 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 @@ -437,7 +437,7 @@ theorem herbrandQuotient_multiplicative_of_middle_right_defined [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : ∃ hA : HerbrandQuotientDefined G A σ, herbrandQuotient (G := G) (A := B) σ = - @herbrandQuotient G A _ _ _ _ σ hA.1 hA.2 * + 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⟩ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean index 667c14e969..f8e1efd682 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/FieldUnitStructure.lean @@ -32,7 +32,7 @@ namespace LocalField variable {K : Type u} [Field K] -open CompleteDVF.higherPrincipalUnitGroup renaming +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation → fieldUnitsEquivUniformizerRootsPrincipalUnits in /-- The local-field structure theory, the mixed-characteristic field-unit structure theorem. In @@ -80,7 +80,7 @@ noncomputable def chosenFieldUnitsStructureMixedCharacteristic (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic]))) e⟩ -open CompleteDVF.higherPrincipalUnitGroup renaming +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation → adicPrincipalUnitsContinuousAddEquivUnderlyingOfWithZeroValuation in /-- The exact principal-unit factor in the equal-characteristic field-unit structure theorem, @@ -123,7 +123,7 @@ noncomputable def chosenFirstPrincipalUnitStructureEqualCharacteristic I.symm.trans E exact LocalFieldTheory.DiscreteValuationField.continuousMulEquivOfAdditiveTarget eAdd -open CompleteDVF.higherPrincipalUnitGroup renaming +open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.higherPrincipalUnitGroup renaming fieldUnitsContinuousMulEquivUniformizerRootsPrincipalUnitsOfWithZeroValuation → fieldUnitsEquivUniformizerRootsPrincipalUnits in /-- The local-field structure theory, the equal-characteristic field-unit structure theorem. In diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean index e2604018a4..8c1188280f 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/Cyclotomic/Unramified/ArithmeticFrobenius.lean @@ -387,12 +387,12 @@ noncomputable def padicCyclotomicUnramifiedGalResidueAlgEquiv letI : Algebra k ell := padicCyclotomicUnramifiedResidueAlgebra vK vL hExt let eW := padicCyclotomicUnramifiedGalIntegerRingEquiv vK vL hExt hhens σ let eell : ell ≃+* ell := IsLocalRing.ResidueField.mapEquiv eW - apply AlgEquiv.ofRingEquiv - 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) + 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 @@ -553,8 +553,8 @@ 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 ζ := - padicCyclotomicUnramified_primitiveRoot_isIntegral + let hζint : IsIntegral k ζ := by + exact padicCyclotomicUnramified_primitiveRoot_isIntegral (padicCyclotomicUnramified_order_pos hpn) hζ letI : FiniteDimensional k ell := IntermediateField.adjoin.finiteDimensional hζint @@ -1697,8 +1697,8 @@ theorem padicCyclotomicUnramified (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 := - padicCyclotomicUnramified_finiteDimensional_of_primitiveRoot_adjoin_eq_top + 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index 79a0e3c131..1d761c3a77 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -170,7 +170,7 @@ def localizationRamificationGroupsLocalDecompositionGroupEquiv : RamificationTheory.HilbertRamification.ValuationSubring.decompositionGroup vK.Completion (algebraicLocalizationValuationSubring vK w hw) where toFun tau := - ⟨tau, local_mem_localizationValuationSubring_smul + ⟨tau, by exact local_mem_localizationValuationSubring_smul vK (hvK := hvK) w hw tau⟩ invFun tau := tau left_inv tau := rfl From c8be34176586e085bd8cafb1f6d38046568ff953 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 20:40:18 +0000 Subject: [PATCH 24/33] Finish residue and localization proof boundaries --- .../LocalReciprocity/LocalResidueDatum.lean | 34 +++++++++---------- .../Cyclic/Herbrand/HerbrandFiniteness.lean | 6 ++-- .../EqualCharacteristicLaurent.lean | 7 ---- .../LocalizationRamificationGroups.lean | 5 +-- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean index bcf374d60c..c2d38b6565 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/LocalResidueDatum.lean @@ -206,9 +206,23 @@ noncomputable def localBaseValuationSubringEquivDecompositionField : let eKZ : K ≃ₐ[K] Z := (IntermediateField.botEquiv K (SeparableClosure K)).symm.trans (IntermediateField.equivOfEq hZ.symm) - refine - { toFun := fun x => ⟨eKZ (x : K), ?_⟩ - invFun := fun z => ⟨eKZ.symm (z : Z), ?_⟩ + 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) @@ -221,20 +235,6 @@ noncomputable def localBaseValuationSubringEquivDecompositionField : map_mul' := fun x y => by apply Subtype.ext exact map_mul eKZ (x : K) (y : K) } - · 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 - · 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 /-- The residue field in the residue-action exact sequence is canonically the finite residue field of the original local field. -/ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean index 7853fc6653..d96e1d0873 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandFiniteness.lean @@ -381,7 +381,7 @@ theorem herbrandQuotient_multiplicative_of_left_right_defined (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : - ∃ hB : HerbrandQuotientDefined G B σ, + ∃ _ : HerbrandQuotientDefined G B σ, herbrandQuotient (G := G) (A := B) σ = herbrandQuotient (G := G) (A := A) σ * herbrandQuotient (G := G) (A := C) σ := by @@ -408,7 +408,7 @@ theorem herbrandQuotient_multiplicative_of_left_middle_defined (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite (HerbrandH0 G A)] [Finite (HerbrandHMinusOne G A σ)] [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] : - ∃ hC : HerbrandQuotientDefined G C σ, + ∃ _ : HerbrandQuotientDefined G C σ, herbrandQuotient (G := G) (A := B) σ = herbrandQuotient (G := G) (A := A) σ * herbrandQuotient (G := G) (A := C) σ := by @@ -435,7 +435,7 @@ theorem herbrandQuotient_multiplicative_of_middle_right_defined (σ : G) (hgen : ∀ g : G, g ∈ Subgroup.zpowers σ) [Finite (HerbrandH0 G B)] [Finite (HerbrandHMinusOne G B σ)] [Finite (HerbrandH0 G C)] [Finite (HerbrandHMinusOne G C σ)] : - ∃ hA : HerbrandQuotientDefined G A σ, + ∃ _ : HerbrandQuotientDefined G A σ, herbrandQuotient (G := G) (A := B) σ = herbrandQuotient (G := G) (A := A) σ * herbrandQuotient (G := G) (A := C) σ := by diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean index dbe33c3af2..29835a48fc 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/DiscreteValuationField/EqualCharacteristicLaurent.lean @@ -836,7 +836,6 @@ 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. -/ @@ -851,7 +850,6 @@ noncomputable def laurentImageSubfield open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent (adicLaurentSeriesEvalHom) in - /-- Establishes the membership statement `CompleteDVF.EqualCharacteristicLaurent.adicLaurentSeriesEvalHom (F := F.toCompleteDVF) p hcard π @@ -872,7 +870,6 @@ theorem adicLaurentSeriesEval_mem_laurentImageSubfield 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] @@ -893,7 +890,6 @@ theorem laurentImageSubfield_eq_top 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] @@ -908,7 +904,6 @@ noncomputable def laurentSeriesEquivLaurentImageSubfield open _root_.LocalFieldTheory.DiscreteValuationField.CompleteDVF.EqualCharacteristicLaurent (adicLaurentSeriesEvalHom) in - /-- Establishes the identity `((F.laurentSeriesEquivLaurentImageSubfield p hcard π hπ x : F.laurentImageSubfield p hcard π hπ) : K) = @@ -929,7 +924,6 @@ hπ x`. 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) @@ -953,7 +947,6 @@ theorem laurentSeriesEquivLaurentImageSubfield_algebraMap_C 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 diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean index 1d761c3a77..8865372232 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/Ramification/HilbertRamification/LocalizationRamificationGroups.lean @@ -170,8 +170,9 @@ def localizationRamificationGroupsLocalDecompositionGroupEquiv : 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⟩ + ⟨tau, by + exact local_mem_localizationValuationSubring_smul + vK (hvK := hvK) w hw tau⟩ invFun tau := tau left_inv tau := rfl right_inv tau := by From dcb924db5b22e4aba4c9294ade6b6890bbf2c450 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 21:26:14 +0000 Subject: [PATCH 25/33] Preserve class field interfaces across public module boundaries --- .../CanonicalUnramifiedNormQuotient.lean | 3 +- .../FrobeniusPowerFixedField.lean | 3 +- .../Construction/MainFiniteReciprocity.lean | 8 ++-- .../Construction/MainNaturality.lean | 4 +- .../Construction/MainTransfer.lean | 2 +- .../Reciprocity/MaximalUnramifiedSymbol.lean | 2 +- .../AdeleBaseChange.lean | 6 ++- .../Idele/ClassGroup/AlgEquiv.lean | 2 +- .../Idele/PositiveArchimedeanSection.lean | 8 ++-- .../Idele/SufficientlyLarge.lean | 4 +- .../HilbertClassFieldComparison.lean | 8 ++-- .../BigActual.lean | 2 +- .../SmallActual.lean | 2 +- .../MathlibFrobeniusHilbertComparison.lean | 4 +- .../RayClassFieldRealization.lean | 2 +- .../SmallHilbertClassFieldMathlibArtin.lean | 4 +- .../SmallHilbertTowerConjugation.lean | 6 ++- .../SmallHilbertTowerRealization.lean | 7 +++- .../AbstractFixedFieldGlobalNormResidue.lean | 4 +- .../NumberFieldComplexification.lean | 9 ++-- .../CyclotomicIdeleClassValuation.lean | 2 +- .../CyclotomicTorsionFixedField.lean | 4 +- .../Reciprocity/InfiniteGlobalArtin.lean | 6 ++- .../InfiniteGlobalArtinDescent.lean | 5 +-- .../Reciprocity/InfinitePlaceArtin.lean | 3 +- .../FinitePadicCyclicData.lean | 2 +- .../Reciprocity/PowerResidueReciprocity.lean | 4 +- .../RationalCyclotomicFinitePlaceArtin.lean | 24 +++++++---- ...ationalCyclotomicPrincipalAwayProduct.lean | 7 +++- ...ionalQuadraticPowerResidueReciprocity.lean | 4 +- .../RationalRayClassFieldCyclotomic.lean | 2 +- .../ClassFormation/IntegerUnitsHerbrand.lean | 4 +- .../ClassFormation/ValuationHerbrand.lean | 6 +-- .../LubinTateUniformizerDiagonal.lean | 30 ++++++++++++- .../ConcreteReciprocityCanonical.lean | 15 ++++--- .../ConcreteReciprocityTransport.lean | 9 ++-- .../FiniteResidueFinrankTransfer.lean | 42 +++++++++---------- .../FixedFieldRelativeNorm.lean | 4 +- .../TopologicalReciprocity.lean | 6 +-- .../Infinite/FiniteReciprocityDiagram.lean | 3 +- .../LocalHilbertPairingNondegeneracy.lean | 7 ++-- .../Kummer/MaximalLocalKummerPairing.lean | 4 +- .../LubinTateTransport.lean | 2 +- .../Unramified/CanonicalExtension.lean | 8 +--- .../CompletedLevel/ChangedCompletedLevel.lean | 2 +- .../CompletedLevel/CompletedLevel.lean | 8 ++-- .../CompletedLevel/ThetaAtCompletedLevel.lean | 2 +- .../DivisionModuleEndomorphisms.lean | 6 ++- .../NormSubgroup/HigherUnitLevelMapFixed.lean | 2 +- .../Ramification/PrimitivePoint.lean | 27 ++++++++++-- .../Theta/ThetaCoefficients.lean | 12 +++--- .../Padic/CompletedPrimitiveAction.lean | 3 +- .../Dedekind/PadicValuationInertia.lean | 24 +++++------ .../HerbrandLowDegree/BinaryProduct.lean | 4 -- .../Herbrand/HerbrandLowDegree/Core.lean | 6 +-- .../Cyclic/Herbrand/Permutation/Module.lean | 16 +++---- .../LocalField/Padic/UnitDecomposition.lean | 4 +- 57 files changed, 237 insertions(+), 172 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean index 6f5ca06052..90d5e76c59 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/CanonicalUnramifiedNormQuotient.lean @@ -128,8 +128,7 @@ def canonicalUnramifiedNormQuotientValuation ZMod (E.degree : ℕ) := finiteNormQuotientLift A E.base.field E.field.field E.below (v.canonicalUnramifiedValuationHom E) - (v.finiteNormSubgroup_le_canonicalUnramifiedValuationHom_ker - E hUnramified) + (by exact v.finiteNormSubgroup_le_canonicalUnramifiedValuationHom_ker E hUnramified) /-- Valuation sends a finite norm class to its canonical unramified quotient value. -/ @[simp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean index d3f3b7033c..8f9bdd6570 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/FrobeniusPowerFixedField.lean @@ -152,8 +152,7 @@ def frobeniusPowerOfDegreeOne (D : DegreeData G) (hφ : D.frobeniusExponent K L hLK φ = 1) (n : ℕ) (hn : 0 < n) : D.FrobeniusElements K L hLK := ⟨φ.1 ^ n, - ⟨n, hn, D.extensionNormalizedDegree_pow_of_degreeOne - K L hLK φ hφ 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean index d5372121d3..7551fdf341 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainFiniteReciprocity.lean @@ -649,7 +649,7 @@ private theorem finiteReciprocityCandidate_add_of_mul /-- The finite reciprocity equivalence with the semigroup-additivity input isolated. The final theorem discharges this input directly from reciprocity multiplicativity. -/ -private def finiteReciprocityHom_of_mul +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) @@ -665,9 +665,9 @@ private def finiteReciprocityHom_of_mul 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' := D.finiteReciprocityCandidate_zero A v K L hLK - map_add' := D.finiteReciprocityCandidate_add_of_mul - A v K L hLK hmul + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index a1eb4d51e7..f05633f73c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -440,8 +440,8 @@ def finiteReciprocityNaturalityNormMap 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)) := - finiteReciprocityNaturality_tower_finite K K' L' hK'K hL'K' + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean index 0306e2815d..a8f3d688e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainTransfer.lean @@ -576,7 +576,7 @@ variable {G : Type u} [Group G] [TopologicalSpace G] /-- A fixed choice of right-coset representatives for the intermediate subgroup in `G(L/K)`. -/ -private noncomputable def chosenTransferNormNaturalityRightTransversal +noncomputable def chosenTransferNormNaturalityRightTransversal (K K' L : ClosedSubgroup G) (hLK' : L.toSubgroup ≤ K'.toSubgroup) (hK'K : K'.toSubgroup ≤ K.toSubgroup) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean index 4e19d80360..e59b27726a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/MaximalUnramifiedSymbol.lean @@ -226,7 +226,7 @@ def finiteUnramifiedDegreeHom (L.toFiniteAbstractExtension.degree : ℕ) L.toFiniteAbstractExtension.degree.property).comp (D.normalizedDegree K)).toMonoidHom) - (finiteUnramifiedDegreeHom_killsExtension D K L hUnramified)).comp + (by exact finiteUnramifiedDegreeHom_killsExtension D K L hUnramified)).comp L.extensionQuotientMulEquiv.toMonoidHom /-- diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index 063b8208be..33e3a22615 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -851,8 +851,10 @@ noncomputable def relativeAdeleBaseChangeRingEquiv : (K := K) (L := L) y w] rw [(relativeFiniteTensorPiRingEquiv (K := K) (L := L)).apply_symm_apply] - map_add' := relativeAdeleToAdele_map_add - map_mul' := relativeAdeleToAdele_map_mul + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index 5252564893..aacb716383 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -1053,7 +1053,7 @@ variable fields in a finite extension. The coefficient-ring equivalence is kept explicit so the inverse uses that exact equivalence rather than a second choice. -/ -private noncomputable def relativeAdeleMapOfCompatibleEquiv +noncomputable def relativeAdeleMapOfCompatibleEquiv (eK : K ≃ₐ[ℚ] K') (eA : NumberField.AdeleRing (𝓞 K) K ≃+* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean index 8792fc2bbe..35e30208bc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/PositiveArchimedeanSection.lean @@ -36,7 +36,7 @@ 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. -/ -private noncomputable def positiveArchimedeanLocalComponent +noncomputable def positiveArchimedeanLocalComponent (v : InfinitePlace K) : ℝ≥0ˣ →* v.Completionˣ := by by_cases hv : v.IsReal @@ -56,7 +56,7 @@ private noncomputable def positiveArchimedeanLocalComponent open scoped Classical in /-- The positive local archimedean component, with its natural continuity. -/ -private noncomputable def positiveArchimedeanLocalComponentContinuous +noncomputable def positiveArchimedeanLocalComponentContinuous (v : InfinitePlace K) : ℝ≥0ˣ →ₜ* v.Completionˣ where __ := positiveArchimedeanLocalComponent v @@ -239,7 +239,7 @@ private theorem positiveArchimedeanLocalComponent_mem_positive open scoped Classical in /-- The positive root needed to compensate for the multiplicity of the chosen infinite place. -/ -private noncomputable def positiveArchimedeanRoot : +noncomputable def positiveArchimedeanRoot : ℝ≥0ˣ →* ℝ≥0ˣ := Units.map (NNReal.rpowMonoidHom @@ -247,7 +247,7 @@ private noncomputable def positiveArchimedeanRoot : open scoped Classical in /-- The positive root map used in the archimedean section is continuous. -/ -private noncomputable def positiveArchimedeanRootContinuous : +noncomputable def positiveArchimedeanRootContinuous : ℝ≥0ˣ →ₜ* ℝ≥0ˣ where __ := positiveArchimedeanRoot (K := K) continuous_toFun := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean index d90c6034f0..496f9d484e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/SufficientlyLarge.lean @@ -41,7 +41,7 @@ variable {K : Type*} [Field K] [NumberField K] namespace IdeleGroup /-- A chosen idele representing an ordinary ideal class. -/ -private def classRepresentative (c : ClassGroup (𝓞 K)) : +def classRepresentative (c : ClassGroup (𝓞 K)) : IdeleGroup K := Classical.choose (idealClass_surjective (K := K) c) @@ -53,7 +53,7 @@ private theorem idealClass_classRepresentative /-- A finite set outside which the chosen representative of `c` is integral. -/ -private def classRepresentativeSupport (c : ClassGroup (𝓞 K)) : +def classRepresentativeSupport (c : ClassGroup (𝓞 K)) : Finset (HeightOneSpectrum (𝓞 K)) := Classical.choose (exists_finset_supportedAt diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean index 77cb526bd4..2f076afdca 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldComparison.lean @@ -294,13 +294,11 @@ def bigToSmallHilbertKernelEquivNarrowClassKernel : toFun q := ⟨bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K) q.1, - bigHilbertQuotientEquiv_mem_narrowClassKernel - (K := K) q⟩ + by exact bigHilbertQuotientEquiv_mem_narrowClassKernel (K := K) q⟩ invFun c := ⟨(bigHilbertClassFieldQuotientEquivNarrowClassGroup (K := K)).symm c.1, - bigHilbertQuotientEquiv_symm_mem_bigToSmallKernel - (K := K) c⟩ + by exact bigHilbertQuotientEquiv_symm_mem_bigToSmallKernel (K := K) c⟩ left_inv q := by apply Subtype.ext exact @@ -333,7 +331,7 @@ def realSignToNarrowClassKernel : MonoidHom.ker (RayClass.narrowToClassGroup (K := K)) where toFun s := ⟨RayClass.signToNarrow (K := K) s, - signToNarrow_mem_narrowClassKernel (K := K) s⟩ + by exact signToNarrow_mem_narrowClassKernel (K := K) s⟩ map_one' := by apply Subtype.ext exact map_one (RayClass.signToNarrow (K := K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean index 29af99c908..7dea118eb1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/BigActual.lean @@ -57,7 +57,7 @@ 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. -/ -private noncomputable def bigHilbertClassFieldReciprocityData : +noncomputable def bigHilbertClassFieldReciprocityData : {e : Gal((bigHilbertClassField K)/(bigHilbertClassFieldBase K)) ≃* RayClass.NarrowClassGroup K // ∀ c : IdeleClassGroup (bigHilbertClassFieldBase K), diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean index c90bbd7a27..7d2a2bc50a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/HilbertClassFieldReciprocity/SmallActual.lean @@ -57,7 +57,7 @@ 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. -/ -private noncomputable def smallHilbertClassFieldReciprocityData : +noncomputable def smallHilbertClassFieldReciprocityData : {e : Gal((smallHilbertClassField K)/(smallHilbertClassFieldBase K)) ≃* ClassGroup (𝓞 K) // ∀ c : IdeleClassGroup (smallHilbertClassFieldBase K), diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean index 31fec13f48..1c81dbe364 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/MathlibFrobeniusHilbertComparison.lean @@ -742,8 +742,8 @@ noncomputable def smallHilbertClassFieldEquivOfIsSmall E ≃ₐ[K] GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K := by let H := GlobalClassFieldTheory.GlobalClassFields.smallHilbertClassField K - let f := Classical.choice - (nonempty_algHom_to_selectedSmallHilbertClassField K E hE.1) + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean index c8bf6e55f6..136c0c24e3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/RayClassFieldRealization.lean @@ -624,7 +624,7 @@ 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. -/ -private def rayClassGroupInvHom (m : RayClass.Modulus K) : +def rayClassGroupInvHom (m : RayClass.Modulus K) : RayClass.RayClassGroup m →* RayClass.RayClassGroup m where toFun := Inv.inv map_one' := inv_one diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean index 8089294c5c..e34dcd1f29 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SmallHilbertClassFieldMathlibArtin.lean @@ -63,7 +63,9 @@ theorem smallHilbertClassField_ideleClassNorm_range_of_isSmall (K := K) open scoped Classical in -private noncomputable def arithmeticHilbertClassGroupEquivOfNormRange +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean index ee0d4cc555..cc8193d4fc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerConjugation.lean @@ -269,7 +269,8 @@ theorem finiteNormSubgroup_map_conjugateFixed exact (conjugateFixedAddEquiv A L s).apply_symm_apply b] -private noncomputable def rebaseFiniteAbelianSubextension +/-- 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' := @@ -284,7 +285,8 @@ private theorem rebaseFiniteAbelianSubextension_field cases h rfl -private noncomputable def rebaseFixedCodomainHom +/-- 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') diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean index 9c86f8c214..dd4d7df574 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/IdealClassFieldTheory/SmallHilbertTowerRealization.lean @@ -84,7 +84,9 @@ variable (L : FiniteAbelianSubextension K.field) open scoped Classical in -private noncomputable abbrev smallHilbertTowerMiddleFiniteAbstractField : +/-- 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 @@ -432,7 +434,8 @@ private noncomputable def exact hB ▸ raw open scoped Classical in -private noncomputable def rebaseFiniteGaloisSubextension +/-- 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) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean index 1e98b1d19b..641afe1860 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/AbstractFixedFieldGlobalNormResidue.lean @@ -1358,7 +1358,7 @@ noncomputable def abstractFixedFieldGlobalNormResidueEquiv : /-- The abstract finite norm-residue equivalence with its dependent source instance fixed to the public finite norm quotient. -/ -private noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : +noncomputable def abstractFixedFieldFiniteNormResidueGaloisEquiv : FiniteNormQuotient rationalIdeleClassRepresentation K.field L.field L.below ≃+ Additive @@ -1426,7 +1426,7 @@ noncomputable def ambientFixedGlobalNormResidueAddMonoidHom : /-- The ordinary idele class group of the lower fixed field, transported to the fixed part of the rational absolute idele-class representation. -/ -private noncomputable def abstractFixedFieldIdeleClassToAmbientFixedMonoidHom : +noncomputable def abstractFixedFieldIdeleClassToAmbientFixedMonoidHom : let F := abstractFixedField ℚ (SeparableClosure ℚ) K.field IdeleClassGroup F →* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean index 28cafcbdd6..eedf7b3496 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/ComplexificationArtin/NumberFieldComplexification.lean @@ -31,7 +31,8 @@ attribute [local instance] rationalComplexificationCyclotomicField_isAbelianGalois open scoped Classical in -private def rationalComplexificationAmbientField : +/-- The rational complexification field lifted into the rational separable closure. -/ +def rationalComplexificationAmbientField : IntermediateField ℚ (SeparableClosure ℚ) := by letI : Algebra ℚ KummerTheory.rationalCyclotomicField := DivisionRing.toRatAlgebra @@ -164,7 +165,8 @@ noncomputable def numberFieldComplexificationRestriction : (numberFieldComplexification F) open scoped Classical in -private def numberFieldComplexificationBaseLayer : +/-- The chosen copy of the base number field inside its complexification. -/ +def numberFieldComplexificationBaseLayer : IntermediateField ℚ (numberFieldComplexification F) := (numberFieldInRationalSeparableClosure F).restrict (show numberFieldInRationalSeparableClosure F ≤ @@ -172,7 +174,8 @@ private def numberFieldComplexificationBaseLayer : le_sup_left) open scoped Classical in -private def numberFieldComplexificationCyclotomicLayer : +/-- The rational complexification layer inside the complexification of a number field. -/ +def numberFieldComplexificationCyclotomicLayer : IntermediateField ℚ (numberFieldComplexification F) := rationalComplexificationAmbientField.restrict (show diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean index 60e9738c81..177cd58d89 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicIdeleClassValuation.lean @@ -60,7 +60,7 @@ attribute [local instance] cyclotomicValuationIdeleClassCommGroup 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. -/ -private noncomputable def ideleClassContinuousQuotientLift +noncomputable def ideleClassContinuousQuotientLift {A B : Type*} [Group A] [TopologicalSpace A] [Group B] [TopologicalSpace B] (N : Subgroup A) [N.Normal] (f : A →ₜ* B) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean index 6bc61c1cf0..42f6a96849 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicTorsionFixedField.lean @@ -54,7 +54,9 @@ open scoped IsMulCommutative open KummerTheory open ClassFormation -private noncomputable def rationalCyclotomicTorsionRestrictionEquiv : +/-- 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 ≃ₜ* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean index 76c91bd249..882883d910 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtin.lean @@ -45,7 +45,8 @@ theorem rationalInfinitePlace_isReal exact Rat.isReal_infinitePlace open scoped Classical in -private noncomputable def rationalPositiveArchimedeanLocalComponent +/-- A positive real unit viewed in an archimedean completion of the rational field. -/ +noncomputable def rationalPositiveArchimedeanLocalComponent (v : InfinitePlace ℚ) : ℝ≥0ˣ →* v.Completionˣ := (Units.mapEquiv @@ -54,7 +55,8 @@ private noncomputable def rationalPositiveArchimedeanLocalComponent (Units.map NNReal.toRealHom.toMonoidHom) open scoped Classical in -private noncomputable def rationalPositiveArchimedeanInfinitePart : +/-- 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean index 48a0338f40..a49347f1dd 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfiniteGlobalArtinDescent.lean @@ -118,9 +118,8 @@ noncomputable def infiniteGlobalIdeleClassArtinContinuousMonoidHom : toMonoidHom := infiniteGlobalIdeleClassArtinMonoidHom (K := K) (Ω := Ω) - continuous_toFun := - infiniteGlobalIdeleClassArtinMonoidHom_continuous - (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean index 6be3c81211..0182d4fb01 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/InfinitePlaceArtin.lean @@ -48,7 +48,8 @@ section Galois variable [IsGalois K L] open scoped Classical in -private noncomputable def ramifiedInfinitePlaceConjugation +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean index e29ea329ef..34c26cba1d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/LocalGlobalArtinCompatibility/FinitePadicCyclicData.lean @@ -87,7 +87,7 @@ local instance numberFieldTowerBaseSubgroupCompactSpace : (numberFieldTowerBaseSubgroup K L).isClosed'.isCompact /-- Inclusion of a subgroup equipped with its subtype topology. -/ -private def continuousSubgroupSubtype +def continuousSubgroupSubtype {A : Type*} [Group A] [TopologicalSpace A] (H : Subgroup A) : H →ₜ* A where toMonoidHom := H.subtype diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index f195019226..8351144db6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -120,8 +120,8 @@ noncomputable def finitePlacePrimeResidueEquivLocalResidue finitePlaceLocalArtinCompletionIsNonarchimedeanLocalField v (𝓞 K ⧸ v.asIdeal) ≃+* 𝓀[C] := by let a := HeightOneSpectrum.adicAbv K v - let ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := - finitePlaceAdicAbv_nonarchimedeanAbsoluteValue K v + have ha : LubinTate.Valuations.NonarchimedeanAbsoluteValue a := by + exact finitePlaceAdicAbv_nonarchimedeanAbsoluteValue K v let C := a.Completion letI : ValuativeRel C := finitePlaceLocalArtinCompletionValuativeRel v diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean index 2d079a344c..16bcf1a00d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicFinitePlaceArtin.lean @@ -1025,21 +1025,25 @@ private theorem rationalCyclotomicLevel_galEquivZMod_eq_unitOfCoprime simpa using hPowers open scoped Classical in -private abbrev rationalCyclotomicArtinPlace (q : Nat.Primes) : +/-- 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 -private abbrev rationalCyclotomicArtinBaseAbv (q : Nat.Primes) : +/-- 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 -private abbrev rationalCyclotomicArtinLevel (m : ℕ+) := +/-- The rational cyclotomic extension at a positive integral level. -/ +abbrev rationalCyclotomicArtinLevel (m : ℕ+) := KummerTheory.rationalCyclotomicLevel m open scoped Classical in -private abbrev rationalCyclotomicArtinExtension +/-- The chosen extension of a rational finite-place absolute value to a cyclotomic level. -/ +abbrev rationalCyclotomicArtinExtension (m : ℕ+) (q : Nat.Primes) : AbsoluteValueExtension (rationalCyclotomicArtinBaseAbv q) @@ -1049,7 +1053,8 @@ private abbrev rationalCyclotomicArtinExtension (rationalCyclotomicArtinPlace q) open scoped Classical in -private abbrev rationalCyclotomicArtinLocalizedField +/-- 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) @@ -1469,12 +1474,14 @@ private abbrev rationalCyclotomicPrincipalPrimePlace rationalCyclotomicArtinPlace p open scoped Classical in -private abbrev rationalCyclotomicPrincipalPrimeLevel +/-- The rational cyclotomic level used in the principal-prime completion comparison. -/ +abbrev rationalCyclotomicPrincipalPrimeLevel (m : ℕ+) := rationalCyclotomicArtinLevel m open scoped Classical in -private abbrev rationalCyclotomicPrincipalPrimeExtension +/-- The chosen absolute-value extension used in the principal-prime completion comparison. -/ +abbrev rationalCyclotomicPrincipalPrimeExtension (m : ℕ+) (p : Nat.Primes) := rationalCyclotomicArtinExtension m p @@ -2695,7 +2702,8 @@ private noncomputable def rationalCyclotomicChosenArithmeticFrobenius (rationalCyclotomicArtinUnramified m q hq) open scoped Classical in -private noncomputable abbrev rationalCyclotomicArtinLocalInput +/-- 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ˣ := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean index b82f486742..1c8a91bd31 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalCyclotomicPrincipalAwayProduct.lean @@ -110,7 +110,9 @@ noncomputable local instance attribute [local instance] rationalCyclotomicPrincipalLevelIsAbelianGalois open scoped Classical in -private noncomputable def rationalCyclotomicPrincipalHeightOneArtinInput +/-- 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 @@ -142,7 +144,8 @@ private theorem rationalCyclotomicPrincipalHeightOneArtinInput_spec rfl open scoped Classical in -private noncomputable def rationalCyclotomicPrincipalHeightOneCharacter +/-- 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))ˣ := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean index 60f51b9077..30b9c940a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/RationalQuadraticPowerResidueReciprocity.lean @@ -67,7 +67,9 @@ open scoped Classical in def rationalTwoPrime : Nat.Primes := ⟨2, Nat.prime_two⟩ open scoped Classical in -private noncomputable def rationalTwoAdicCompletionToIndexedPadic : +/-- 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)] := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean index f83673a837..ca5a57d17d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/KroneckerWeber/RationalRayClassFieldCyclotomic.lean @@ -624,7 +624,7 @@ theorem rationalCyclotomicPrimeArithmeticFrobenius_galEquivZMod 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 `ℚ`. -/ -private noncomputable def rationalRayClassFieldCyclotomicRingEquiv +noncomputable def rationalRayClassFieldCyclotomicRingEquiv : rayClassField ℚ (RayClass.rationalModulus m) ≃+* CyclotomicField m ℚ := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean index 964ae8c11c..39a69654c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -117,7 +117,7 @@ theorem integerUnits_herbrandQuotient_eq_one_of_chosenNormalBasis ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 = 1 := by + g = 1 := by let := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L let := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV @@ -182,7 +182,7 @@ theorem exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLe ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 = 1 := by + g = 1 := by rcases exists_finite_chosenNormalBasisIntegerUnitsQuotient (K := K) (L := L) with ⟨c, hc⟩ refine ⟨c, ?_⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean index bf124698b5..10f8b11d86 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -107,13 +107,13 @@ theorem valuationHerbrand_multiplicativity_of_integerUnits_defined galoisGroupValueGroup_herbrandQuotientDefined K L g ∃ hField : HerbrandQuotientDefined (Gal(L/K)) Lˣ g, @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ - (galoisGroupFieldUnitsMulDistribMulAction K L) g hField.1 hField.2 = + (galoisGroupFieldUnitsMulDistribMulAction K L) g = @herbrandQuotient (Gal(L/K)) (ValuativeRel.valuation L).integerˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 * + g * @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ - (galoisGroupValueGroupMulDistribMulAction K L) g hZ.1 hZ.2 := by + (galoisGroupValueGroupMulDistribMulAction K L) g := by let := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L let := galoisGroupFieldUnitsMulDistribMulAction K L let := galoisGroupValueGroupMulDistribMulAction K L diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index e7c2f8c19e..1cfc157ede 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -764,7 +764,35 @@ noncomputable def lubinTateUniformizerDiagonalAutomorphism (n : ℕ) (u : (standardLocalField K).valuationSubringˣ) : Gal((lubinTateUniformizerDiagonalCompositumField K hπ n u)/K) := Classical.choose - (exists_lubinTateUniformizerDiagonalAutomorphism K hπ n u) + (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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index 7d1ed8b189..cdcb02e903 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -36,14 +36,11 @@ section variable (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] -private abbrev G (K : Type) [Field K] := - intrinsicAbsoluteGalois K +local notation "G" => intrinsicAbsoluteGalois -private abbrev AG (K : Type) [Field K] : Rep ℤ (G K) := - intrinsicAbsoluteUnits K +local notation "AG" => intrinsicAbsoluteUnits -private abbrev B (K : Type) [Field K] : ClosedSubgroup (G K) := - intrinsicAbstractBase K +local notation "B" => intrinsicAbstractBase /-! ## Conjugating two realizations -/ @@ -210,7 +207,8 @@ def finiteGaloisConjugateBaseElement /-! ## The two vertical maps of the abstract reciprocity naturality theorem -/ -private noncomputable def extensionQuotientCongr +/-- 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) @@ -247,7 +245,8 @@ private theorem extensionQuotientCongr_mk subst hN' rfl -private noncomputable def finiteNormQuotientCongr +/-- 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index db0412225a..dfa1ee6198 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -42,14 +42,11 @@ section variable (K L : Type) [Field K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsGalois K L] -private abbrev G (K : Type) [Field K] := - intrinsicAbsoluteGalois K +local notation "G" => intrinsicAbsoluteGalois -private abbrev A (K : Type) [Field K] : Rep ℤ (G K) := - intrinsicAbsoluteUnits K +local notation "A" => intrinsicAbsoluteUnits -private abbrev B (K : Type) [Field K] : ClosedSubgroup (G K) := - intrinsicAbstractBase K +local notation "B" => intrinsicAbstractBase private noncomputable instance intrinsicAbsoluteGaloisT2 : T2Space (G K) := krullTopology_t2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean index 5017fda855..0b73782048 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FiniteResidueFinrankTransfer.lean @@ -66,9 +66,27 @@ noncomputable def valuationSubringEquivDecompositionFieldOfEqTop let eFZ : F ≃ₐ[F] Z := (IntermediateField.botEquiv F Omega).symm.trans (IntermediateField.equivOfEq hZ.symm) - refine - { toFun := fun x => ⟨eFZ (x : F), ?_⟩ - invFun := fun z => ⟨eFZ.symm (z : Z), ?_⟩ + 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) @@ -81,24 +99,6 @@ noncomputable def valuationSubringEquivDecompositionFieldOfEqTop map_mul' := fun x y => by apply Subtype.ext exact map_mul eFZ (x : F) (y : F) } - · 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 - · 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 /-- The corresponding equivalence between literal and intrinsic residue fields. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index c219449eb3..b8c4e60497 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -169,8 +169,8 @@ def abstractFixedFieldCosetEquivAlgHom (abstractRelativeFixedField k Ω hLK →ₐ[ abstractFixedField k Ω K] Ω) := Equiv.ofBijective (abstractFixedFieldCosetToAlgHom k Ω K L hLK) - ⟨abstractFixedFieldCosetToAlgHom_injective k Ω K L hLK, - abstractFixedFieldCosetToAlgHom_surjective 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`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean index 7df8145c30..ecd0f1894c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/TopologicalReciprocity.lean @@ -367,10 +367,8 @@ private theorem commutator_topologicalClosure_eq abelianization agree as multiplicative groups. -/ noncomputable def topologicalAbelianizationFiniteEquiv : Abelianization (Gal(L/K)) ≃* TopologicalAbelianization (Gal(L/K)) := by - let h : Subgroup.topologicalClosure (commutator (Gal(L/K))) = - commutator (Gal(L/K)) := - commutator_topologicalClosure_eq (Gal(L/K)) - exact QuotientGroup.quotientMulEquivOfEq h.symm + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean index daa8d2b22e..5fc356c5aa 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Infinite/FiniteReciprocityDiagram.lean @@ -31,7 +31,8 @@ open LocalFieldTheory RamificationTheory variable (K : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] -private abbrev AbsoluteFiniteIndex := +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 1db43b722b..2f39c5d478 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -167,7 +167,9 @@ private theorem localHilbertRightPowerClassHom_mk maximalLocalKummerPairingRightHom K n hnK hmu a b := rfl -private noncomputable def localHilbertPowerClassLeftHom +/-- 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ˣ →* @@ -230,8 +232,7 @@ noncomputable def localHilbertPairing QuotientGroup.lift (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range (localHilbertPowerClassLeftHom K n hnK hmu) - (powMonoidHom_range_le_localHilbertPowerClassLeftHom_ker - 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean index ede6fb2988..317879d4f0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/MaximalLocalKummerPairing.lean @@ -53,7 +53,9 @@ noncomputable def maximalLocalKummerNormResidueAutomorphism (K := K) (Omega := SeparableClosure K) n hmu Delta.1 exact abelianLocalArtinMonoidHom K E -private noncomputable def maximalLocalKummerPairingSource +/-- 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean index 9e1564a2ee..36744afc27 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/LubinTateApplication/LubinTateTransport.lean @@ -159,7 +159,7 @@ noncomputable def equalCharacteristicUniformizerRatioIntegerUnit 𝒪[K]ˣ := integerUnitOfValuationMapZero K (ϖ / inverseIntegerRingUniformizerFieldUnit K) - (equalCharacteristicUniformizerRatio_valuationMap K ϖ hϖ) + (by exact equalCharacteristicUniformizerRatio_valuationMap K ϖ hϖ) /-- The uniformizer-ratio integer unit maps to the prescribed ratio of field units. -/ @[simp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index a00198de0a..2c0e69c50b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -646,14 +646,8 @@ noncomputable def padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringE (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L).toSubring := by - let : IsIntegralClosure T - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF - p).valuation.valuationSubring L := by - change IsIntegralClosure target.valuationSubring - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF - p).valuationSubring L - infer_instance exact padicCyclotomicUnramified_valuationSubring_eq_integralClosure + (K := ℚ_[p]) (L := L) (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuation.valuationSubring T exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean index 6a1f395864..78572edaab 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ChangedCompletedLevel.lean @@ -263,7 +263,7 @@ noncomputable def equalCharacteristicChangedCompletedPrimitiveRoot (Polynomial.rootOfSplits (Polynomial.SplittingField.splits (equalCharacteristicChangedCompletedPrimitivePolynomial F u n)) - (equalCharacteristicChangedCompletedPrimitivePolynomial_map_degree_ne_zero 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean index d9767efda9..9c7df6901e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedLevel.lean @@ -50,7 +50,8 @@ noncomputable local instance equalCharacteristicCompletedLevelBaseAlgebra (equalCharacteristicCompletedUnramifiedField F.residueField) := laurentSeriesCoefficientAlgebra -private instance equalCharacteristicCompletedLevelBaseCharP +/-- The completed unramified base has the residue characteristic. -/ +local instance equalCharacteristicCompletedLevelBaseCharP (F : LocalField.{u, v} K) : CharP (equalCharacteristicCompletedUnramifiedField F.residueField) @@ -187,7 +188,8 @@ noncomputable local instance equalCharacteristicCompletedLevelScalarTower (equalCharacteristicCompletedLevelField F n) := IsScalarTower.of_algebraMap_eq' rfl -private instance equalCharacteristicCompletedLevelCharP +/-- 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) @@ -309,7 +311,7 @@ noncomputable def equalCharacteristicCompletedPrimitiveRoot (Polynomial.rootOfSplits (Polynomial.SplittingField.splits (equalCharacteristicCompletedPrimitivePolynomial F n)) - (equalCharacteristicCompletedPrimitivePolynomial_map_degree_ne_zero F n)) + (by exact equalCharacteristicCompletedPrimitivePolynomial_map_degree_ne_zero F n)) /-- The chosen element is a root of the base-changed primitive polynomial. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean index 628c6ec23b..43ee70d673 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -166,7 +166,7 @@ noncomputable def equalCharacteristicCompletedLevelEvaluation ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧ →+* Valued.integer (equalCharacteristicCompletedLevelField F n) := PowerSeries.eval₂Hom - (equalCharacteristicCompletedLevelCoefficientHom_continuous F n) ha + (by exact equalCharacteristicCompletedLevelCoefficientHom_continuous F n) ha /-- States the theorem `equalCharacteristicCompletedLevelEvaluation_X`. -/ @[simp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean index 2d8573bb10..d73a2ab043 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/FormalModule/DivisionModuleEndomorphisms.lean @@ -215,8 +215,10 @@ noncomputable def equalCharacteristicLubinTateTruncatedConstantCoeff equalCharacteristicLubinTateTruncatedRing F n →+* F.residueField := equalCharacteristicLubinTateTruncatedRingLift F n (PowerSeries.constantCoeff (R := F.residueField)) - fun _ ha => RingHom.mem_ker.mp - (equalCharacteristicLubinTateTruncationIdeal_le_constantCoeff_ker F n ha) + (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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean index b87b591942..f6376b7497 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/HigherUnitLevelMapFixed.lean @@ -90,7 +90,7 @@ noncomputable def equalCharacteristicLubinTateLevelFieldToCompletedRingHom (F : LocalField K) [CharP K F.residueCharacteristic] (n : ℕ) : equalCharacteristicLubinTateLevelField F n →+* equalCharacteristicCompletedLevelField F n := - higherUnitLevelMapRingHom F n + (equalCharacteristicLubinTateLevelFieldToCompleted F n).toRingHom /-- States the theorem `equalCharacteristicLubinTateLevelFieldToCompletedRingHom_algebraMap`. -/ @[simp] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index 7b2a8d0e6c..1bd6cd6e6d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -367,7 +367,29 @@ noncomputable def equalCharacteristicLubinTateLevelCompleteDVF ValuationTheory.DiscreteValuationField.CompleteDVF.{0, 0} (equalCharacteristicLubinTateLevelField F n) := Classical.choose - (equalCharacteristicLubinTateLevelCompleteDVFData_exists F n) + (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. -/ @@ -756,8 +778,7 @@ theorem equalCharacteristicLubinTateBaseUniformizer_orbitProduct ∏ sigma : Gal((equalCharacteristicLubinTateLevelField F n)/F.residueField⸨X⸩), valuationSubringAutOfUniqueExtension (base := base.toDVF) (target := target.toDVF) - (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension_zero - F n) + (equalCharacteristicLubinTateLevelCompleteDVF_hasUniqueDVFValuationExtension F n) sigma (-equalCharacteristicLubinTatePrimitivePointInteger F n) := by classical dsimp only diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean index e3bb546891..b11fc8217c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaCoefficients.lean @@ -133,13 +133,13 @@ noncomputable def chosenEqualCharacteristicSemilinearCoefficient (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 - (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))) + (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 _ _) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean index 7e42284ff9..b12e097a32 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedPrimitiveAction.lean @@ -38,7 +38,8 @@ namespace LubinTate open LocalFieldTheory.DiscreteValuationField open LocalFieldTheory.DiscreteValuationField.Examples.Qp -private noncomputable local instance +/-- The maximal ideal supplies the adic topology on the completed primitive-action target. -/ +noncomputable local instance padicCompletedActionTargetWithIdeal (p : ℕ) [Fact p.Prime] (n : ℕ) : WithIdeal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean index ae65a6caf3..ea2df17fec 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/RamificationTheory/HilbertRamification/Dedekind/PadicValuationInertia.lean @@ -478,17 +478,16 @@ def globalPadicIdealInertiaToLocalizationDecomposition (globalPadicPrimeLocalizationValuationSubring p M w) := by intro sigma let V := globalPadicPrimeLocalizationValuationSubring p M w - refine ⟨(sigma : M ≃ₐ[ℚ] M), ?_⟩ - 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) + 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 @@ -588,8 +587,7 @@ def globalPadicIdealInertiaToLocalizationInertia (globalPadicPrimeLocalizationValuationSubring p M w) where toFun sigma := ⟨globalPadicIdealInertiaToLocalizationDecomposition p M w sigma, - globalPadicIdealInertiaToLocalizationDecomposition_mem_inertia - p M w sigma⟩ + by exact globalPadicIdealInertiaToLocalizationDecomposition_mem_inertia p M w sigma⟩ map_one' := by apply Subtype.ext apply Subtype.ext diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean index 20e945507c..746e2719de 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/BinaryProduct.lean @@ -185,8 +185,6 @@ theorem herbrandHMinusOneProdFinite /-- Cardinality of degree-zero Tate cohomology for a binary product. -/ theorem herbrandH0Prod_card : - letI : Finite (HerbrandH0 G (A × B)) := - herbrandH0ProdFinite A B Nat.card (HerbrandH0 G (A × B)) = Nat.card (HerbrandH0 G A) * Nat.card (HerbrandH0 G B) := by @@ -197,8 +195,6 @@ theorem herbrandH0Prod_card : product. -/ theorem herbrandHMinusOneProd_card (σ : G) : - letI : Finite (HerbrandHMinusOne G (A × B) σ) := - herbrandHMinusOneProdFinite A B σ Nat.card (HerbrandHMinusOne G (A × B) σ) = Nat.card (HerbrandHMinusOne G A σ) * Nat.card (HerbrandHMinusOne G B σ) := by diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean index 826b04f741..1dd148c503 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/HerbrandLowDegree/Core.lean @@ -37,9 +37,9 @@ variable [Group G] [Fintype G] [CommGroup A] [CommGroup B] [CommGroup C] variable [MulDistribMulAction G A] [MulDistribMulAction G B] [MulDistribMulAction G C] -/-- Herbrand-quotient theory the Herbrand-quotient definition: the Herbrand quotient of the actual -low-degree multiplicative Tate quotients. The finiteness assumptions prevent -`Nat.card` from silently taking the value `0` on infinite quotients. -/ +/-- 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 σ) : ℚ) diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean index 0d8b76215d..f773a90fca 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -1404,9 +1404,9 @@ theorem herbrandQuotient_eq_of_finiteIndex_stableSubgroup finiteIndexStableSubgroup_ambientHerbrandQuotientDefined B hstable σ hgen hB @herbrandQuotient G A _ _ _ _ - σ hA.1 hA.2 = + σ = @herbrandQuotient G B _ _ _ _ - σ hB.1 hB.2 := by + σ := by let subgroupAction := stableSubgroupMulDistribMulAction B hstable @@ -1457,19 +1457,19 @@ theorem herbrandQuotient_eq_of_finiteIndex_stableSubgroup (G := G) (A := A ⧸ B) σ hgen change @herbrandQuotient G A _ _ _ _ - σ hA.1 hA.2 = + σ = @herbrandQuotient G B _ _ _ _ - σ hB.1 hB.2 + σ calc @herbrandQuotient G A _ _ _ _ - σ hA.1 hA.2 = + σ = @herbrandQuotient G B _ _ _ _ - σ hB.1 hB.2 * + σ * @herbrandQuotient G (A ⧸ B) - _ _ _ _ σ hQ.1 hQ.2 := + _ _ _ _ σ := hmult _ = @herbrandQuotient G B _ _ _ _ - σ hB.1 hB.2 := by + σ := by rw [hquotient, mul_one] end FiniteIndexStableSubgroupFiniteness diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean index 1caf4655c4..6f4f3ae886 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Padic/UnitDecomposition.lean @@ -484,9 +484,9 @@ noncomputable def padicPrincipalData rfl have htop : directTopology = standardTopology := hdirect.trans (padicPrincipalUnitDirectTopology_eq_standard p) - let P := fun T : TopologicalSpace U => by + let P : TopologicalSpace U → Type := fun T => letI : TopologicalSpace U := T - exact Σ a : ℕ, + Σ a : ℕ, Multiplicative (ZMod (F.residueCharacteristic ^ a) × (Fin d → ℤ_[F.residueCharacteristic])) ≃ₜ* U From 5977b4179e672dad7715b28688b5d4c9a23558f4 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 22:17:29 +0000 Subject: [PATCH 26/33] Preserve ClassField public signatures and simplify unused assumptions --- .../CyclotomicAbstractFixedFieldArtin.lean | 36 +++++++------------ .../FinitePlaceArtin/TowerRestriction.lean | 4 ++- .../Reciprocity/PowerResidueReciprocity.lean | 18 +++++----- .../ClassFormation/IntegerUnitsHerbrand.lean | 4 +-- .../ClassFormation/ValuationHerbrand.lean | 4 +-- .../AmbientNormResidue.lean | 2 -- .../LocalReciprocity/FixedFieldLocalData.lean | 9 +++-- .../FixedFieldRelativeNorm.lean | 8 ++--- .../GeneralTowerNaturality.lean | 11 ++---- ...ntermediateFieldNormResidueNaturality.lean | 13 +++---- .../NormResidueNaturality.lean | 4 +-- .../SeparableFixedFieldNorm.lean | 6 ++-- .../UnramifiedComparison.lean | 10 +++--- .../Unramified/CanonicalExtension.lean | 19 +++++----- .../Ramification/PrimitivePoint.lean | 2 +- .../RealLowerRamificationGroupCanonical.lean | 3 +- .../Cyclic/Herbrand/Permutation/Module.lean | 3 -- .../LocalField/Analytic/Arithmetic.lean | 4 +-- .../GaloisIntegerRing.lean | 6 ---- 19 files changed, 61 insertions(+), 105 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean index 13d6a5a2ac..555c810af7 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/CyclotomicAbstractFixedFieldArtin.lean @@ -1495,29 +1495,19 @@ private theorem cyclotomicAbstractFixedFieldArtin_eqTransThree a = d := hab.trans (hbc.trans hcd) -private abbrev cyclotomicAbstractFixedFieldArtinCoordinateBase - (H : FiniteAbstractField - (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := - LocalClassFieldTheory.abstractFixedField - ℚ (SeparableClosure ℚ) H.field - -private abbrev cyclotomicAbstractFixedFieldArtinCoordinateRelative - (H : FiniteAbstractField - (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) := - LocalClassFieldTheory.abstractRelativeFixedField - ℚ (SeparableClosure ℚ) - (rationalCyclotomicFieldInertia_le H.field) - -private abbrev cyclotomicAbstractFixedFieldArtinCoordinateLayer - (H : FiniteAbstractField - (SeparableClosure ℚ ≃ₐ[ℚ] SeparableClosure ℚ)) - (E : - FiniteGaloisIntermediateField - ℚ rationalCyclotomicZHatField) : - IntermediateField - (cyclotomicAbstractFixedFieldArtinCoordinateBase H) - (cyclotomicAbstractFixedFieldArtinCoordinateRelative H) := - abstractFixedFieldCyclotomicFiniteLayer H E +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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean index 713f51c4ca..41d5b3b968 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/FinitePlaceArtin/TowerRestriction.lean @@ -425,7 +425,9 @@ theorem decompositionGroupEquivAlgebraicLocalizationAut_restrict_of_commutes exact localizationRamificationGroups_decompositionGroupEquiv_toLocalization vK hvK wL _ _ open scoped Classical in -private noncomputable def finitePlaceLocalRestrictionMonoidHom +/-- 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] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean index 8351144db6..3c3b8b22bb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/PowerResidueReciprocity.lean @@ -1505,11 +1505,11 @@ theorem powerResidueAwayFromExponentFiniteProduct_integral_eq_idealSymbol_div (nonzeroIntegralFieldUnit K b hb0) = integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {b}) - (ideal_span_singleton_ne_zero K hb0) + (by exact ideal_span_singleton_ne_zero K hb0) n hmu a hcoprimeB haB) * (integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {a}) - (ideal_span_singleton_ne_zero K ha0) + (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} @@ -1590,11 +1590,11 @@ theorem powerResidueAwayFromExponentFiniteProduct_integral_eq_idealSymbol_div K IA hIA n hmu b hcoprimeA hbA)] _ = integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {b}) - (ideal_span_singleton_ne_zero K hb0) + (by exact ideal_span_singleton_ne_zero K hb0) n hmu a hcoprimeB haB) * (integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {a}) - (ideal_span_singleton_ne_zero K ha0) + (by exact ideal_span_singleton_ne_zero K ha0) n hmu b hcoprimeA hbA))⁻¹ := by rfl @@ -1729,22 +1729,22 @@ theorem idealPowerResidueSymbol_reciprocity_with_bad_place_correction P ∉ powerResidueExponentFinitePlaces K n) : integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {b}) - (ideal_span_singleton_ne_zero K hb0) + (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}) - (ideal_span_singleton_ne_zero K ha0) + (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}) - (ideal_span_singleton_ne_zero K hb0) + (by exact ideal_span_singleton_ne_zero K hb0) n hmu a hcoprimeB haB) let symbolBA := integralRootsOfUnityToNthRoots K (n : ℕ) (idealPowerResidueSymbol K (Ideal.span {a}) - (ideal_span_singleton_ne_zero K ha0) + (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) @@ -2455,7 +2455,7 @@ theorem rationalIdealPowerResidueSymbol_two_eq_jacobiSym (idealPowerResidueSymbol ℚ (rationalPrincipalIdeal b) (rationalPrincipalIdeal_ne_zero b hb) - (2 : ℕ+) rationalQuadraticPrimitiveRoots_nonempty_pnat a + (2 : ℕ+) (by exact rationalQuadraticPrimitiveRoots_nonempty_pnat) a (by intro P hP change (Ideal.absNorm P.asIdeal).Coprime 2 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean index 39a69654c6..594cf15470 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/IntegerUnitsHerbrand.lean @@ -114,7 +114,7 @@ theorem integerUnits_herbrandQuotient_eq_one_of_chosenNormalBasis letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV - ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g = 1 := by @@ -179,7 +179,7 @@ theorem exists_integerUnits_herbrandQuotient_eq_one_of_large_chosenNormalBasisLe letI := chosenNormalBasisPrincipalUnitSubgroupMulDistribMulAction K L n V hV letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := chosenNormalBasisIntegerUnitsQuotMulDistribMulAction K L n V hV - ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g = 1 := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean index 10f8b11d86..5a513072de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/ValuationHerbrand.lean @@ -103,9 +103,7 @@ theorem valuationHerbrand_multiplicativity_of_integerUnits_defined letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L letI := galoisGroupFieldUnitsMulDistribMulAction K L letI := galoisGroupValueGroupMulDistribMulAction K L - let hZ : HerbrandQuotientDefined (Gal(L/K)) (Multiplicative Int) g := - galoisGroupValueGroup_herbrandQuotientDefined K L g - ∃ hField : HerbrandQuotientDefined (Gal(L/K)) Lˣ g, + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) Lˣ g, @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ (galoisGroupFieldUnitsMulDistribMulAction K L) g = @herbrandQuotient (Gal(L/K)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean index 6bac0f7cf3..98c14a75cf 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldIntrinsicReciprocity/AmbientNormResidue.lean @@ -37,8 +37,6 @@ abbrev ambientEmbeddedSeparableClosureEquiv [Field F] [ValuativeRel F] [TopologicalSpace F] [Field E] [Algebra K F] [Algebra F E] [Algebra K E] [IsScalarTower K F E] - [Valuation.HasExtension - (ValuativeRel.valuation K) (ValuativeRel.valuation F)] (j : E →ₐ[K] SeparableClosure K) := @AlgEquiv F (SeparableClosure F) (SeparableClosure K) _ _ _ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index acee7fcea0..27fad32008 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -40,11 +40,10 @@ open scoped NNReal Pointwise ValuativeRel open ClassFormation LocalFieldTheory RamificationTheory CyclicCohomology open RamificationTheory.HilbertRamification.ValuationSubring -private abbrev finiteFixedField - (K : Type) [Field K] - (H : FiniteAbstractField (Gal(SeparableClosure K/K))) : - Type := - abstractFixedField K (SeparableClosure K) H.field +local notation "finiteFixedField" => + (fun (K : Type) [Field K] + (H : FiniteAbstractField (Gal(SeparableClosure K/K))) => + abstractFixedField K (SeparableClosure K) H.field) /-- The separable closure of a finite fixed field is an algebra over that fixed field. -/ local instance finiteFixedFieldSeparableClosureAlgebra diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean index b8c4e60497..fe820ac704 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldRelativeNorm.lean @@ -93,9 +93,7 @@ theorem abstractFixedFieldCosetToAlgHom_mk private theorem abstractFixedFieldCosetToAlgHom_surjective (K L : ClosedSubgroup (Gal(Ω/k))) - (hLK : L.toSubgroup ≤ K.toSubgroup) - [FiniteDimensional (abstractFixedField k Ω K) - (abstractRelativeFixedField k Ω hLK)] : + (hLK : L.toSubgroup ≤ K.toSubgroup) : Function.Surjective (abstractFixedFieldCosetToAlgHom k Ω K L hLK) := by intro f @@ -162,9 +160,7 @@ private theorem abstractFixedFieldCosetToAlgHom_injective concrete fixed field into the ambient separably closed field. -/ def abstractFixedFieldCosetEquivAlgHom (K L : ClosedSubgroup (Gal(Ω/k))) - (hLK : L.toSubgroup ≤ K.toSubgroup) - [FiniteDimensional (abstractFixedField k Ω K) - (abstractRelativeFixedField k Ω hLK)] : + (hLK : L.toSubgroup ≤ K.toSubgroup) : (K.toSubgroup ⧸ extensionSubgroup K L hLK) ≃ (abstractRelativeFixedField k Ω hLK →ₐ[ abstractFixedField k Ω K] Ω) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean index ed16393239..29aef09c3f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -32,16 +32,11 @@ open LocalFieldTheory RamificationTheory CyclicCohomology KummerTheory open ClassFormation LocalClassFieldTheory open scoped IsMulCommutative -private abbrev towerAbsoluteGalois (K : Type) [Field K] := - intrinsicAbsoluteGalois K +local notation "towerAbsoluteGalois" => intrinsicAbsoluteGalois -private abbrev towerAbsoluteUnits (K : Type) [Field K] : - Rep ℤ (towerAbsoluteGalois K) := - intrinsicAbsoluteUnits K +local notation "towerAbsoluteUnits" => intrinsicAbsoluteUnits -private abbrev towerAbstractBase (K : Type) [Field K] : - ClosedSubgroup (towerAbsoluteGalois K) := - intrinsicAbstractBase K +local notation "towerAbstractBase" => intrinsicAbstractBase private def towerLowerEmbedding (K E L : Type) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean index 47a6191445..ba8be4ca2d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/IntermediateFieldNormResidueNaturality.lean @@ -39,16 +39,11 @@ universe u v variable {K : Type u} {Omega : Type v} [Field K] [Field Omega] [Algebra K Omega] -private abbrev absoluteGalois (K : Type) [Field K] := - intrinsicAbsoluteGalois K +local notation "absoluteGalois" => intrinsicAbsoluteGalois -private abbrev absoluteUnits (K : Type) [Field K] : - Rep ℤ (absoluteGalois K) := - intrinsicAbsoluteUnits K +local notation "absoluteUnits" => intrinsicAbsoluteUnits -private abbrev abstractBase (K : Type) [Field K] : - ClosedSubgroup (absoluteGalois K) := - intrinsicAbstractBase K +local notation "abstractBase" => intrinsicAbstractBase section AbstractToConcrete @@ -57,7 +52,7 @@ variable (K L : Type) [Field K] [Field L] [Algebra K L] /-- The finite abstract norm class represented by a base-field unit in an explicit separable-closure realization. -/ -private def embeddedBaseNormClass +def embeddedBaseNormClass (i : L →ₐ[K] SeparableClosure K) (a : Kˣ) : FiniteNormQuotient (absoluteUnits K) (abstractBase K) (finiteGaloisAbstractExtensionOfEmbedding K L i).field diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean index 8a8bb5ff85..bca0975f4c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/NormResidueNaturality.lean @@ -33,8 +33,8 @@ 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 E] [FiniteDimensional K F] - [IsGalois K E] [IsGalois K F] : + [FiniteDimensional K F] + [IsGalois K E] : Gal(F/K) →ₜ* Gal(E/K) := { intermediateFieldRestrictNormalHom E F hEF with continuous_toFun := continuous_of_discreteTopology } diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean index 9872c75623..067cd3f896 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/SeparableFixedFieldNorm.lean @@ -92,8 +92,7 @@ theorem baseFixingCosetToAlgHom_mk σ.1.toAlgHom.comp E.val := rfl -private theorem baseFixingCosetToAlgHom_surjective - [FiniteDimensional K E] [Algebra.IsSeparable K E] : +private theorem baseFixingCosetToAlgHom_surjective : Function.Surjective (baseFixingCosetToAlgHom K Ω E) := by intro f let : Algebra.IsSeparable E Ω := @@ -144,8 +143,7 @@ private theorem baseFixingCosetToAlgHom_injective : /-- Left cosets of the absolute subgroup fixing `E` are the actual `K`-embeddings of `E` into the separably closed ambient field. -/ -def baseFixingCosetEquivAlgHom - [FiniteDimensional K E] [Algebra.IsSeparable K E] : +def baseFixingCosetEquivAlgHom : ((closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)).toSubgroup ⧸ extensionSubgroup (closedFixingSubgroup K Ω (⊥ : IntermediateField K Ω)) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index 8d4a4f25f3..07f0323dff 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -45,14 +45,12 @@ open ClassFormation open RamificationTheory.HilbertRamification.ValuationSubring -private abbrev absoluteGalois (K : Type) [Field K] := - intrinsicAbsoluteGalois K +local notation "absoluteGalois" => intrinsicAbsoluteGalois -private abbrev abstractBase (K : Type) [Field K] : - ClosedSubgroup (absoluteGalois K) := - intrinsicAbstractBase K +local notation "abstractBase" => intrinsicAbstractBase -private noncomputable def finiteResidueAbstractBase +/-- 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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean index 2c0e69c50b..91ba40fda5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalFieldTheory/Padic/Cyclotomic/Unramified/CanonicalExtension.lean @@ -641,23 +641,20 @@ noncomputable def padicCyclotomicUnramifiedPadicFiniteExtensionValuationSubringE (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring L).toSubring := padicCyclotomicUnramified_padicFiniteExtensionValuationSubring_eq_integralClosure p L - have hT : T.toSubring = - (integralClosure - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF p).valuationSubring - L).toSubring := - by - exact padicCyclotomicUnramified_valuationSubring_eq_integralClosure - (K := ℚ_[p]) (L := L) - (LocalFieldTheory.DiscreteValuationField.Examples.Qp.padicCompleteDVF - p).valuation.valuationSubring T exact { toFun := fun x => ⟨x, by change (x : L) ∈ T.toSubring - rw [hT, ← hW] + 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, ← hT] + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean index 1bd6cd6e6d..14f700d995 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Ramification/PrimitivePoint.lean @@ -202,7 +202,7 @@ theorem equalCharacteristicLubinTateBaseCompleteDVF_valuation_eq /-- Identity on Laurent-series elements identifies the canonical valuative integer ring with the valuation ring packaged by the chosen complete DVF. -/ -private noncomputable def +noncomputable def equalCharacteristicLaurentValuativeIntegerEquivLubinTateBaseValuationSubring (F : LocalField.{0, v} K₀) : letI : ValuativeRel F.residueField⸨X⸩ := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean index 87fb94c707..82aa8816cb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/Theorems/HasseArf/RealLowerRamificationGroupCanonical.lean @@ -32,8 +32,7 @@ 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] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] : + [ValuativeRel L] [TopologicalSpace L] : Antitone (ClassFieldTheory.realLowerRamificationGroup K (ValuativeRel.valuation L).valuationSubring) := by intro s t hst σ hσ x diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean index f773a90fca..6117d6eda7 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/Module.lean @@ -1400,9 +1400,6 @@ theorem herbrandQuotient_eq_of_finiteIndex_stableSubgroup letI _quotientAction := stableQuotientMulDistribMulAction B hstable - let hA := - finiteIndexStableSubgroup_ambientHerbrandQuotientDefined - B hstable σ hgen hB @herbrandQuotient G A _ _ _ _ σ = @herbrandQuotient G B _ _ _ _ diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean index 16e7b27d19..08c683499e 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/Analytic/Arithmetic.lean @@ -42,14 +42,14 @@ variable {p n : ℕ} This is the arithmetic input for the logarithm-series convergence estimate `v_p(n) <= log_p n`. -/ theorem pow_padicValNat_le_self - [Fact p.Prime] (hn : n ≠ 0) : + (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 - [Fact p.Prime] (n : ℕ) : + (n : ℕ) : (padicValNat p n : ℝ) ≤ Real.logb p n := by exact (Nat.cast_le.mpr (padicValNat_le_nat_log (p := p) n)).trans diff --git a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean index ee1ae45e40..42fbee4842 100644 --- a/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean +++ b/LeanPool/ClassFieldTheory/ValuedFieldTheory/LocalField/NonarchimedeanLocalField/GaloisIntegerRing.lean @@ -38,7 +38,6 @@ back to `𝒪[L]`. -/ theorem galoisGroup_mem_integerRing_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)) (x : 𝒪[L]) : σ (x : L) ∈ 𝒪[L] := by @@ -56,7 +55,6 @@ 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] - [Valuation.HasExtension (ValuativeRel.valuation K) (ValuativeRel.valuation L)] [IsIntegralClosure 𝒪[L] 𝒪[K] L] (σ : Gal(L/K)) : 𝒪[L] ≃+* 𝒪[L] where toFun x := @@ -86,7 +84,6 @@ valuation ring. -/ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_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)) (x : 𝒪[L]) : ((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ x : 𝒪[L]) : L) = @@ -99,7 +96,6 @@ field. -/ theorem galoisGroupIntegerRingEquivOfIsIntegralClosure_symm_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)) (x : 𝒪[L]) : (((galoisGroupIntegerRingEquivOfIsIntegralClosure K L σ).symm x : 𝒪[L]) : L) = @@ -111,7 +107,6 @@ restriction. -/ def galoisGroupIntegerRingEquivHomOfIsIntegralClosure (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]) where toFun := galoisGroupIntegerRingEquivOfIsIntegralClosure K L @@ -129,7 +124,6 @@ integral-closure restriction of `Gal(L / K)`. -/ def galoisGroupIntegerRingMulSemiringActionOfIsIntegralClosure (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] : MulSemiringAction (Gal(L/K)) 𝒪[L] := MulSemiringAction.compHom 𝒪[L] (galoisGroupIntegerRingEquivHomOfIsIntegralClosure K L) From 1fdec6c0689caab7a86f2805fb325b807814d2bb Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sat, 26 Sep 2026 03:19:18 +0000 Subject: [PATCH 27/33] Repair remaining class-field module interfaces and Herbrand callers --- .../Construction/MainNaturality.lean | 6 +++-- .../Idele/Cohomology/Herbrand.lean | 2 +- .../Cohomology/HerbrandExactSequence.lean | 4 ++-- .../Idele/Principal.lean | 4 ++-- .../SUnit/GaloisAction.lean | 2 +- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 22 +++++++++---------- .../IdeleClassHerbrandSupportedFinal.lean | 16 +++++++------- .../ClassFormation/FieldUnitsHerbrand.lean | 6 ++--- .../ClassFormation/Main.lean | 6 ++--- .../Finite/Unramified/Cohomology.lean | 2 +- .../CompletedPrimitiveAction.lean | 2 ++ .../NormSubgroup/UnitQuotientCard.lean | 4 ++-- .../Theta/ThetaFirstIdentity.lean | 4 ++-- .../Padic/CompletedFrobeniusEvaluation.lean | 3 ++- .../CompletedStandardLevelTransport.lean | 12 ++++++---- .../Herbrand/Permutation/LatticeHerbrand.lean | 6 ++--- 16 files changed, 54 insertions(+), 47 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean index f05633f73c..820e287c41 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AbstractClassFieldTheory/Reciprocity/Construction/MainNaturality.lean @@ -1108,7 +1108,8 @@ theorem finiteReciprocityNaturalityFrobeniusConjugationLift_exponent section ConjugateFrobeniusQuotients -private theorem finiteReciprocityNaturalityConjugateInertia_normal +/-- 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) @@ -1348,8 +1349,9 @@ private theorem finiteReciprocityNaturality_relativeNorm_right_transport section ConjugateFiniteNormQuotient +/-- The additive zero structure on the conjugate finite norm quotient. -/ @[instance_reducible] -private def finiteReciprocityNaturalityConjugateNormAddZero +def finiteReciprocityNaturalityConjugateNormAddZero (A : Rep ℤ G) [IsTopologicalGroup G] (K : FiniteAbstractField G) (L : ClosedSubgroup G) (hLK : L.toSubgroup ≤ K.field.toSubgroup) (s : G) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean index 9325393a7f..e56ebc3599 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -602,7 +602,7 @@ theorem ideleClassHerbrandQuotientDefined_of_principal_relative (RelativeIdeleGroup.ClassGroup K L) inferInstance inferInstance inferInstance (ideleClassMulDistribMulAction K L) - σ hC.1 hC.2 := by + σ := by let q : RelativeIdeleGroup K L →* RelativeIdeleGroup.ClassGroup K L := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean index c65cf2fe57..9db525908c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean @@ -112,7 +112,7 @@ theorem ideleClass_herbrandQuotient_eq_card_of_relative_principal_values @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) - _ _ _ _ σ hC.1 hC.2 = + _ _ _ _ σ = (Fintype.card (L ≃ₐ[K] L) : ℚ) := by let := relativeIdeleMulDistribMulAction K L let := principalIdeleMulDistribMulAction K L @@ -149,7 +149,7 @@ theorem ideleClass_herbrandQuotient_eq_card_of_relative_principal_values @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) - _ _ _ _ σ hC.1 hC.2 = + _ _ _ _ σ = q := by rw [← hPrincipal, ← hmul, hRelative] _ = diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean index c47b055b98..c4f22b6ddc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean @@ -190,13 +190,13 @@ theorem fieldUnits_herbrandQuotient_eq_principalIdeles @herbrandQuotient (L ≃ₐ[K] L) Lˣ _ _ _ (galoisGroupFieldUnitsMulDistribMulAction K L) - σ h.1 h.2 = + σ = @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.principalSubgroup K L) _ _ _ (principalIdeleMulDistribMulAction K L) - σ hP.1 hP.2 := by + σ := by let _ := galoisGroupFieldUnitsMulDistribMulAction K L let _ := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean index 5aba812cfd..8141fa19a8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -1220,7 +1220,7 @@ theorem (L ≃ₐ[K] L) (Multiplicative (extendedFullLogLattice L S)) - _ _ _ _ σ h.1 h.2 = + _ _ _ _ σ = ∏ ω : MulAction.orbitRel.Quotient (L ≃ₐ[K] L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index bc21577aa5..f4652385c6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -1160,7 +1160,7 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (L ≃ₐ[K] L) (Multiplicative (SUnitGroup.fullLogLattice (K := L) S)) - _ _ _ _ σ h.1 h.2 = + _ _ _ _ σ = (∏ ω : MulAction.orbitRel.Quotient (L ≃ₐ[K] L) @@ -1288,13 +1288,13 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (L ≃ₐ[K] L) (Multiplicative (SUnitGroup.fullLogLattice (K := L) S)) - _ _ _ _ σ hLattice.1 hLattice.2 * + _ _ _ _ σ * (Fintype.card (L ≃ₐ[K] L) : ℚ) = @herbrandQuotient (L ≃ₐ[K] L) (Multiplicative (SUnitGroup.fullLogLattice (K := L) S × ℤ)) - _ _ _ _ σ hProduct.1 hProduct.2 := by + _ _ _ _ σ := by rw [← hIntegerValue] exact hMultiplicative.symm _ = @@ -1302,7 +1302,7 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (L ≃ₐ[K] L) (Multiplicative (extendedFullLogLattice L S)) - _ _ _ _ σ hExtended.1 hExtended.2 := + _ _ _ _ σ := hExtendedProduct.symm _ = ∏ ω : @@ -1360,7 +1360,7 @@ theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card @herbrandQuotient (L ≃ₐ[K] L) (SUnitGroup (K := L) S) - _ _ _ _ σ h.1 h.2 = + _ _ _ _ σ = (∏ ω : MulAction.orbitRel.Quotient (L ≃ₐ[K] L) @@ -1482,24 +1482,24 @@ theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card @herbrandQuotient (L ≃ₐ[K] L) (SUnitGroup (K := L) S) - _ _ _ _ σ hSUnit.1 hSUnit.2 = + _ _ _ _ σ = @herbrandQuotient (L ≃ₐ[K] L) (CommGroup.torsion (SUnitGroup (K := L) S)) - _ _ _ _ σ hTorsion.1 hTorsion.2 * + _ _ _ _ σ * @herbrandQuotient (L ≃ₐ[K] L) (Multiplicative (SUnitGroup.fullLogLattice (K := L) S)) - _ _ _ _ σ hLattice.1 hLattice.2 := + _ _ _ _ σ := hMultiplicative _ = @herbrandQuotient (L ≃ₐ[K] L) (Multiplicative (SUnitGroup.fullLogLattice (K := L) S)) - _ _ _ _ σ hLattice.1 hLattice.2 := by + _ _ _ _ σ := by rw [hTorsionValue, one_mul] _ = (∏ ω : @@ -1755,7 +1755,7 @@ theorem sUnit_herbrandQuotient_eq_localDegreeProduct_div_card @herbrandQuotient (L ≃ₐ[K] L) (SUnitGroup (K := L) S) - _ _ _ _ σ h.1 h.2 = + _ _ _ _ σ = (∏ ω : MulAction.orbitRel.Quotient (L ≃ₐ[K] L) @@ -1794,7 +1794,7 @@ theorem sUnit_herbrandQuotient_eq_localDegreeProduct_div_card @herbrandQuotient (L ≃ₐ[K] L) (SUnitGroup (K := L) S) - _ _ _ _ σ hSUnit.1 hSUnit.2 = + _ _ _ _ σ = (∏ ω : MulAction.orbitRel.Quotient (L ≃ₐ[K] L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index 21f924946a..2f5aea28c2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -197,7 +197,7 @@ theorem (L ≃ₐ[K] L) (RelativeOutsideSPlaceFactors (K := K) (L := L) S) - _ _ _ _ σ h.1 h.2 = 1 := by + _ _ _ _ σ = 1 := by let outsideAction := relativeOutsideSPlaceFactorsAction (K := K) (L := L) S @@ -266,7 +266,7 @@ theorem (L ≃ₐ[K] L) (relativeIdeleLocalTensorDecompositionSupportedSubgroup (K := K) (L := L) S) - _ _ _ _ σ h.1 h.2 = + _ _ _ _ σ = ∏ i, (relativeUnrestrictedSPlaceLocalDegree (K := K) (L := L) S i : ℚ) := by @@ -348,7 +348,7 @@ theorem (L ≃ₐ[K] L) (relativeIdeleLocalTensorDecompositionSupportedSubgroup (K := K) (L := L) S) - _ _ _ _ σ hSupported.1 hSupported.2 = + _ _ _ _ σ = herbrandQuotient (G := L ≃ₐ[K] L) (A := @@ -1204,7 +1204,7 @@ theorem @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) - _ _ _ _ σ hC.1 hC.2 = + _ _ _ _ σ = (Fintype.card (L ≃ₐ[K] L) : ℚ) := by let sUnitAction := sUnitMulDistribMulAction K L @@ -1324,7 +1324,7 @@ theorem @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) - _ _ _ _ σ hC.1 hC.2 = + _ _ _ _ σ = q := by rw [← hUnit, ← hmul, hSupported] _ = @@ -1438,7 +1438,7 @@ theorem @herbrandQuotient (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) - _ _ _ _ σ hC.1 hC.2 = + _ _ _ _ σ = (Fintype.card (L ≃ₐ[K] L) : ℚ) := by let T := finitePlacesAbove (K := K) (L := L) S @@ -1506,7 +1506,7 @@ theorem @herbrandQuotient (L ≃ₐ[K] L) (SUnitGroup (K := L) T) - _ _ _ _ σ hUnit.1 hUnit.2 = + _ _ _ _ σ = q / (Fintype.card (L ≃ₐ[K] L) : ℚ) := by rw [hProducts] simpa only [indexAction, ρ, T, hT] using hUnitValue @@ -1515,7 +1515,7 @@ theorem (L ≃ₐ[K] L) (relativeIdeleLocalTensorDecompositionSupportedSubgroup (K := K) (L := L) S) - _ _ _ _ σ hSupported.1 hSupported.2 = + _ _ _ _ σ = q := by exact hSupportedValue exact diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean index 2195d8e45b..383f0ef0e8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/FieldUnitsHerbrand.lean @@ -81,7 +81,7 @@ theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one @herbrandQuotient (Gal(L/K)) (ValuativeRel.valuation L).integerˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 = 1) : + 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 @@ -109,7 +109,7 @@ theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one galoisGroupValueGroup_herbrandHMinusOne_card_eq_one K L g have hZ_one : @herbrandQuotient (Gal(L/K)) (Multiplicative Int) _ _ _ - (galoisGroupValueGroupMulDistribMulAction K L) g hZ.1 hZ.2 = + (galoisGroupValueGroupMulDistribMulAction K L) g = (Module.finrank K L : ℚ) := by rw [herbrandQuotient_eq_card_ratio, hZ0, hZm1] simp @@ -123,7 +123,7 @@ theorem fieldUnits_tate_card_of_integerUnits_herbrand_eq_one have hField_quotient : @herbrandQuotient (Gal(L/K)) Lˣ _ _ _ (galoisGroupFieldUnitsMulDistribMulAction K L) - g hField.1 hField.2 = (Module.finrank K L : ℚ) := by + g = (Module.finrank K L : ℚ) := by rw [hmult, hU_one, hZ_one] simp have h0_field_rat : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index 165da552b8..0c4a65476c 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -51,7 +51,7 @@ theorem exists_localIntegerUnitsHerbrandDefinedAndEqOne ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 = 1 := by + g = 1 := by rcases exists_chosenNormalBasisPrincipalUnitSubgroup (K := K) (L := L) with ⟨cV, hcV⟩ rcases exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton @@ -86,9 +86,7 @@ private theorem localIntegerUnitsHerbrandQuotient_eq_one (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ - (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g - (localIntegerUnitsHerbrandDefined K L g hg).1 - (localIntegerUnitsHerbrandDefined K L g hg).2 = 1 := + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index 30683fb31f..a9a890e265 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -203,7 +203,7 @@ private theorem integerUnits_herbrandQuotient_eq_one ∃ hU : HerbrandQuotientDefined Gal(L/K) 𝒪[L]ˣ g, @herbrandQuotient Gal(L/K) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) - g hU.1 hU.2 = 1 := by + g = 1 := by rcases exists_chosenNormalBasisPrincipalUnitSubgroup (K := K) (L := L) with ⟨cV, hcV⟩ rcases exists_chosenNormalBasisPrincipalUnit_herbrand_subsingleton diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean index 220bc7b0f6..c34a760a44 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedPrimitiveAction.lean @@ -37,6 +37,8 @@ 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean index 70b1114450..b645355a95 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/NormSubgroup/UnitQuotientCard.lean @@ -149,7 +149,7 @@ theorem equalCharacteristicLubinTateUnitQuotient_natCard letI : Finite (F.residueField⟦X⟧ˣ ⧸ equalCharacteristicLubinTateHigherUnitSubgroup F n) := - unitQuotientFinite F n + by exact unitQuotientFinite F n Nat.card (F.residueField⟦X⟧ˣ ⧸ equalCharacteristicLubinTateHigherUnitSubgroup F n) = @@ -259,7 +259,7 @@ theorem equalCharacteristicLubinTateUniformizerPrincipalQuotient_natCard (F.residueField⸨X⸩ˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ (equalCharacteristicLaurentUniformizerUnit F)⁻¹ 1 (n + 1)) := - uniformizerPrincipalQuotientFinite F n + by exact uniformizerPrincipalQuotientFinite F n Nat.card (F.residueField⸨X⸩ˣ ⧸ LocalFieldTheory.uniformizerPrincipalSubgroup F.residueField⸨X⸩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean index 6adb564837..115d00a070 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/Theta/ThetaFirstIdentity.lean @@ -517,8 +517,8 @@ theorem equalCharacteristicThetaAfterBracketCoefficient_zero rw [equalCharacteristicThetaCoefficient_zero] simpa [equalCharacteristicThetaAfterBracketCoefficient, equalCharacteristicQAdditiveCompositionCoefficient, - equalCharacteristicCompletedSourceBracketCoefficient, - mul_comm] using hsemi.symm + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean index 81db24eec1..3cd08da19d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedFrobeniusEvaluation.lean @@ -39,7 +39,8 @@ private noncomputable local instance (priority := 50) UniformSpace (padicCompletedUnramifiedWittRing p) := ⊥ -private noncomputable local instance +/-- The maximal ideal defining the adic topology on the completed level valuation ring. -/ +noncomputable local instance padicCompletedFrobeniusEvaluationTargetWithIdeal (p : ℕ) [Fact p.Prime] (n : ℕ) : WithIdeal diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean index d7c5d4edfb..e278b2a438 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedStandardLevelTransport.lean @@ -35,13 +35,15 @@ open LocalFieldTheory.DiscreteValuationField.Examples.Qp open ValuationTheory.DiscreteValuationField open SameUniformizer -private noncomputable local instance +/-- The discrete uniform structure on the coefficient valuation ring used for evaluation. -/ +noncomputable local instance padicStandardLevelTransportCoefficientUniformSpace (p : ℕ) [Fact p.Prime] : UniformSpace (padicLocalField p).valuationSubring := ⊥ -private noncomputable local instance +/-- The discrete topology on the coefficient valuation ring used for evaluation. -/ +noncomputable local instance padicStandardLevelTransportCoefficientTopologicalSpace (p : ℕ) [Fact p.Prime] : TopologicalSpace (padicLocalField p).valuationSubring := @@ -53,7 +55,8 @@ private noncomputable local instance (priority := 50) UniformSpace (padicCompletedUnramifiedWittRing p) := ⊥ -private noncomputable local instance +/-- The maximal ideal defining the adic topology on the standard level valuation ring. -/ +noncomputable local instance padicStandardLevelTransportSourceWithIdeal (p : ℕ) [Fact p.Prime] (n : ℕ) : WithIdeal @@ -64,7 +67,8 @@ private noncomputable local instance (padicMultiplicativeLubinTateSeries_isUniformizer p) n ).maximalIdeal -private noncomputable local instance +/-- The maximal ideal defining the adic topology on the completed level valuation ring. -/ +noncomputable local instance padicStandardLevelTransportTargetWithIdeal (p : ℕ) [Fact p.Prime] (n : ℕ) : WithIdeal diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index f501ff1687..c0b855b31b 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -876,7 +876,7 @@ theorem G (Multiplicative L) σ, @herbrandQuotient G (Multiplicative L) _ _ _ _ - σ h.1 h.2 = + σ = ∏ ω : MulAction.orbitRel.Quotient G ι, (Fintype.card (permutationOrbitStabilizer ω) : ℚ) := by @@ -987,10 +987,10 @@ theorem calc @herbrandQuotient G (Multiplicative L) _ _ _ _ - σ hA.1 hA.2 = + σ = @herbrandQuotient G B _ _ _ _ - σ hB.1 hB.2 := by + σ := by simpa only [hA] using (herbrandQuotient_eq_of_finiteIndex_stableSubgroup B hstable σ hgen hB) From eb5525e4f491f399b22749bb3e5b9a68f7d403c7 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Fri, 25 Sep 2026 20:38:46 -0700 Subject: [PATCH 28/33] =?UTF-8?q?Remove=20identical=20duplicate=20Hasse?= =?UTF-8?q?=E2=80=93Minkowski=20registry=20card?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LeanPool/projects.yml | 49 ------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/LeanPool/projects.yml b/LeanPool/projects.yml index e709cbcde9..9cabd0dcd4 100644 --- a/LeanPool/projects.yml +++ b/LeanPool/projects.yml @@ -10308,55 +10308,6 @@ projects: - '12F05' - '13F25' - - slug: hasse-minkowski - title: The Hasse–Minkowski theorem over ℚ - summary: >- - Proves the local–global principle for quadratic forms over the rationals: - a form is isotropic over ℚ exactly when it is isotropic over ℝ and over - every p-adic completion, together with Meyer's theorem that an indefinite - rational form in at least five variables is isotropic. The development - builds the Hilbert symbol at every place of ℚ with Serre's explicit - formulas (including the 2-adic case), proves Hilbert reciprocity and the - existence theorem for prescribed local symbols, the Hasse invariant and - the rank-two and rank-three local representability criteria, Legendre's - ternary descent, and the rank-four and rank-≥5 inductions. - branch: number theory - entry_module: LeanPool.HasseMinkowski - authors: - - jayyswan - - Nirvana Coppola - - María Inés de Frutos-Fernández - source: - title: The Hasse–Minkowski theorem over ℚ - url: https://github.com/jayyswan/hasse-minkowski - github_repo: jayyswan/hasse-minkowski - commit: 47f0e9b5cba6e6354b882bc5856a11962ba61f4a - license: Apache-2.0 - status: verified - provenance: mix - main_declarations: - - HasseMinkowski.hasseMinkowski - - HasseMinkowski.meyer - main_results: - - declaration: HasseMinkowski.hasseMinkowski - informal: >- - A quadratic form over ℚ is isotropic if and only if it is isotropic - over ℝ and over every p-adic completion ℚ_[p] (the Hasse–Minkowski - local–global principle, in isotropy form). - - declaration: HasseMinkowski.meyer - informal: >- - Every indefinite quadratic form over ℚ in at least five variables is - isotropic (Meyer's theorem). - tags: - - number-theory - - quadratic-forms - - local-global - - p-adic - msc: - - '11E12' - - '11E08' - - '11E88' - - 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, From f9255fdda770ca8a8522a8f9850d9d078d730617 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sat, 26 Sep 2026 04:14:56 +0000 Subject: [PATCH 29/33] Repair class field module interfaces and retain finite witnesses --- .../Idele/Cohomology/Herbrand.lean | 2 +- .../Cohomology/HerbrandExactSequence.lean | 2 +- .../Idele/Principal.lean | 2 +- .../SUnit/GaloisAction.lean | 2 +- .../ClassFormation/Main.lean | 2 +- .../ConcreteReciprocityTransport.lean | 5 +- .../FixedFieldNormResidueNaturality.lean | 66 +++++++++---------- .../Finite/Unramified/Cohomology.lean | 2 +- .../DirectThetaFirstIdentity.lean | 4 +- .../CompletedLevel/ThetaAtCompletedLevel.lean | 5 +- ...CompletedChangedUniformizerFixedField.lean | 2 +- .../Herbrand/Permutation/LatticeHerbrand.lean | 2 +- 12 files changed, 46 insertions(+), 50 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean index e56ebc3599..df087e67a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/Herbrand.lean @@ -586,7 +586,7 @@ theorem ideleClassHerbrandQuotientDefined_of_principal_relative [Finite (HerbrandHMinusOne (L ≃ₐ[K] L) (RelativeIdeleGroup K L) σ)] : - ∃ hC : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) σ, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean index 9db525908c..8147bb2437 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/HerbrandExactSequence.lean @@ -105,7 +105,7 @@ theorem ideleClass_herbrandQuotient_eq_card_of_relative_principal_values (A := RelativeIdeleGroup.principalSubgroup K L) σ = q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : letI := ideleClassMulDistribMulAction K L - ∃ hC : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) σ, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean index c4f22b6ddc..5ed7d9ecf5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Principal.lean @@ -184,7 +184,7 @@ theorem fieldUnits_herbrandQuotient_eq_principalIdeles relativeIdeleMulDistribMulAction K L letI _principalAction := principalIdeleMulDistribMulAction K L - let hP := + let _ := principalIdelesHerbrandQuotientDefined K L σ h @herbrandQuotient diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean index 8141fa19a8..bde082597e 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/GaloisAction.lean @@ -1211,7 +1211,7 @@ theorem (SUnitGroup.LogPlace (K := L) S), Fintype (permutationOrbitStabilizer ω) := fun _ => Fintype.ofFinite _ - ∃ h : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (Multiplicative diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean index 0c4a65476c..0f063c1712 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/ClassFormation/Main.lean @@ -48,7 +48,7 @@ theorem exists_localIntegerUnitsHerbrandDefinedAndEqOne (g : Gal(L/K)) (hg : ∀ sigma : Gal(L/K), sigma ∈ Subgroup.zpowers g) : letI := galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L - ∃ hU : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, + ∃ _ : HerbrandQuotientDefined (Gal(L/K)) 𝒪[L]ˣ g, @herbrandQuotient (Gal(L/K)) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g = 1 := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean index dfa1ee6198..1275cb8a93 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityTransport.lean @@ -77,8 +77,9 @@ def concreteReciprocityAddEquivOfEmbedding (D : DegreeData (G K)) (v : ValuationData D (A K)) (hcf : SatisfiesClassFieldAxiom (A K)) : Additive (Abelianization Gal(L/K)) ≃+ - Additive (NormQuotient K L) := - (MulEquiv.toAdditive + 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) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean index dff003fb21..732bc9c4ef 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldNormResidueNaturality.lean @@ -518,28 +518,26 @@ theorem upperAbsoluteFinite /-- The fixed-field norm-residue symbol for the lower horizontal extension, induced by the canonical local class formation. -/ noncomputable def lowerNormResidueSymbol - (T : LocalFixedFieldNormRestrictionSquare k) := by + (T : LocalFixedFieldNormRestrictionSquare k) := letI := T.lowerNormal letI := T.lowerFinite letI := T.lowerAbsoluteFinite - exact - abstractFixedFieldNormResidueSymbol k (SeparableClosure k) - (localResidueDatum k) (localHenselianValuation k) - (separableClosureUnits_isClassFormation k) - T.lowerBase T.lowerTop T.lowerTop_le_lowerBase + 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) := by + (T : LocalFixedFieldNormRestrictionSquare k) := letI := T.upperNormal letI := T.upperFinite letI := upperAbsoluteFinite T - exact - abstractFixedFieldNormResidueSymbol k (SeparableClosure k) - (localResidueDatum k) (localHenselianValuation k) - (separableClosureUnits_isClassFormation k) - T.upperBase T.upperTop T.upperTop_le_upperBase + 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 @@ -549,14 +547,13 @@ noncomputable def normUnits /-- Restriction between the abelianized actual relative Galois groups. -/ noncomputable def abelianizedRestriction - (T : LocalFixedFieldNormRestrictionSquare k) := by + (T : LocalFixedFieldNormRestrictionSquare k) := letI := T.lowerNormal letI := T.upperNormal - exact - 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 + 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 @@ -678,29 +675,27 @@ theorem intermediateAbsoluteFinite /-- The fixed-field norm-residue symbol for the total extension, induced by the canonical local class formation. -/ noncomputable def baseNormResidueSymbol - (T : LocalFixedFieldTransferTower k) := by + (T : LocalFixedFieldTransferTower k) := letI := T.totalNormal letI := T.totalFinite letI := T.baseAbsoluteFinite - exact - abstractFixedFieldNormResidueSymbol k (SeparableClosure k) - (localResidueDatum k) (localHenselianValuation k) - (separableClosureUnits_isClassFormation k) - T.base T.top - (T.top_le_intermediate.trans T.intermediate_le_base) + 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) := by + (T : LocalFixedFieldTransferTower k) := letI := intermediateNormal T letI := intermediateFinite T letI := intermediateAbsoluteFinite T - exact - abstractFixedFieldNormResidueSymbol k (SeparableClosure k) - (localResidueDatum k) (localHenselianValuation k) - (separableClosureUnits_isClassFormation k) - T.intermediate T.top T.top_le_intermediate + 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 @@ -710,13 +705,12 @@ noncomputable def unitsInclusion /-- Transfer between the abelianized actual relative Galois groups. -/ noncomputable def abelianizedTransfer - (T : LocalFixedFieldTransferTower k) := by + (T : LocalFixedFieldTransferTower k) := letI := T.totalNormal letI := T.totalFinite - exact - abstractFixedFieldAbelianizedTransfer k (SeparableClosure k) - T.base T.intermediate T.top - T.top_le_intermediate T.intermediate_le_base + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean index a9a890e265..acf6ac5b18 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Unramified/Cohomology.lean @@ -200,7 +200,7 @@ private theorem integerUnits_herbrandQuotient_eq_one [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 - ∃ hU : HerbrandQuotientDefined Gal(L/K) 𝒪[L]ˣ g, + ∃ _ : HerbrandQuotientDefined Gal(L/K) 𝒪[L]ˣ g, @herbrandQuotient Gal(L/K) 𝒪[L]ˣ _ _ _ (galoisGroupIntegerUnitsMulDistribMulActionOfIsIntegralClosure K L) g = 1 := by diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean index 753e4fe37f..b2dc5b9bd3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFirstIdentity.lean @@ -73,8 +73,8 @@ theorem equalCharacteristicDirectThetaAfterBracketCoefficient_zero rw [equalCharacteristicDirectThetaCoefficient_zero] simpa [equalCharacteristicDirectThetaAfterBracketCoefficient, equalCharacteristicQAdditiveCompositionCoefficient, - equalCharacteristicCompletedDirectBracketCoefficient, - mul_comm] using hsemi.symm + 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean index 43ee70d673..eb19122c98 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/ThetaAtCompletedLevel.lean @@ -142,7 +142,8 @@ noncomputable def equalCharacteristicCompletedLevelCoefficientHom (powerSeriesEquivLaurentInteger (AlgebraicClosure F.residueField)).toRingHom -private noncomputable local instance equalCharacteristicThetaCoefficientUniformSpace +/-- 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⟧) := ⊥ @@ -165,7 +166,7 @@ noncomputable def equalCharacteristicCompletedLevelEvaluation (ha : PowerSeries.HasEval a) : ((AlgebraicClosure F.residueField)⟦X⟧)⟦X⟧ →+* Valued.integer (equalCharacteristicCompletedLevelField F n) := - PowerSeries.eval₂Hom + PowerSeries.eval₂Hom (φ := equalCharacteristicCompletedLevelCoefficientHom F n) (by exact equalCharacteristicCompletedLevelCoefficientHom_continuous F n) ha /-- States the theorem `equalCharacteristicCompletedLevelEvaluation_X`. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean index 0d87cf1a79..2eba84f3c0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/Padic/CompletedChangedUniformizerFixedField.lean @@ -44,7 +44,7 @@ noncomputable def padicCompletedChangedUniformizerFrobeniusAlgEquiv (u : (padicLocalField p).valuationSubringˣ) (n : ℕ) : padicCompletedLevelField p n ≃ₐ[ℚ_[p]] padicCompletedLevelField p n := - AlgEquiv.ofRingEquiv (by + AlgEquiv.ofRingEquiv (f := padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹) (by intro b change padicCompletedUnitFrobeniusLiftEquiv p n u⁻¹ diff --git a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean index c0b855b31b..8a121712fd 100644 --- a/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean +++ b/LeanPool/ClassFieldTheory/GaloisCohomology/Cyclic/Herbrand/Permutation/LatticeHerbrand.lean @@ -871,7 +871,7 @@ theorem ∀ ω : MulAction.orbitRel.Quotient G ι, Fintype (permutationOrbitStabilizer ω) := fun _ => Fintype.ofFinite _ - ∃ h : + ∃ _ : HerbrandQuotientDefined G (Multiplicative L) σ, @herbrandQuotient From 9a2bc40705df6ada374c78fc7c930a9b13bdf9ea Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sat, 26 Sep 2026 09:33:02 +0000 Subject: [PATCH 30/33] Fix class field reciprocity and characteristic instances --- .../ConcreteReciprocityCanonical.lean | 42 +++++++++++++++---- .../DirectThetaAtCompletedLevel.lean | 7 ++-- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean index cdcb02e903..f45d744c83 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityCanonical.lean @@ -174,7 +174,7 @@ theorem finiteGaloisBase_conjugator exact congrArg (fun H : Subgroup (G K) => H.carrier) hs /-- The finite quotient attached to an explicit finite Galois realization. -/ -private noncomputable instance +noncomputable instance finiteGaloisAbstractExtensionOfEmbedding_bundle_finite (i : L →ₐ[K] SeparableClosure K) : Finite ((B K).toSubgroup ⧸ @@ -368,10 +368,20 @@ def finiteGaloisConjugationOfEmbeddings 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 + 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 @@ -526,6 +536,22 @@ def finiteGaloisNormConjugationOfEmbeddings 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 @@ -674,7 +700,8 @@ theorem finiteNormQuotientEquivEmbeddedNormQuotient_finiteNormClass_baseUnit (localNormSubgroup_fieldRange_eq K (SeparableClosure K) L i))) ((MonoidHom.toAdditive (normClass K (AlgHom.fieldRange i))) (Additive.ofMul x)) := by - simp [AG, B, finiteGaloisClosedFixingSubgroupOfEmbedding, + simp [intrinsicAbsoluteUnits, intrinsicAbstractBase, + finiteGaloisClosedFixingSubgroupOfEmbedding, finiteGaloisFieldRangeOfEmbedding] _ = (MonoidHom.toAdditive (normClass K L)) (Additive.ofMul x) := by change Additive.ofMul @@ -893,11 +920,11 @@ theorem finiteNormQuotientEquivEmbeddedNormQuotient_conjugation /-- 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) + {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) + (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)) @@ -923,6 +950,7 @@ theorem concreteReciprocityAddEquivOfEmbedding_eq (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 ⧸ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean index f15a5a65de..aea38fde5a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaAtCompletedLevel.lean @@ -51,12 +51,13 @@ private instance equalCharacteristicDirectThetaCompletedBaseCharP (equalCharacteristicCompletedUnramifiedField F.residueField)).injective F.residueCharacteristic -private instance equalCharacteristicDirectThetaCompletedLevelCharP +/-- 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 := - charP_of_injective_algebraMap + F.residueCharacteristic := by + exact charP_of_injective_algebraMap (algebraMap (equalCharacteristicCompletedUnramifiedField F.residueField) (equalCharacteristicCompletedLevelField F n)).injective F.residueCharacteristic From 702b0053b89035c65580aa3cbe2763c37ff7d4d4 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sat, 26 Sep 2026 10:43:34 +0000 Subject: [PATCH 31/33] fix(ClassFieldTheory): complete canonical instance and module boundaries --- .../AlgebraicNumberTheory/AdeleBaseChange.lean | 4 ++++ .../Idele/Cohomology/SPlaces/Herbrand/Factors.lean | 4 ++-- .../AlgebraicNumberTheory/SUnit/Herbrand.lean | 6 +++--- .../SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean | 2 +- .../LocalReciprocity/ConcreteReciprocityPrimeNorm.lean | 4 ++++ .../LocalReciprocity/FixedFieldContinuousNaturality.lean | 2 +- .../Finite/LocalReciprocity/GeneralTowerNaturality.lean | 2 +- .../Finite/LocalReciprocity/UnramifiedComparison.lean | 3 ++- .../LocalClassFieldTheory/Finite/UnramifiedConductor.lean | 2 +- .../Kummer/LocalHilbertPairingNondegeneracy.lean | 2 +- .../CompletedLevel/DirectBracketAtCompletedLevel.lean | 5 +---- .../CompletedLevel/DirectTargetLevelEmbedding.lean | 5 +---- 12 files changed, 22 insertions(+), 19 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean index 33e3a22615..2bf2525fc6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/AdeleBaseChange.lean @@ -241,6 +241,10 @@ theorem infinitePlaceTensorRingEquivAbove_tmul 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean index 3a5967d8af..3f62c842b0 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/Cohomology/SPlaces/Herbrand/Factors.lean @@ -43,7 +43,7 @@ variable {K L : Type} omit [NumberField L] in open scoped Classical in @[reducible] -private noncomputable def +noncomputable def relativeUnrestrictedSPlaceFactorsActionProvider (S : Finset (HeightOneSpectrum (𝓞 K))) : MulDistribMulAction (L ≃ₐ[K] L) @@ -55,7 +55,7 @@ private noncomputable def omit [NumberField L] in open scoped Classical in @[reducible] -private noncomputable def +noncomputable def relativeUnrestrictedSPlaceLocalBlockFamilyActionProvider (S : Finset (HeightOneSpectrum (𝓞 K))) : MulDistribMulAction (L ≃ₐ[K] L) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean index f4652385c6..aabd0a164f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/SUnit/Herbrand.lean @@ -1151,7 +1151,7 @@ theorem fullLogLattice_herbrandQuotient_eq_stabilizerProduct_div_card (SUnitGroup.LogPlace (K := L) S), Fintype (permutationOrbitStabilizer ω) := fun _ => Fintype.ofFinite _ - ∃ h : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (Multiplicative @@ -1353,7 +1353,7 @@ theorem sUnit_herbrandQuotient_eq_stabilizerProduct_div_card (SUnitGroup.LogPlace (K := L) S), Fintype (permutationOrbitStabilizer ω) := fun _ => Fintype.ofFinite _ - ∃ h : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (SUnitGroup (K := L) S) σ, @@ -1748,7 +1748,7 @@ theorem sUnit_herbrandQuotient_eq_localDegreeProduct_div_card (SUnitGroup.LogPlace (K := L) S), Fintype (permutationOrbitStabilizer ω) := fun _ => Fintype.ofFinite _ - ∃ h : + ∃ _ : HerbrandQuotientDefined (L ≃ₐ[K] L) (SUnitGroup (K := L) S) σ, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 99ba6227f5..7f27780cd1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -30,7 +30,7 @@ namespace GlobalClassFieldTheory.ClassFieldAxiom open scoped Classical in -open _root_.RamificationTheory.HilbertRamification +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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean index f423b7a98a..b5433e87cc 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/ConcreteReciprocityPrimeNorm.lean @@ -33,6 +33,10 @@ 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. diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index b8eac08d84..4842d7b0b6 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -34,7 +34,7 @@ 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. -/ -private local instance abelianizationQuotientTopologicalSpace +local instance abelianizationQuotientTopologicalSpace (G : Type*) [Group G] [TopologicalSpace G] : TopologicalSpace (Abelianization G) := by change TopologicalSpace (G ⧸ commutator G) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean index 29aef09c3f..e971ca9979 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/GeneralTowerNaturality.lean @@ -38,7 +38,7 @@ local notation "towerAbsoluteUnits" => intrinsicAbsoluteUnits local notation "towerAbstractBase" => intrinsicAbstractBase -private def towerLowerEmbedding +def towerLowerEmbedding (K E L : Type) [Field K] [Field E] [Field L] [Algebra K E] [Algebra E L] [Algebra K L] diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean index 07f0323dff..a7c1ac0363 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedComparison.lean @@ -386,7 +386,8 @@ theorem finiteGaloisAbstractUnramifiedFrobenius_eq_arithmeticFrobenius : ((localResidueDatum K).unramifiedFrobenius (finiteResidueAbstractBase K) (finiteGaloisAbstractExtensionOfEmbedding K L i).field - (finiteGaloisAbstractExtensionOfEmbedding K L i).below) = + (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) := diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean index b5466ca9c4..0955cf53c8 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/UnramifiedConductor.lean @@ -120,7 +120,7 @@ theorem card_normQuotient_eq_finrank_of_isAbelianGalois [IsNonarchimedeanLocalField K] [Field L] [Algebra K L] [FiniteDimensional K L] [IsAbelianGalois K L] : letI : Finite (NormQuotient K L) := - normQuotientFiniteOfIsAbelianGalois 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean index 2f39c5d478..e3f0c08d79 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Kummer/LocalHilbertPairingNondegeneracy.lean @@ -139,7 +139,7 @@ theorem localHilbertSymbol_right_kernel · intro h a rw [localHilbertSymbol_skew K n hnK hmu a b, h a, inv_one] -private noncomputable def localHilbertRightPowerClassHom +noncomputable def localHilbertRightPowerClassHom (n : ℕ+) (hnK : ((n : ℕ) : K) ≠ 0) (hmu : (primitiveRoots (n : ℕ) K).Nonempty) (a : Kˣ) : (Kˣ ⧸ (powMonoidHom (n : ℕ) : Kˣ →* Kˣ).range) →* diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean index 4adbce933c..1a38bdd4a3 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectBracketAtCompletedLevel.lean @@ -48,10 +48,7 @@ private instance equalCharacteristicDirectBracketLevelCharP [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 + equalCharacteristicDirectThetaCompletedLevelCharP F n noncomputable local instance equalCharacteristicDirectBracketBaseValuationIsNontrivial (F : LocalField.{u, v} K) : diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean index bf08efa7c0..5f0716d1eb 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectTargetLevelEmbedding.lean @@ -67,10 +67,7 @@ private instance equalCharacteristicDirectTargetLevelCharP [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 + equalCharacteristicDirectThetaCompletedLevelCharP F n /-- The direct analytic target parameter is exactly the image of the changed Laurent uniformizer `uT`. -/ From e3449747fc6b2fe4a0c837ae4183a14cfb246473 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sat, 26 Sep 2026 12:01:24 +0000 Subject: [PATCH 32/33] Fix class field completion and fixed-field elaboration --- .../Idele/ClassGroup/AlgEquiv.lean | 2 +- .../Idele/NormTopology/ExtensionBehavior.lean | 23 +++++++++++++++++-- .../FinitePlaceDecomposition.lean | 1 - .../LubinTateUniformizerDiagonal.lean | 4 ++-- .../FixedFieldContinuousNaturality.lean | 8 +++---- .../LocalReciprocity/FixedFieldLocalData.lean | 8 +++---- .../UnramifiedResidueUniqueness.lean | 1 - .../DirectThetaFrobeniusFixed.lean | 5 +--- 8 files changed, 33 insertions(+), 19 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean index aacb716383..b9024b1170 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/ClassGroup/AlgEquiv.lean @@ -429,7 +429,7 @@ noncomputable def finitePlaceAdicCompletionCongrHom exact finitePlaceAdicCompletionMap K M ((finitePlaceCongr e).symm W) - ⟨W, finitePlaceBelow_eq_finitePlaceCongr_symm e 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. -/ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean index dda8f8d35c..0a53770713 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/AlgebraicNumberTheory/Idele/NormTopology/ExtensionBehavior.lean @@ -43,12 +43,31 @@ private theorem infinitePlaceCompletionMap_isometry Isometry (NumberField.LiesOver.completionMap (v := v₀) (w := W)) := by - unfold NumberField.LiesOver.completionMap - exact + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean index 7f27780cd1..efe5f36b5d 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/SUnitKummerPrimeSelection/FinitePlaceDecomposition.lean @@ -29,7 +29,6 @@ section namespace GlobalClassFieldTheory.ClassFieldAxiom open scoped Classical in - open _root_.HilbertRamification (decompositionGroupRestriction_mem_absoluteValueDecompositionGroup_restrictScalars_iff) in /-- Full relative decomposition above `q` puts every diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean index 1cfc157ede..efb92744a2 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/Existence/LubinTateUniformizerDiagonal.lean @@ -75,8 +75,8 @@ theorem lubinTateLevel_spectral_inertiaDeg_eq_one finiteExtensionSpectralValuation_hasExtension K T letI : (LocalFieldTheory.localCompleteDVF K).valuation.HasExtension - (LocalFieldTheory.localCompleteDVF T).valuation := - explicitLocalCompleteDVFValuation_hasExtension K T + (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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean index 4842d7b0b6..1454f89e4b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldContinuousNaturality.lean @@ -694,12 +694,12 @@ theorem normUnitsMap_toMonoidHom /-- The vertical abelianized restriction arrow as a continuous homomorphism. -/ noncomputable def abelianizedRestrictionMap - (T : LocalFixedFieldNormRestrictionSquare k) := by + (T : LocalFixedFieldNormRestrictionSquare k) := letI := T.lowerNormal letI := T.upperNormal letI := T.upperFinite letI := upperAbsoluteFinite T - exact abstractFixedFieldAbelianizedRestrictionMap + abstractFixedFieldAbelianizedRestrictionMap k (SeparableClosure k) T.lowerBase T.upperBase T.lowerTop T.upperTop T.lowerTop_le_lowerBase T.upperTop_le_upperBase @@ -927,11 +927,11 @@ theorem unitsInclusionMap_toMonoidHom /-- The vertical abelianized transfer arrow as a continuous homomorphism. -/ noncomputable def abelianizedTransferMap - (T : LocalFixedFieldTransferTower k) := by + (T : LocalFixedFieldTransferTower k) := letI := T.totalNormal letI := T.totalFinite letI := T.baseAbsoluteFinite - exact abstractFixedFieldAbelianizedTransferMap + abstractFixedFieldAbelianizedTransferMap k (SeparableClosure k) T.base T.intermediate T.top T.top_le_intermediate T.intermediate_le_base diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 27fad32008..962f77703f 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -43,7 +43,7 @@ open RamificationTheory.HilbertRamification.ValuationSubring local notation "finiteFixedField" => (fun (K : Type) [Field K] (H : FiniteAbstractField (Gal(SeparableClosure K/K))) => - abstractFixedField K (SeparableClosure K) H.field) + 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 @@ -341,7 +341,7 @@ theorem localSeparableDecompositionGroup_eq_top_finiteExtensionEquiv simpa [sigmaF, AlgEquiv.autCongr_apply] using hx.to_iff @[implicit_reducible] -private noncomputable def finiteExtensionDecompositionResidueFintype +noncomputable def finiteExtensionDecompositionResidueFintype (K F : Type) [Field K] [ValuativeRel K] [TopologicalSpace K] [IsNonarchimedeanLocalField K] @@ -1142,7 +1142,7 @@ private theorem finite_absoluteFixingQuotient_fieldRange (Equiv.cast (congrArg Q hBase)) /-- A semilinear equivalence transports automorphisms fixing the corresponding base fields. -/ -private def semilinearGaloisTransport +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)) @@ -1184,7 +1184,7 @@ theorem extensionSubgroup (baseField (Gal(SeparableClosure K/K))) H₀ (le_baseField H₀)) := - finite_absoluteFixingQuotient_fieldRange K F i + by exact finite_absoluteFixingQuotient_fieldRange K F i let H : FiniteAbstractField (Gal(SeparableClosure K/K)) := ⟨H₀, hHabsolute⟩ diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean index fb2a56c8a7..1faf99361b 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/UnramifiedResidueUniqueness.lean @@ -44,7 +44,6 @@ private noncomputable instance : Module.Finite 𝒪[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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean index cff382da08..f16d307c90 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/DirectThetaFrobeniusFixed.lean @@ -46,10 +46,7 @@ private instance equalCharacteristicDirectThetaFixedLevelCharP [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 + equalCharacteristicDirectThetaCompletedLevelCharP F n /-- The Laurent-series base acts on the completed unramified field through the coefficient embedding. -/ From 69947d5ac91499c20e1a52003926a2fd3ac2f6a4 Mon Sep 17 00:00:00 2001 From: Vasily Ilin Date: Sun, 27 Sep 2026 21:58:44 +0000 Subject: [PATCH 33/33] Repair class field theory proof elaboration and public instances --- .../IdelePowerLocalUnitNormContainment.lean | 1 - .../IdeleClassHerbrandSupportedFinal.lean | 8 ++++---- .../GlobalClassFields/SUnitKummerNormCore.lean | 1 - .../Reciprocity/HilbertFamilyAlgEquiv.lean | 7 ++++--- .../Reciprocity/IdeleClassDirectLimitCore.lean | 12 ++++++++++-- .../LocalReciprocity/FixedFieldLocalData.lean | 15 +++++++++------ .../CompletedFrobeniusFixedFieldPrimitive.lean | 5 +---- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean index c578b7abc1..e0245be181 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/ClassFieldAxiom/IdelePowerLocalUnitNormContainment.lean @@ -489,7 +489,6 @@ private theorem unit_mem_power_range_of_ideleClassNorm_top 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean index 2f5aea28c2..3543e997b5 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Cohomology/IdeleClassHerbrandSupportedFinal.lean @@ -188,7 +188,7 @@ theorem letI := relativeOutsideSPlaceFactorsAction (K := K) (L := L) S - ∃ h : + ∃ _h : HerbrandQuotientDefined (L ≃ₐ[K] L) (RelativeOutsideSPlaceFactors @@ -257,7 +257,7 @@ theorem letI := relativeIdeleLocalTensorDecompositionSupportedSubgroupAction (K := K) (L := L) S - ∃ h : + ∃ _h : HerbrandQuotientDefined (L ≃ₐ[K] L) (relativeIdeleLocalTensorDecompositionSupportedSubgroup @@ -1197,7 +1197,7 @@ theorem (finitePlacesAbove (K := K) (L := L) S)) σ = q / (Fintype.card (L ≃ₐ[K] L) : ℚ)) : letI := ideleClassMulDistribMulAction K L - ∃ hC : + ∃ _hC : HerbrandQuotientDefined (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) σ, @@ -1431,7 +1431,7 @@ theorem ChosenFinitePlaceIsUnramified (K := K) (L := L) w) : letI := ideleClassMulDistribMulAction K L - ∃ hC : + ∃ _hC : HerbrandQuotientDefined (L ≃ₐ[K] L) (RelativeIdeleGroup.ClassGroup K L) σ, diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean index 3b6d64b678..e1f6a9db16 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/GlobalClassFields/SUnitKummerNormCore.lean @@ -194,7 +194,6 @@ private theorem unit_mem_power_range_of_surjective 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean index 13ab6edc94..839339822a 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/HilbertFamilyAlgEquiv.lean @@ -131,9 +131,10 @@ theorem globalHilbertPairingFamilyCongr_hasFiniteSupport (fun v : HeightOneSpectrum (𝓞 F) => er (GlobalHilbertPairingFamily.finiteFactor F BF hmuF v (eu.symm a) (eu.symm b))) := - (hBF (eu.symm a) (eu.symm b)).fun_comp (map_one er) - have hreindex := hsource.fun_comp_of_injective - (finitePlaceCongr e).symm.injective + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean index ef404289fb..414c05d9de 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/GlobalClassFieldTheory/Reciprocity/IdeleClassDirectLimitCore.lean @@ -278,7 +278,14 @@ theorem RelativeIdeleGroup.conjugation_tmul] congr 1 | add x y hx hy => - simp only [map_add, 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. -/ @@ -367,7 +374,8 @@ theorem rationalRelativeIdeleClassEmbedding_comp (IntermediateField.inclusion hFH) (IntermediateField.inclusion hEF) c _ = _ := congrArg (fun f => RelativeIdeleGroup.classEmbedding f c) hinc -private noncomputable instance : +/-- Scalar extension forms the directed system used by the rational idele-class limit. -/ +noncomputable instance rationalRelativeIdeleClassDirectedSystem : DirectedSystem (fun E : FiniteGaloisIntermediateField ℚ (SeparableClosure ℚ) => RelativeIdeleGroup.ClassGroup ℚ E) diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean index 962f77703f..35d62cee61 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LocalClassFieldTheory/Finite/LocalReciprocity/FixedFieldLocalData.lean @@ -1015,8 +1015,12 @@ private theorem residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEq (abstractSubgroupEquivGaloisGroup K (SeparableClosure K) H.field).apply_symm_apply (AlgEquiv.autCongr e sigma) - rw [localAbstractFixedResidueAction_apply K H.field sigmaH] - rw [hsigmaH] + 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 @@ -1094,10 +1098,9 @@ theorem localResidueDegree_eq_normalizedDegree_abstractFixedFieldEquiv (AlgEquiv.autCongr e sigma)) := localResidueDegree_eq_residueAbsoluteDegreeIn_finiteExtensionEquiv K F j e sigma - rw [hlocal] - exact - residueAbsoluteDegreeIn_eq_normalizedDegree_abstractFixedFieldEquiv - K H e sigma htop tau hTau + 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 diff --git a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean index 16ec34a735..17b62a54e1 100644 --- a/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean +++ b/LeanPool/ClassFieldTheory/ClassFieldTheory/LubinTate/EqualCharacteristic/CompletedLevel/CompletedFrobeniusFixedFieldPrimitive.lean @@ -49,10 +49,7 @@ instance equalCharacteristicCompletedFrobeniusIdentificationLevelCharP [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 + equalCharacteristicDirectThetaCompletedLevelCharP F n private theorem equalCharacteristicDirectTargetCompletedPrimitivePolynomial_eq (F : LocalField.{u, v} K)